基于AX650N/AX630C部署多模态大模型InternVL2-1B
本文来自社区投稿,作者:圈圈虫
原文链接:https://zhuanlan.zhihu.com/p/4118849355
InternVL2 是由上海人工智能实验室 OpenGVLab 发布的一款多模态大模型,中文名称为“书生·万象”。该模型在多学科问答(MMMU)等任务上表现出色,并且具备处理多种模态数据的能力。
本文将基于 InternVL2 家族中最小的 InternVL2-1B 模型来介绍其技术特点。同时也将分享基于 爱芯元智 的 AX650N、AX630C 两款端侧 AI 芯片适配 InternVL2-1B 的基本操作方法,向业界对端侧多模态大模型部署的开发者提供一种新的思路,促进社区对端侧多模态大模型的探索。
InternVL2-1B
GitHub 地址:
https://github.com/OpenGVLab/InternVL
官方博客:
https://internvl.github.io/blog/2024-07-02-InternVL-2.0
在线 DEMO:
https://internvl.opengvlab.com
技术特性
-
多模态处理能力:与更大规模的版本一样,InternVL2-1B 支持图像和文本数据的联合处理,旨在理解和生成跨模态的内容
-
轻量化设计:1B 参数规模意味着相对较小的模型尺寸,这使得 InternVL2-1B 更适合部署在资源受限的环境中,如移动设备或边缘计算场景中。尽管参数较少,通过精心设计,它仍能保持良好的性能
-
渐进式对齐训练策略:采用从小到大、从粗到精的方式进行训练,这样可以利用更少的计算资源达到较高的效果,同时也促进了模型的知识迁移能力
-
高效的架构设计:为了在有限的参数下实现最佳性能,InternVL2-1B 可能采用了特别优化的网络结构或注意力机制,确保即使在较低参数量的情况下也能有效地捕捉复杂的视觉语言关联性
-
支持多种下游任务:尽管是较小型号,InternVL2-1B 应该仍然能够执行一系列基本的视觉-语言任务,比如图像描述生成、视觉问答等,为用户提供了一定程度的功能多样性
-
开放源代码与模型权重:如果遵循 OpenGVLab 的一贯做法,那么 InternVL2-1B 的代码及预训练模型应该也是开源提供的,方便研究者和开发者使用
性能指标
AX650N
爱芯元智第三代高能效比智能视觉芯片 AX650N。集成了八核 Cortex-A55 CPU,高能效比 NPU,支持 8K@30fps 的 ISP,以及 H.264、H.265 编解码的 VPU。接口方面,AX650N 支持 64bit LPDDR4x,多路 MIPI 输入,千兆 Ethernet、USB、以及 HDMI 2.0b 输出,并支持 32 路 1080p@30fps 解码内置高算力和超强编解码能力,满足行业对高性能边缘智能计算的需求。通过内置多种深度学习算法,实现视觉结构化、行为分析、状态检测等应用,高效率支持基于 Transformer 结构的视觉大模型和语言类大模型。提供丰富的开发文档,方便用户进行二次开发。
AXera AX650N 产品简介:https://www.axera-tech.com/filespath/files/20240202142256.pdf
AX630C
爱芯元智第四代智能视觉芯片 AX630C,该芯片集成新一代智眸 4.0AI-ISP,最高支持 4K@30fps 实时真黑光,同时集成新一代通元 4.0 高性能、高能效比 NPU 引擎,使得产品在低功耗、高画质、智能处理和分析等方面行业领先。提供稳定易用的 SDK 软件开发包,方便用户低成本评估、二次开发和快速量产。帮助用户在智能家居应用和其他 AIOT 项目中发挥更大的价值。
AXera AX630C 产品简介:https://www.axera-tech.com/filespath/files/20231113181459.pdf
AX630C 应该是目前 能效比&性价比&能跑LLM/VLM的 最佳的端侧 AI 芯片了,因此有客户基于 AX630C 出品了 LLM Module,欢迎关注/试用。
模型转换
经常在 AI 芯片上部署 AI 算法模型的同学都知道,想要把模型部署到芯片上的 NPU 中运行,都需要使用芯片原厂提供的 NPU 具链,这里我们使用的是 Pulsar2。
Pulsar2 是 爱芯元智 的新一代 NPU 工具链,包含 模型转换、离线量化、模型编译、异构调度 四合一超强功能,进一步强化了网络模型高效部署的需求。在针对第三代、第四代 NPU 架构进行了深度定制优化的同时,也扩展了算子&模型支持的能力及范围,对 Transformer 结构的网络也有较好的支持。
最新的 Pulsar2 3.2 版本已经悄悄增加了大语言模型编译的功能,隐藏在 pulsar2 llm_build 的子命令中。
具体使用方式请参考:
https://pulsar2-docs.readthedocs.io/zh-cn/latest/appendix/build_llm.html
模型获取
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 llm model done!
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/share/init?surl=X0aJTQM0bl8wsraspHnDUw&pwd=ifg5
-
AX650N:https://pan.baidu.com/share/init?surl=_LG-sPKnLS_LTWF3Cmcr7A&pwd=ph0e
大尺寸
基于 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 耗时越大
我们顺便统计了 224 与 448 两种输入尺寸采用 U8、U16 量化后的推理耗时,提升还是很明显。
结束语
-
虽然我们只尝试了最小的 InternVL2-1B 部署,但能在原本定位于低成本家用摄像头芯片(AX630C)上本地流畅运行 VLM 已经是一个重大突破,例如无需联网(包括蓝牙)的智能眼镜、智能的“拍立得”、以及各种有趣的穿戴设备。
-
随着大语言模型小型化的快速发展,越来越多有趣的多模态 AI 应用已经从云端服务迁移到端侧设备。我们会紧跟行业最新动态,适配更多的端侧大模型,欢迎大家持续关注。