InternVL2是由上海人工智能实验室OpenGVLab发布的一款多模态大模型,中文名称为“书生·万象”。该模型在多学科问答(MMMU)等任务上表现出色,并且具备处理多种模态数据的能力。
本文将通过走马观花的方式,基于InternVL2家族中最小的InternVL2-1B模型来介绍其技术特点。同时也将分享基于爱芯元智的AX650N、AX630C两款端侧AI芯片适配InternVL2-1B的基本操作方法,向业界对端侧多模态大模型部署的开发者提供一种新的思路,促进社区对端侧多模态大模型的探索。
经常在AI芯片上部署AI算法模型的同学都知道,想要把模型部署到芯片上的NPU中运行,都需要使用芯片原厂提供的NPU工具链,这里我们使用的是Pulsar2。
Pulsar2是爱芯元智的新一代NPU工具链,包含模型转换、离线量化、模型编译、异构调度四合一超强功能,进一步强化了网络模型高效部署的需求。在针对第三代、第四代NPU架构进行了深度定制优化的同时,也扩展了算子&模型支持的能力及范围,对Transformer结构的网络也有较好的支持。
从Pulsar2 3.2版本开始,已经增加了大语言模型编译的功能,隐藏在pulsar2 llm_build的子命令中。
具体使用方式请参考:https://pulsar2-docs.readthed...
git clone https://github.com/AXERA-TECH/ax-llm-build.git
cd ax-llm-build
pip install -U huggingface_hub
huggingface-cli download --resume-download OpenGVLab/InternVL2-1B/ --local-dir OpenGVLab/InternVL2-1B/
ax-llm-build:用于暂存编译LLM、VLM时所依赖的各种辅助小工具、脚本文件(持续更新)。
qtang@gpux2:~/huggingface$ pulsar2 llm_build --input_path OpenGVLab/InternVL2-1B/ --output_path OpenGVLab/InternVL2-1B-ax650 --kv_cache_len 1023 --hidden_state_type bf16 --prefill_len 128 --chip AX650
Config(
model_name='InternVL2-1B',
model_type='qwen2',
num_hidden_layers=24,
num_attention_heads=14,
num_key_value_heads=2,
hidden_size=896,
intermediate_size=4864,
vocab_size=151655,
rope_theta=1000000.0,
max_position_embeddings=32768,
rope_partial_factor=1.0,
rms_norm_eps=1e-06,
norm_type='rms_norm',
hidden_act='silu',
hidden_act_param=0.03,
scale_depth=1.4,
scale_emb=1,
dim_model_base=256,
origin_model_type='internvl_chat'
)
2024-10-31 00:36:30.400 | SUCCESS | yamain.command.llm_build:llm_build:109 - prepare llm model done!
building vision model ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1/1 0:02:24
building llm decode layers ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 24/24 0:05:13
building llm post layer ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1/1 0:01:27
2024-10-31 00:45:36.175 | SUCCESS | yamain.command.llm_build:llm_build:185 - build llm model done!
2024-10-31 00:45:51.955 | SUCCESS | yamain.command.llm_build:llm_build:364 - check
chmod +x ./tools/fp32_to_bf16
chmod +x ./tools/embed_process.sh
./tools/embed_process.sh OpenGVLab/InternVL2-1B/ OpenGVLab/InternVL2-1B-ax650
最终InternVL2-1B-ax650目录下包含以下内容:
qtang@gpux2:~/huggingface$ tree -lh OpenGVLab/InternVL2-1B-ax650/
[1.6K] OpenGVLab/InternVL2-1B-ax650/
├── [325M] intervl_vision_part_224.axmodel // vit-l model
├── [259M] model.embed_tokens.weight.bfloat16.bin // embed file
├── [ 16M] qwen2_p128_l0_together.axmodel // llm layer
├── [ 16M] qwen2_p128_l10_together.axmodel
├── [ 16M] qwen2_p128_l11_together.axmodel
├── [ 16M] qwen2_p128_l12_together.axmodel
......
├── [ 16M] qwen2_p128_l5_together.axmodel
├── [ 16M] qwen2_p128_l6_together.axmodel
├── [ 16M] qwen2_p128_l7_together.axmodel
├── [ 16M] qwen2_p128_l8_together.axmodel
├── [ 16M] qwen2_p128_l9_together.axmodel
└── [141M] qwen2_post.axmodel
为了方便大家快速试用,我们在网盘中已经提供好了预编译模型和基于AX650N、AX630C两种芯片平台的预编译示例:
百度网盘
AX630C:
https://pan.baidu.com/s/1X0aJ...
AX650N:
https://pan.baidu.com/s/1_LG-...
文件名 | 描述 |
---|---|
run_internelvl2.sh | 运行脚本 |
main_internvl | 主程序 |
internvl | 文件夹,包含预编译好的模型文件和embed文件 |
internvl_tokenizer.py | 基于transformer库的tokenizer解析服务 |
readme.txt | 上板运行使用说明和注意事项 |
基于AX650N,展示输入图片尺寸为448*448的示例,图片信息量大,解读更详细,甚至展示了其OCR、中英翻译的能力。
基于AX630C,展示输入图片尺寸为224*224的示例:
目前我们暂时未对Vision Part模块的ViT-L模型进行量化加速,所以图片编码的速度稍微有点慢。但是本身AX650N、AX630C计算ViT模型的效率是非常高的,后续我们会持续优化推理耗时。
输入图片越大,Vision Part(Image Encoder)生成的特征向量越多,计算量越大,即使是InternVL2 Family中最小的1B版本,其Vision Part也是采用的基于ViT-Large规模的图像编码模型。
图片生成的特征向量越多,输入LLM的prompt就越长,input tokens越多,TTFT耗时越大。
Model Name | Vision Part | Language Part | HF Link | MS Link |
---|---|---|---|---|
InternVL2‑1B | InternViT‑300M‑448px | Qwen2‑0.5B‑Instruct | 🤗 link | 🤖 link |
InternVL2‑2B | InternViT‑300M‑448px | internlm2‑chat‑1‑8b | 🤗 link | 🤖 link |
InternVL2‑4B | InternViT‑300M‑448px | Phi‑3‑mini‑128k‑instruct | 🤗 link | 🤖 link |
InternVL2‑8B | InternViT‑300M‑448px | internlm2_5‑7b‑chat | 🤗 link | 🤖 link |
InternVL2‑26B | InternViT‑6B‑448px‑V1‑5 | internlm2‑chat‑20b | 🤗 link | 🤖 link |
InternVL2‑40B | InternViT‑6B‑448px‑V1‑5 | Nous‑Hermes‑2‑Yi‑34B | 🤗 link | 🤖 link |
InternVL2-Llama3-76B | InternViT‑6B‑448px‑V1‑5 | Hermes‑2‑Theta‑Llama‑3‑70B | 🤗 link | 🤖 link |
我们顺便统计了224与448两种输入尺寸采用U8、U16量化后的推理耗时,提升还是很明显。
Model | Input Size | 量化精度 | 计算量 | AX650N | AX630C |
---|---|---|---|---|---|
ViT-300M | 1,3,224,224 | U8 | 162GOPs | 25ms | 145ms |
ViT-300M | 1,3,224,224 | U16 | 162GOPs | 49ms | 290ms |
ViT-300M | 1,3,448,448 | U8 | 724GOPs | 140ms | 737ms |
ViT-300M | 1,3,448,448 | U16 | 724GOPs | 347ms | TBD |
虽然我们只尝试了最小的InternVL2-1B部署,但能在原本定位于低成本家用摄像头芯片(AX630C)上本地流畅运行VLM已经是一个重大突破,例如无需联网(包括蓝牙)的智能眼镜、智能的“拍立得”、以及各种有趣的穿戴设备。
随着大语言模型小型化的快速发展,越来越多有趣的多模态AI应用已经从云端服务迁移到端侧设备。我们会紧跟行业最新动态,适配更多的端侧大模型,欢迎大家持续关注。