作者:楊亦誠,英特爾 AI 軟體工程師;盧建暉,微軟高階雲端技術佈道師
近期微軟(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)[0]
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, [image], 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)

Phi-3.5-vision輸出範例
可以看到在理解拼圖內容後,Phi-3-vision為我們生成了一段Python腳本來複現拼圖資料。
3. 視訊內容理解
由於Phi-3.5-vision可以同時支援對多個影像輸入,因此可以根據此一特性實現視訊內容理解,實現方法也特別簡單,僅需對視訊檔抽幀後保存為圖片,並將這些圖片根據Phi-3.5-vision提供的預處理腳本合併後,轉化為Prompt範本,送入模型流水線進行推論。
images = []
placeholder = ""
for i in range(1,4):
with open("../examples/output/keyframe_"+str(i)+".jpg", "rb") as f:
images.append(Image.open("../examples/output/keyframe_"+str(i)+".jpg"))
placeholder += f"<|image_{i}|>\n"
from transformers import AutoProcessor, TextStreamer
messages = [
{"role": "user", "content": placeholder+"Summarize the video."},
]
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, images, return_tensors="pt")
generation_args = {"max_new_tokens": 500, "do_sample": False, "streamer": TextStreamer(processor.tokenizer, skip_prompt=True, skip_special_tokens=True)}print("Summary:")
generate_ids = model.generate(**inputs, eos_token_id=processor.tokenizer.eos_token_id, **generation_args)
總結
透過OpenVINO封裝後的API函數,開發者可以非常方便地對預訓練模型進行轉化壓縮,並實現當地語系化的推論任務部署。同時基於Phi-3.5在小語言模型場景下強大的文字與影像理解能力,在輕薄型筆電上就能構建起一個完整的語言模型應用,在保護使用者資料隱私的同時,降低硬體門檻。
參考資料
- Optimum-intel: https://docs.openvino.ai/2024/learn-openvino/llm_inference_guide/llm-inference-hf.html
- OpenVINO Gen API: https://docs.openvino.ai/2024/learn-openvino/llm_inference_guide/genai-guide.html
- 輕薄型筆電OK!利用OpenVINO部署Phi-3.5「全家餐」 - 2024/09/20
- LangChain框架已正式支援OpenVINO! - 2024/06/12
- 如何在Windows平台呼叫NPU部署深度學習模型 - 2024/03/04
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!