Qwen2-VL-7B-Instruct 昇腾部署入门指南(基于 docker run)
Qwen2-VL-7B-Instruct 昇腾部署入门指南(基于 docker run)
1. 背景
1.1 模型简介
Qwen2-VL-7B-Instruct 是阿里云研发的大规模视觉语言模型(Large Vision Language Model, LVLM),可以以图像、文本、视频作为输入,并以文本作为输出。该模型支持多种分辨率和宽高比的图像理解,以及超过20分钟的视频理解能力。
1.2 版本兼容性
2. 环境准备
2.1 前置条件检查
在开始部署前,请确认以下条件:
1. 硬件检查:确认 Atlas 800I A2 设备正常工作 npu-smi info2. 驱动检查:确认昇腾驱动已正确安装 cat /usr/local/Ascend/driver/version.info3. Docker 环境:确认 Docker 已安装并可正常使用
2.2 模型准备
目前提供的MindIE镜像预置了 Qwen2-VL-7B-Instruct 模型推理脚本,无需使用本仓库自带的atb_models中的代码。
2.3 镜像下载与加载
前往昇腾社区/开发资源下载适配本模型的镜像包:1.0.0-800I-A2-py311-openeuler24.03-lts
完成之后,请使用docker images命令确认查找具体镜像名称与标签。
3. 硬件要求
3.1 Atlas 800I A2 32G 配置
• 最低要求:1台 Atlas 800I A2 32G 服务器 • 推荐配置:8卡并行部署 • 内存要求:至少 64GB 系统内存 • 存储要求:至少 50GB 可用存储空间
3.2 Atlas 800I A2 64G 配置
• 最低要求:1台 Atlas 800I A2 64G 服务器 • 推荐配置:4卡或8卡并行部署 • 内存要求:至少 128GB 系统内存 • 存储要求:至少 50GB 可用存储空间
4. 容器部署
4.1 创建容器
4.1.1 基础启动命令
docker run -dit -u root \
--name ${容器名} \
-e ASCEND_RUNTIME_OPTIONS=NODRV \
--privileged=true \
-v /home/path:/home/path \
-v /data:/data \
-v /usr/local/Ascend/driver/:/usr/local/Ascend/driver/ \
-v /usr/local/Ascend/firmware/:/usr/local/Ascend/firmware/ \
-v /usr/local/sbin/:/usr/local/sbin \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/dcmi:/usr/local/dcmi \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
--shm-size=100g \
-p ${映射端口}:22 \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
${MindIE镜像名称:标签} \
/bin/bash4.1.2 参数说明
${容器名} | qwen2-vl-container | |
/home/路径 | /home/user/data | |
${映射端口} | 2222 | |
${MindIE镜像名称:标签} | ascendhub.huawei.com/xxx:1.0.0-800I-A2-py311-openeuler24.03-lts |
4.1.3 启动示例
docker run -dit -u root \
--name qwen2-vl-container \
-e ASCEND_RUNTIME_OPTIONS=NODRV \
--privileged=true \
-v /home/user/models:/home/user/models \
-v /data:/data \
-v /usr/local/Ascend/driver/:/usr/local/Ascend/driver/ \
-v /usr/local/Ascend/firmware/:/usr/local/Ascend/firmware/ \
-v /usr/local/sbin/:/usr/local/sbin \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/dcmi:/usr/local/dcmi \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
--shm-size=100g \
-p 2222:22 \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
your-mindie-image:1.0.0-800I-A2-py311-openeuler24.03-lts \
/bin/bash4.2 进入容器并安装依赖
4.2.1 进入容器
docker exec -it ${容器名} bash4.2.2 安装Python依赖
cd /usr/local/Ascend/atb-models
pip install -r requirements/models/requirements_qwen2_vl.txt5. 纯模型推理
5.1 配置推理脚本
修改 /usr/local/Ascend/atb-models/examples/models/qwen2_vl/run_pa.sh 脚本中的关键参数:
5.1.1 Atlas 800I A2 32G 配置
# 设置卡数,Atlas-800I-A2-32G必须八卡
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
# 模型权重路径(请确保路径存在且包含完整的模型文件)
model_path="/data/Qwen2-VL-7B-Instruct/"
# 批次大小,底层使用continuous batching逻辑
max_batch_size=1
# 最大输入长度,输入长视频或者较大分辨率图片时,需要设置较大的值
# kv cache会根据最大输入长度、最大输出长度以及bs进行预分配,设置太大会影响吞吐
max_input_length=8192
# 最大输出长度
max_output_length=80
# 输入图片或视频文件路径(支持格式:jpg/png/jpeg/mp4/wmv/avi)
input_image="/data/test_images/sample.jpg"
# 用户prompt,默认放置在图片后
input_text="Explain the details in the image."
# 数据集路径(优先级比input_image高)
# 若要推理整个数据集,在base_cmd入参中添加 --dataset_path $dataset_path
dataset_path="/data/test_images"
# 共享内存name保存路径,任意位置的一个txt即可
shm_name_save_path="./shm_name.txt"5.1.2 Atlas 800I A2 64G 配置
# 设置卡数,Atlas-800I-A2-64G四卡或八卡均可
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 # 8卡配置
# export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 # 4卡配置
# 其他参数可根据需要调整batch_size等
max_batch_size=4 # 64G版本可以设置更大的batch_size5.1.3 参数详细说明
max_batch_size | 64G: 4-32 | ||
max_input_length | |||
max_output_length | |||
input_image |
5.2 运行推理
bash /usr/local/Ascend/atb-models/examples/models/qwen2_vl/run_pa.sh5.3 性能基准测试
5.3.1 Atlas 800I A2 32G 性能数据
测试配置:
• max_batch_size=4• max_input_length=8192• max_output_length=80• input_image="/data/test_images/1902x1080.jpg"
测试结果:
• 总token数:320 • 总耗时:7.44秒 • 吞吐量:43 tokens/s
5.3.2 Atlas 800I A2 64G 性能数据
测试配置:
• max_batch_size=32• max_input_length=8192• max_output_length=80• input_image="/data/test_images/1902x1080.jpg"
测试结果:
• 总token数:2560 • 总耗时:25.912秒 • 吞吐量:98.79 tokens/s
注意:更详细的性能数据(如首token时延、内存使用等)请参考终端performance输出。实际性能可能因硬件配置、模型版本、输入数据等因素而有所差异。
6. 服务化推理
6.1 配置服务
6.1.1 编辑配置文件
vim /usr/local/Ascend/mindie/latest/mindie-service/conf/config.json6.1.2 关键配置项说明
{
"Version":"1.0.0",
"LogConfig":{
"logLevel":"Info",
"logFileSize":20,
"logFileNum":20,
"logPath":"logs/mindservice.log"
},
"ServerConfig":{
"ipAddress":"127.0.0.1",
"port":1040,// 主服务端口,可自定义
"managementPort":1041,// 管理端口,可自定义
"metricsPort":1042,// 监控端口,可自定义
"maxLinkNum":200,
"httpsEnabled":false,
"timeoutInSeconds":300
},
"BackendConfig":{
"npuDeviceIds":[[0,1,2,3,4,5,6,7]],// NPU设备ID配置
"ModelDeployConfig":{
"maxSeqLen":50000,
"maxInputTokenLen":50000,
"truncation":false,
"ModelConfig":[
{
"modelInstanceType":"Standard",
"modelName":"qwen2_vl",// 建议使用qwen2_vl便于benchmark测试
"modelWeightPath":"/data/Qwen2-VL-7B-Instruct",// 模型权重路径
"worldSize":8,// 并行度,需与npuDeviceIds数量一致
"npuMemSize":8,// KV cache分配,单位GB,需给VIT预留显存空间
"maxBatchSize":32,
"maxInputTokens":8192,
"maxOutputTokens":512
}
]
},
"ScheduleConfig":{
"maxPrefillTokens":50000,
"maxIterTimes":4096,
"maxBatchSize":32,
"maxWaitingTimeInMs":100
}
}
}6.1.3 配置参数优化建议
重要提示:
npuMemSize切勿设置为 -1,需要给 VIT(视觉编码器)预留足够的显存空间。
6.2 启动服务
6.2.1 设置环境变量
export MASTER_ADDR=localhost
export MASTER_PORT=78966.2.2 启动服务进程
cd /usr/local/Ascend/mindie/latest/mindie-service/bin
./mindieservice_daemon6.2.3 检查服务状态
# 检查服务是否正常启动
curl http://127.0.0.1:1041/health
# 查看服务日志
tail -f /usr/local/Ascend/mindie/latest/mindie-service/logs/mindservice.log6.3 API 接口测试
6.3.1 VLLM 兼容接口
curl -X POST http://127.0.0.1:1040/generate \
-H "Content-Type: application/json" \
-d '{
"prompt": [
{
"type": "image_url",
"image_url": "file:///data/test_images/sample.jpg"
},
{
"type": "text",
"text": "Explain the details in the image."
}
],
"max_tokens": 512,
"stream": false,
"do_sample": true,
"repetition_penalty": 1.00,
"temperature": 0.01,
"top_p": 0.001,
"top_k": 1,
"model": "qwen2_vl"
}'6.3.2 OpenAI 兼容接口
curl -X POST http://127.0.0.1:1040/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen2_vl",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "file:///data/test_images/sample.jpg"
}
},
{
"type": "text",
"text": "Explain the details in the image."
}
]
}
],
"max_tokens": 512,
"stream": false,
"do_sample": true,
"repetition_penalty": 1.00,
"temperature": 0.01,
"top_p": 0.001,
"top_k": 1
}'6.3.3 流式输出示例
curl -X POST http://127.0.0.1:1040/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen2_vl",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "描述这张图片的内容"
},
{
"type": "image_url",
"image_url": {
"url": "file:///data/test_images/sample.jpg"
}
}
]
}
],
"max_tokens": 512,
"stream": true,
"temperature": 0.7
}'7. 故障排除
7.1 常见问题及解决方案
1. 服务启动失败
• 检查NPU设备状态: npu-smi info• 检查端口占用: netstat -tlnp | grep 1040• 查看详细日志: tail -f logs/mindservice.log
• 降低 npuMemSize参数• 减少 maxBatchSize设置• 检查模型文件完整性
• 调整 maxBatchSize参数• 优化 maxInputTokenLen设置• 检查硬件资源使用情况
• 确认图片路径正确且可访问 • 检查图片格式是否支持 • 验证文件权限设置