近期微軟(Microsoft)發佈了最新的Phi-3.5系列SLM模型:Phi-3.5-mini、Phi-3.5-vision以及Phi-3.5-MoE。其中Phi-3.5-mini增加了多語種以及128k上下文長度的支援,提升中文輸入的使用體驗;Phi-3.5-vision全面支援多圖片理解任務,拓寬了其在視訊理解任務類中的應用場景。
英特爾(Intel)的AI PC可以幫助使用者利用人工智慧技術提高工作效率、創意、遊戲、娛樂和安全等性能。它搭載CPU、GPU和NPU,可在本地以更高效率處理AI任務。其中我們可以仰賴CPU運作較小的工作負載並實現低延遲,而GPU則非常適合需要平行輸送量的大型工作負載,例如大語言模型推論任務,NPU則能以低功耗處理持續運作AI工作負載,提高效率。開發者可以利用英特爾OpenVINO工具套件充分利用這些AI處理單元,更高效率部署深度學習模型。
Phi-3.5就是一個非常適合在AI PC上運作的模型任務。本文將分享如何利用OpenVINO在你的AI PC上部署最新Phi-3.5-mini及Phi-3.5-vision模型。
範例連結:https://github.com/openvino-dev-samples/Phi-3-workshop
phi-3cookbook:https://aka.ms/phi-3cookbook
Phi-3.5-mini
1. 模型轉換與量化
由於Phi-3.5的預訓練模型是以PyTorch框架為基礎,我們可以利用Optimum-intel的命令行工具快速從Hugging Face上匯出Phi-3.5-mini的預訓練模型,並透過內建NNCF工具對模型進行權重量化壓縮,以此提升推理性能,降低資源佔用。
optimum-cliexport openvino--model microsoft/Phi-3.5-mini-instruct --task text-generation-with-past--weight-format int4--group-size 128--ratio 0.6--sym--trust-remote-code phi-3.5-mini-instruct-ov
開發者可以根據模型的輸出結果,調整其中的量化參數,包括:
- weight-format:量化精度,可以選擇 fp32、fp16、int8、int4、int4_sym_g128、int4_asym_g128、int4_sym_g64、int4_asym_g64。
- group-size:權重裡共用量化參數的通道數量。
- ratio:int4/int8權重比例,預設為1.0,0.6表示60%的權重以int4表示,40%以int8表示。
- sym:是否開啟對稱量化。
更多參數選項可以透過optimum-cli export openvino -h命令查詢。
2. Optimum-intel部署
為了方便Transformers程式庫使用者戶體驗 OpenVINO,開發者可以利用Optimum-intel所提供的類Transformers API進行模型任務部署。在不改變原本程式碼邏輯的前提下,只需要將AutoModelForCausalLM 物件切換為OVModelForCausalLM,就可以輕鬆實現對於推論後端的遷移,利用OpenVINO來加速 Phi-3.5-mini 原有的 Pipeline。
from optimum.intel.openvino import OVModelForCausalLM
from transformers import AutoConfig, AutoTokenizer
ov_model = OVModelForCausalLM.from_pretrained(
llm_model_path,
device='GPU',
config=AutoConfig.from_pretrained(llm_model_path, trust_remote_code=True),
trust_remote_code=True,
)
tok = AutoTokenizer.from_pretrained(llm_model_path, trust_remote_code=True)
prompt = "<|user|>\n你了解 .NET 嗎?\n<|end|><|assistant|>\n"
input_tokens = tok(prompt, return_tensors="pt", **tokenizer_kwargs)
answer = ov_model.generate(**input_tokens, max_new_tokens=1024)
tok.batch_decode(answer, skip_special_tokens=True)
3. GenAI API部署
當然,考量到Transformers中大量的第三方依賴項,如果開發者想實現輕量化部署的目的,也可以利用OpenVINO原生的GenAI API來構建推論任務,由於GenAI API底層的pipeline是基於C++構建,同時最佳了chat模式下kvcache的緩衝記憶體邏輯,相較Optimum-intel,GenAI API 的資源佔用和性能更好。
import openvino_genai as ov_genai
pipe = ov_genai.LLMPipeline(llm_model_path, "GPU")
可以看到在使用GenAI API的情況下,我們僅用3行程式碼就構建起了一個完整的文字生成任務 Pipeline。
Phi-3.5-vision
1. 模型轉換與量化
目前Phi-3.5-vision的推論任務還沒有被完全整合進Optimum工具中,因此我們需要手動完成模型的轉換和量化,其中包含語言模型lang_model,影像編碼模型image_embed,token編碼模型embed_token,以及影像特徵映射模型img_projection。
為了簡化轉換步驟,我們提前對這些轉換任務行進行了封裝,開發者只需要呼叫範例中提供的函數就能完成這些模型的轉換,並對其中負載最大的語言模型進行量化。
from ov_phi3_vision import convert_phi3_model
model_id = "microsoft/Phi-3.5-vision-instruct"
out_dir = Path("../model/phi-3.5-vision-instruct-ov")
compression_configuration = {
"mode": nncf.CompressWeightsMode.INT4_SYM,
"group_size": 64,
"ratio": 0.6,
}
if not out_dir.exists():
convert_phi3_model(model_id, out_dir, compression_configuration)
2. 圖片內容理解
此外在該範例中,我們也對模型的推論任務進行封裝,透過以下程式碼便可快速部署圖片理解任務。
from transformers import AutoProcessor, TextStreamer
messages = [
{"role": "user", "content": "<|image_1|>\nPlease create Python code for image, and use plt to save the new picture under imgs/ and name it phi-3-vision.jpg."},
]
processor = AutoProcessor.from_pretrained(out_dir, trust_remote_code=True)
prompt = processor.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(prompt, , return_tensors="pt")
generation_args = {"max_new_tokens": 3072, "do_sample": False, "streamer": TextStreamer(processor.tokenizer, skip_prompt=True, skip_special_tokens=True)}
print("Coding:")
generate_ids = model.generate(**inputs, eos_token_id=processor.tokenizer.eos_token_id, **generation_args)
只需不到短短一分鐘...
輸入您的信箱與ID註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏