|

輕薄型筆電OK!利用OpenVINO部署Phi-3.5「全家餐」

   
作者:楊亦誠,英特爾 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-3cookbookhttps://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註冊即可享有一切福利!

會員福利
1

免費電子報

2

會員搶先看

3

主題訂閱

4

好文收藏

楊亦誠

Author: 楊亦誠

現任英特爾 AI 軟體工程師

Share This Post On

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *