引言
年初,Deepseek引領(lǐng)了一波本地部署大語言模型的浪潮,本地部署模型意義之一在于可以有效保護數(shù)據(jù)隱私。相較于文本數(shù)據(jù),圖像數(shù)據(jù)通常包含更多敏感信息,因此對于視覺模型而言,本地部署顯得更為重要。
本文將介紹在華碩IOT PE1100N嵌入式終端(Jetson Orin NX 16G) 上,本地部署和運行通義千問最新發(fā)布的Qwen2.5-VL-3B-Instruct視覺大模型。
本機環(huán)境
在終端通過jtop指令,可以獲取到本機的基本信息,其中有幾項信息本文需重點關(guān)注:
處理器架構(gòu):aarch64Python版本:3.10.12Jetpack版本:6.0CUDA版本:12.2.140
基礎(chǔ)環(huán)境搭建
安裝最新Transformers框架
pip install git+https://github.com/huggingface/Transformers accelerate
此步驟,阿里推薦使用源碼編譯安裝的方式,是為了確保安裝最新的Transformers框架,以便導(dǎo)入最新的qwen2_5_vl模塊。
安裝qwen-vl-utils工具
pip install qwen-vl-utils==0.0.8
安裝運算庫
sudo apt-get install libopenblas-base libopenmpi-dev libomp-dev
安裝modelscope
pip install modelscope
本文中,modelscope主要用于模型的高速下載。
專有環(huán)境搭建
PE1100N終端搭載的是Jetson Orin NX模組,具備GPU加速能力,因此一些AI相關(guān)的關(guān)鍵組件,需要安裝與平臺適配的編譯版本。由于平臺架構(gòu)是aarch64,而非常見的x86_64架構(gòu),因此組件的官方github倉庫通常不會為該平臺編譯發(fā)布可執(zhí)行文件。對此,一般有兩種解決方法:
下載源碼,本機自行編譯安裝找找是否有好心人在同平臺編譯好了whl,直接下載安裝
本文選擇第二種,牢記下面這個網(wǎng)址,它提供了Jetson平臺,不同Jetpack版本,不同CUDA版本,編譯好的whl。
網(wǎng)址:https://pypi.jetson-ai-lab.dev/
根據(jù)本機的Jetpack 6.0/CUDA 12.2環(huán)境,找到對應(yīng)/jp6/cu122
的入口,里面常用的組件均已編譯提供:
缺少相關(guān)組件時,優(yōu)先在該目錄查找是否存在對應(yīng)的whl文件。如果存在,直接下載到本地,然后通過pip指令進行安裝。
安裝torch
pip install --no-cache /home/asusiot/lc/torch-2.4.0-cp310-cp310-linux_aarch64.whl
在終端,通過下面三行指令,驗證torch是否可以識別到cuda:
python
>>> import torch
>>> torch.cuda.is_available()
安裝torchvision
pip install --no-cache /home/asusiot/lc/torchvision-0.19.0a0+48b1edf-cp310-cp310-linux_aarch64.whl
安裝triton
pip install --no-cache /home/asusiot/lc/triton-3.1.0-cp310-cp310-linux_aarch64.whl
安裝flash_attn
安裝flash_attn過程比較曲折,我發(fā)現(xiàn)安裝/jp6/cu122
目錄下的flash_attn-2.5.7,無法正常運行,報如下錯誤:
于是我嘗試下載安裝jp6/cu126
目錄下的flash-attn-2.7.2.post1,可以正常運行。
pip install --no-cache /home/asusiot/lc/flash_attn-2.7.2.post1-cp310-cp310-linux_aarch64.whl
如果運行時還提示缺少某些組件,參照上述方法,進行安裝補全即可。
推理代碼
import torch
from transformers import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
from modelscope import snapshot_download
model_dir = snapshot_download("Qwen/Qwen2.5-VL-3B-Instruct")
## default: Load the model on the available device(s)
#model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
# model_dir, torch_dtype=torch.bfloat16, device_map="auto"
#)
# We recommend enabling flash_attention_2 for better acceleration and memory saving, especially in multi-image and video scenarios.
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
model_dir,
torch_dtype=torch.bfloat16,
attn_implementation="flash_attention_2",
device_map="auto",
)
# default processer
processor = AutoProcessor.from_pretrained(model_dir)
# The default range for the number of visual tokens per image in the model is 4-16384.
# You can set min_pixels and max_pixels according to your needs, such as a token range of 256-1280, to balance performance and cost.
# min_pixels = 256*28*28
# max_pixels = 1280*28*28
# processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-3B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": "/home/asusiot/lc/qwen25vl/demo.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20",
},
{"type": "text", "text": "你看到了什么"},
],
}
]
# Preparation for inference
text = processor.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
text=[text],
images=image_inputs,
videos=video_inputs,
padding=True,
return_tensors="pt",
)
inputs = inputs.to("cuda")
# Inference: Generation of the output
generated_ids = model.generate(**inputs, max_new_tokens=128)
generated_ids_trimmed = [
out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)
代碼首次運行時,會自動從modelscope下載模型文件到本地。
運行效果
沒錯,正如模型所描述的,該照片是我在成都西嶺雪山景點的一個隨拍。簡單測試了一下,不同分辨率、不同信息量的圖片,模型推理時間從幾秒到十幾秒不等。當然,這是未經(jīng)量化處理的模型。
小結(jié)
本文在華碩IOT-PE1100N嵌入式終端(Jetson Orin NX 16G) 上,實際部署和運行了視覺大模型Qwen2.5-VL-3B-Instruct,該部署方法同樣適用于其它搭載Jetson模組的嵌入式終端,也可為其它視覺模型的部署提供參考。另外,本文部署運行的是原始模型文件,未做特別的優(yōu)化處理。后續(xù),可以考慮通過模型量化等方式提升推理速度,并進一步降低內(nèi)存占用。
最后,感謝華碩IOT對本文提供的硬件支持!
更多信息,請關(guān)注公眾號“ETRD”獲取。