AI 开放平台

提供适配不同硬件平台的AI模型,探索更多端侧与边缘侧场景应用

基于AX650N/AX630C部署多模态大模型InternVL2-1B

InternVL2是由上海人工智能实验室OpenGVLab发布的一款多模态大模型,中文名称为“书生·万象”。该模型在多学科问答(MMMU)等任务上表现出色,并且具备处理多种模态数据的能力。

本文将通过走马观花的方式,基于InternVL2家族中最小的InternVL2-1B模型来介绍其技术特点。同时也将分享基于爱芯元智的AX650N、AX630C两款端侧AI芯片适配InternVL2-1B的基本操作方法,向业界对端侧多模态大模型部署的开发者提供一种新的思路,促进社区对端侧多模态大模型的探索。

InternVL2-1B

技术特性

internvl2

  • 多模态处理能力:与更大规模的版本一样,InternVL2-1B支持图像和文本数据的联合处理,旨在理解和生成跨模态的内容。
  • 轻量化设计:1B参数规模意味着相对较小的模型尺寸,这使得InternVL2-1B更适合部署在资源受限的环境中,如移动设备或边缘计算场景中。尽管参数较少,通过精心设计,它仍能保持良好的性能。
  • 渐进式对齐训练策略:采用从小到大、从粗到精的方式进行训练,这样可以利用更少的计算资源达到较高的效果,同时也促进了模型的知识迁移能力。
  • 高效的架构设计:为了在有限的参数下实现最佳性能,InternVL2-1B可能采用了特别优化的网络结构或注意力机制,确保即使在较低参数量的情况下也能有效地捕捉复杂的视觉语言关联性。
  • 支持多种下游任务:尽管是较小型号,InternVL2-1B应该仍然能够执行一系列基本的视觉-语言任务,比如图像描述生成、视觉问答等,为用户提供了一定程度的功能多样性。
  • 开放源代码与模型权重:如果遵循OpenGVLab的一贯做法,那么InternVL2-1B的代码及预训练模型应该也是开源提供的,方便研究者和开发者使用。

性能指标

internvl2-perf

internvl2-perf2

模型转换

经常在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

embed提取和优化

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、中英翻译的能力。

internvl2_640

internvl2_448_result

小尺寸

基于AX630C,展示输入图片尺寸为224*224的示例:

internvl2_224_result

目前我们暂时未对Vision Part模块的ViT-L模型进行量化加速,所以图片编码的速度稍微有点慢。但是本身AX650N、AX630C计算ViT模型的效率是非常高的,后续我们会持续优化推理耗时。

部署优化探讨

输入图片越大,Vision Part(Image Encoder)生成的特征向量越多,计算量越大,即使是InternVL2 Family中最小的1B版本,其Vision Part也是采用的基于ViT-Large规模的图像编码模型。

图片生成的特征向量越多,输入LLM的prompt就越长,input tokens越多,TTFT耗时越大。

Model NameVision PartLanguage PartHF LinkMS Link
InternVL2‑1BInternViT‑300M‑448pxQwen2‑0.5B‑Instruct🤗 link🤖 link
InternVL2‑2BInternViT‑300M‑448pxinternlm2‑chat‑1‑8b🤗 link🤖 link
InternVL2‑4BInternViT‑300M‑448pxPhi‑3‑mini‑128k‑instruct🤗 link🤖 link
InternVL2‑8BInternViT‑300M‑448pxinternlm2_5‑7b‑chat🤗 link🤖 link
InternVL2‑26BInternViT‑6B‑448px‑V1‑5internlm2‑chat‑20b🤗 link🤖 link
InternVL2‑40BInternViT‑6B‑448px‑V1‑5Nous‑Hermes‑2‑Yi‑34B🤗 link🤖 link
InternVL2-Llama3-76BInternViT‑6B‑448px‑V1‑5Hermes‑2‑Theta‑Llama‑3‑70B🤗 link🤖 link

我们顺便统计了224与448两种输入尺寸采用U8、U16量化后的推理耗时,提升还是很明显。

ModelInput Size量化精度计算量AX650NAX630C
ViT-300M1,3,224,224U8162GOPs25ms145ms
ViT-300M1,3,224,224U16162GOPs49ms290ms
ViT-300M1,3,448,448U8724GOPs140ms737ms
ViT-300M1,3,448,448U16724GOPs347msTBD

结束语

虽然我们只尝试了最小的InternVL2-1B部署,但能在原本定位于低成本家用摄像头芯片(AX630C)上本地流畅运行VLM已经是一个重大突破,例如无需联网(包括蓝牙)的智能眼镜、智能的“拍立得”、以及各种有趣的穿戴设备。

随着大语言模型小型化的快速发展,越来越多有趣的多模态AI应用已经从云端服务迁移到端侧设备。我们会紧跟行业最新动态,适配更多的端侧大模型,欢迎大家持续关注。