Qwen3-VL-32B-Instruct是阿里云通义千问团队开源的多模态大语言模型,具备强大的图像理解和文本生成能力。Qwen3-VL系列是Qwen家族中专注于视觉-语言理解的多模态模型,支持图像问答、图像描述、视觉推理等多种任务。
本指南详细介绍了该模型在华为NPU(昇腾910B3)和NVIDIA GPU(H20)两种硬件环境下的微调训练方法、推理部署流程以及精度性能对比分析。
| 模型属性 | 说明 |
|---|---|
| 模型规模 | 32B(320亿)参数 |
| 模型类型 | 多模态大语言模型(视觉-语言) |
| 支持的输入 | 图像 + 文本 |
| 主要能力 | 图像问答、图像描述、视觉推理、多轮对话 |
| 支持的语言 | 中文、英文等多语言 |
| 上下文长度 | 支持最长32K token上下文 |
| 模型精度 | FP16约64GB,INT8约32GB |
| 开源地址 | HuggingFace: Qwen/Qwen3-VL-32B-Instruct |
模型架构特点:
本指南按照以下逻辑组织,帮助用户从零开始完成模型部署和微调:
| 章节 | 内容 | 面向用户 |
|---|---|---|
| 第2章 | NPU环境部署及微调 | 昇腾910B3用户 |
| 第3章 | NPU推理精度和性能测试 | 昇腾910B3用户 |
| 第4章 | GPU环境部署及微调 | NVIDIA H20用户 |
| 第5章 | GPU推理精度和性能测试 | NVIDIA H20用户 |
| 第6章 | 硬件规格对比与性能分析 | 所有用户 |
| 第7章 | 结论分析与应用建议 | 所有用户 |
| 第8章 | 常见问题解答 | 运维人员 |
以下是我们测试的核心指标,用户可快速了解两种硬件平台的表现差异:
| 关键指标 | 昇腾910B3 (NPU) | NVIDIA H20 (GPU) | 差异 |
|---|---|---|---|
| TextVQA推理精度 | 81.53% | 81.43% | 基本持平 |
| Token吞吐量 | 24.38 token/s | 42.49 token/s | GPU快74% |
| 端到端延迟 | 4998.6ms | 2861.0ms | GPU快75% |
| 训练Loss一致性 | 平均误差0.00189 | 平均误差0.00189 | 高度一致 |
本指南使用的NPU为华为昇腾Ascend 910B3,是昇腾910系列的第三代产品。
| 驱动固件 | CANN版本 | python版本 | torch版本 | torch_npu版本 |
|---|---|---|---|---|
| 25.2.0 | 8.5.0 | 3.11.14 | 2.7.1 | 2.7.1 |
| 规格项 | 数值 | 说明 |
|---|---|---|
| 架构 | Da Vinci 3.0 | 华为自研AI处理器架构 |
| FP16 算力 | 313 TFLOPS | 半精度浮点计算能力 |
| INT8 算力 | ~512 TOPS | 整数8位计算能力 |
| 显存容量 | 64GB HBM | 高速高带宽显存 |
| 显存带宽 | ~1.6 TB/s | 满足大模型推理需求 |
| HCCS互联带宽 | ~392 GB/s | 华为自研芯片互联技术 |
| 功耗 | ~350W | 单卡热设计功耗 |
910B3关键特性分析:
FP16算力:910B3提供313 TFLOPS的FP16算力,在国产AI芯片中处于领先水平。
INT8优势:910B3在INT8精度下可达~512 TOPS,约为FP16算力的1.6倍,这使得INT8量化推理在NPU上具有显著性能优势。
存算一体设计:昇腾架构采用达芬奇架构,融合了标量、向量、张量等多种计算单元,可高效处理不同类型的神经网络层。
国产化生态:昇腾NPU主打国产AI生态,拥有完整的CANN软件栈和MindSpore框架支持,但在vLLM等第三方推理框架的适配上仍需持续优化。
#########LLamaFactory微调镜像######GPU%20环境信息
docker pull quay.io/ascend/llamafactory:latest-npu-a2
######vllm-ascend推理镜像#######
docker pull quay.nju.edu.cn/ascend/vllm-ascend:v0.18.0rc1export IMAGE=quay.io/ascend/llamafactory:latest-npu-a2
docker run \
--name llamafactory \
--shm-size=500g \
--net=host \
--device /dev/davinci0 \
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci4 \
--device /dev/davinci5 \
--device /dev/davinci6 \
--device /dev/davinci7 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--privileged=true \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /root/.cache:/root/.cache \
-v /tmp:/tmp \
-v /opt:/opt \
-it $IMAGE bash
docker exec -itu root llamafactory bash本指导使用MindSpeed-MM的数据转换功能,将"原始数据"转换为"模型训练接口格式"。MindSpeed-MM是华为推出的多模态数据集处理工具,支持多种数据格式到LLaMA-Factory训练接口格式的转换。
| 属性 | 说明 |
|---|---|
| 工具用途 | 多模态数据集格式转换 |
| 支持格式 | LLaVA格式、MLLM格式、ShareGPT格式等 |
| 适用模型 | Qwen2-VL、Qwen3-VL、LLaVA等主流多模态模型 |
| 开源地址 | https://gitcode.com/Ascend/MindSpeed-MM |
数据转换流程:
原始数据(LLaVA-Instruct-150K格式)
↓
MindSpeed-MM 转换脚本
↓
LLaMA-Factory 可用的 MLLM 格式本指南使用的数据转换脚本为 examples/qwen2vl/llava_instruct_2_mllm_demo_format.py,可将LLaVA-Instruct格式数据转换为Qwen3-VL可用的MLLM格式。
cd /home
git clone https://gitcode.com/Ascend/MindSpeed-MM.git
cd MindSpeed-MM/data本微调使用的数据集为LLaVA-Instruct-150K,这是一个广泛使用的多模态指令微调数据集,来源于COCO2017训练集。
数据集构成:
| 数据集 | 描述 | 规模 | 用途 |
|---|---|---|---|
| COCO2017 | 原始图像数据 | 约118,000张训练图像 | 提供输入图像 |
| LLaVA-Instruct-150K | 图像-指令-回答三元组 | 150,000条指令数据 | 模型微调训练 |
数据下载说明:
参考国内快速下载地址: https://aistudio.baidu.com/datasetdetail/100602
参考国内下载链接: https://www.modelscope.cn/datasets/AI-ModelScope/LLaVA-Instruct-150K/files
数据示例:
{
"messages": [
{"role": "user", "content": "<image>描述这张图片"},
{"role": "assistant", "content": "这张图片展示了一个人在户外进行自行车骑行..."}
],
"images": ["path/to/image.jpg"]
}下载注意事项:
python examples/qwen2vl/llava_instruct_2_mllm_demo_format.py转换后参考数据目录结构如下:
$playground
├── data
├── COCO2017
├── train2017
├── llava_instruct_150k.json
├── mllm_format_llava_instruct_data.json
...备注:上述的data在NPU和GPU微调时都会用到,且用同一份,可以打包成tar方便后续传输。
###进入到LLamaFactory的目录,容器中默认为app
cd /app/data
###将上述处理后的数据集移动到当前目录
cp -r /home/MindSpeed-MM/data/ /app/data
##在dataset_info.json中添加mllm_format_llava_instruct_data.json相关配置
vim dataset_info.json
####在json的末尾添加如下信息(注意缩进):
"mllm_format_llava_instruct_data": {
"file_name": "mllm_format_llava_instruct_data.json",
"formatting": "sharegpt",
"columns": {
"messages": "messages",
"images": "images"
},
"tags": {
"role_tag": "role",
"content_tag": "content",
"user_tag": "user",
"assistant_tag": "assistant"
}
}| 模型属性 | 数值 |
|---|---|
| 模型ID | Qwen/Qwen3-VL-32B-Instruct |
| 参数量 | 32B (320亿) |
| 模型精度 | FP16 |
| 模型大小 | 约64GB |
| 上下文长度 | 最大32K tokens |
| 支持的输入 | 图像 + 文本 |
由于网络原因,直接从HuggingFace下载可能较慢,建议使用国内镜像源HF-Mirror:
pip install huggingface_hub
# 使用国内镜像加速下载
HF_ENDPOINT=https://hf-mirror.com python -c "
from huggingface_hub import snapshot_download
snapshot_download(
repo_id='Qwen/Qwen3-VL-32B-Instruct',
local_dir='/tmp/Qwen3-VL-32B-Instruct',
resume_download=True,
local_dir_use_symlinks=False
)
"其中,修改local_dir可以指定到其它下载路径。
下载完成后,模型目录结构如下:
/tmp/Qwen3-VL-32B-Instruct/
├── config.json # 模型配置文件
├── configuration.json # 模型架构配置
├── model.safetensors # 模型权重文件(FP16精度约64GB)
├── tokenizer.json # 分词器配置
├── tokenizer_config.json # 分词器参数
├── tokenizer.model # 分词器模型文件
├── vision_tokenizer.json # 视觉编码器配置
└── ...模型加载说明:
safetensors格式存储,相比传统的bin格式更安全且加载更快在开始微调之前,本节介绍两个关键技术概念,帮助用户理解为何采用当前的技术方案。
LoRA (Low-Rank Adaptation) 原理:
| 特性 | 说明 |
|---|---|
| 核心思想 | 通过低秩矩阵分解减少可训练参数 |
| 原理解释 | 将原始权重矩阵W分解为W + BA,其中A、B为低秩矩阵 |
| 优势 | 参数量减少至原来的1-10%,训练速度快,显存占用低 |
| 适用场景 | 大模型高效微调,特别是32B+参数规模模型 |
| 本指南配置 | LoRA rank=8, LoRA alpha=16, LoRA dropout=0.05 |
DeepSpeed ZeRO-3 原理:
| 特性 | 说明 |
|---|---|
| 全称 | Zero Redundancy Optimizer Stage 3 |
| 核心思想 | 将模型状态(参数、梯度、优化器状态)分片到多卡 |
| 显存节省 | 理论上可将单卡显存需求降低至1/N(N为卡数) |
| 本指南配置 | 8卡并行,每卡仅保存1/8的模型状态 |
| 解决的问题 | 32B模型单卡无法容纳的问题 |
为何需要DeepSpeed + LoRA组合:
由于直接在8张910B卡的环境上对Qwen3-VL-32B-Instruct模型进行sft lora会导致NPU内存OOM(Out of Memory),因为LLAmaFactory默认的sft lora微调方式会在每一张卡上都存放完整的Qwen3-VL-32B-Instruct模型权重。故需要采用DeepSpeed分布式训练优化框架来解决大模型显存爆炸问题。
cd /app/examples/train_lora
cp -r qwen3_lora_sft_ds3.yaml qwen3vl_lora_sft_ds3.yaml
vim qwen3vl_lora_sft_ds3.yaml
###修改其中的model_name_or_path,dataset,output_dir,template,num_train_epochs, 参考如下,请根据实际情况修改:
model_name_or_path: /tmp/Qwen3-VL-32B-Instruct
dataset: mllm_format_llava_instruct_data
output_dir: saves/qwen3-vl-32b/lora/sft
template: qwen3_vl_nothink
num_train_epochs: 30.0cd /app
nohup llamafactory-cli train examples/train_lora/qwen3vl_lora_sft_ds3.yaml &
##查看训练过程
tail -f nohup.out
微调后的权重默认保存在/app/saves/下面。
cd /app
vim examples/merge_lora//qwen3vl_lora_sft.yaml
###修改其中对应的model_name_or_path,adapter_name_or_path,export_dir,参考:
model_name_or_path: /tmp/Qwen3-VL-32B-Instruct
adapter_name_or_path: saves/qwen3-vl-32b/lora/sft
export_dir: saves/qwen3_vl_sft_mergedllamafactory-cli export examples/merge_lora/qwen3vl_lora_sft.yaml合并后的权重默认保存在saves/qwen3_vl_sft_merged目录下,后续可将其拷贝至下述的推理容器中使用。
export IMAGE=quay.nju.edu.cn/ascend/vllm-ascend:v0.18.0rc1
docker run \
--name vllm-ascend-npu \
--shm-size=500g \
--net=host \
--device /dev/davinci0 \
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci4 \
--device /dev/davinci5 \
--device /dev/davinci6 \
--device /dev/davinci7 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--privileged=true \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /root/.cache:/root/.cache \
-v /tmp:/tmp \
-v /opt:/opt \
-it $IMAGE bashgit clone https://github.com/AISBench/benchmark.gitcd benchmark/ais_bench/datasets
mkdir textvqa
cd textvqa
pip install modelscope
modelscope download --dataset vllm-ascend/textvqa_subset --local_dir ./
###将上面获取到的微调权重存放在/tmp目录下###
ll /tmp/qwen3_vl_sft_mergedpip install transformers=5.2.0
##原因:由于微调时所用transformers的版本为5.2.0,而当前容器中的版本为4.57.0,若版本不匹配则会有报错:AttributeError: 'list' object has no attribute 'keys',故需要升级vllm serve /tmp/qwen3_vl_sft_merged \
--dtype bfloat16 \
--max_model_len 16384 \
--max-num-batched-tokens 16384 \
--tensor-parallel-size 4 \
--trust-remote-code \
--served-model-name qwen3_vlvim benchmark/ais_bench/benchmark/configs/models/vllm_api/vllm_api_stream_chat.py
##修改其中的path, model, host_ip, host_port, max_out_len, batch_size关键参数。参考:
path="/tmp/qwen3_vl_sft_merged"
model="qwen3_vl"
host_port=8000
max_out_len=12378
batch_size=32
host_ip="90.xx.xx.xx"ais_bench --models vllm_api_stream_chat --datasets textvqa_gen_base64 --debug| dataset | version | metric | mode | vllm-api-stream-chat |
|----- | ----- | ----- | ----- | -----|
| textvqa | 40b285 | accuracy | gen | 81.53 |╒══════════════════════════╤═════════╤════════════════╤════════════════╤════════════════╤═══════════════╤════════════════╤════════════════╤═══════╕
│ Performance Parameters │ Stage │ Average │ Min │ Max │ Median │ P75 │ P90 │ P99 │ N │
╞══════════════════════════╪═════════╪════════════════╪════════════════╪════════════════╪═══════════════╪════════════════╪════════════════╪═══════╡
│ E2EL │ total │ 4998.6 ms │ 1457.4 ms │ 45925.9 ms │ 4511.6 ms │ 5697.1 ms │ 7046.3 ms │ 12236.4 ms │ 4980 │
├──────────────────────────┼─────────┼────────────────┼────────────────┼────────────────┼───────────────┼────────────────┼────────────────┼───────┤
│ TTFT │ total │ 2736.9 ms │ 384.2 ms │ 9934.9 ms │ 2609.5 ms │ 2934.9 ms │ 3470.7 ms │ 5511.4 ms │ 4980 │
├──────────────────────────┼─────────┼────────────────┼────────────────┼────────────────┼───────────────┼────────────────┼────────────────┼───────┤
│ TPOT │ total │ 795.2 ms │ 0.1 ms │ 2806.0 ms │ 813.1 ms │ 886.4 ms │ 957.0 ms │ 1336.4 ms │ 4980 │
├──────────────────────────┼─────────┼────────────────┼────────────────┼────────────────┼───────────────┼────────────────┼────────────────┼───────┤
│ ITL │ total │ 470.6 ms │ 0.0 ms │ 5571.9 ms │ 571.8 ms │ 839.8 ms │ 953.6 ms │ 1425.2 ms │ 4980 │
├──────────────────────────┼─────────┼────────────────┼────────────────┼────────────────┼───────────────┼────────────────┼────────────────┼───────┤
│ OutputTokenThroughput │ total │ 0.7516 token/s │ 0.1945 token/s │ 2.5215 token/s │ 0.737 token/s │ 0.8517 token/s │ 0.9737 token/s │ 1.286 token/s │ 4980 │
╘══════════════════════════╧═════════╧════════════════╧════════════════╧════════════════╧═══════════════╧════════════════╧════════════════╧═══════╛
╒═════════════════════════╤═════════╤═════════════════╕
│ Common Metric │ Stage │ Value │
╞═════════════════════════╪═════════╪═════════════════╡
│ Benchmark Duration │ total │ 782321.4941 ms │
├─────────────────────────┼─────────┼─────────────────┤
│ Total Requests │ total │ 4980 │
├─────────────────────────┼─────────┼─────────────────┤
│ Failed Requests │ total │ 0 │
├─────────────────────────┼─────────┼─────────────────┤
│ Success Requests │ total │ 4980 │
├─────────────────────────┼─────────┼─────────────────┤
│ Request Throughput │ total │ 6.3657 req/s │
├─────────────────────────┼─────────┼─────────────────┤
│ Total Generated Tokens │ total │ 19072 │
├─────────────────────────┼─────────┼─────────────────┤
│ Output Token Throughput │ total │ 24.3787 token/s │
╘═════════════════════════╧═════════╧═════════════════╛本指南使用的GPU为NVIDIA H20,这是针对中国市场定制的Hopper架构加速卡。
| 驱动固件 | CUDA版本 | python版本 | torch版本 |
|---|---|---|---|
| 550.163.01 | 12.4 | 3.11.14 | 2.7.1 |
| 规格项 | 数值 | 说明 |
|---|---|---|
| 架构 | Hopper(定制版) | 针对中国市场出口管制设计的H100变体 |
| FP16/BF16 Tensor算力 | 733 TFLOPS | 混合精度计算能力 |
| FP32 算力 | ~51 TFLOPS | 单精度浮点计算能力 |
| 显存容量 | 96GB HBM3 | 大容量高带宽显存 |
| 显存带宽 | ~2.0 TB/s | 相比H100的3.35 TB/s有所降低 |
| NVLink带宽 | ~600 GB/s | 多卡互联带宽 |
| PCIe版本 | Gen5 | 最新一代PCIe总线 |
| 功耗 | ~350W | 单卡热设计功耗 |
H20关键特性分析:
算力配置:H20实际FP16算力为733 TFLOPS,虽然低于标准H100的1979 TFLOPS,但在当前出口管制框架下已属于较高性能配置。
显存优势:H20配备96GB HBM3显存,比标准H100的80GB还要大,这使其在部署大模型时具有明显优势,特别是对于Qwen3-VL-32B-Instruct这类32B参数模型。
互联能力:NVLink带宽~600 GB/s,支持多卡并行推理,满足大规模部署需求。
docker pull nvcr.io/nvidia/pytorch:25.12-py3
docker pull vllm/vllm-openai:v0.18.0docker run -itd --runtime nvidia --gpus all --name pytorch-gpu --shm-size 500g --ulimit memlock=-1 --ulimit stack=67108864 --net host --entrypoint /bin/bash -v /home/:/home/ -v /tmp/:/tmp/ nvcr.io/nvidia/pytorch:25.12-py3
docker exec -itu root pytorch-gpu bash
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e .
pip install -r requirements/metrics.txt参考上述NPU环节中的数据集准备及处理章节,
为了控制和NPU的训练逻辑保持一致,故微调也采用deepspeed的方式。
cd /LLaMA-Factory/examples/train_lora
cp -r qwen3_lora_sft_ds3.yaml qwen3vl_lora_sft_ds3.yaml
vim qwen3vl_lora_sft_ds3.yaml
###修改其中的model_name_or_path,dataset,output_dir,template,num_train_epochs, 参考如下,请根据实际情况修改:
model_name_or_path: /tmp/Qwen3-VL-32B-Instruct
dataset: mllm_format_llava_instruct_data
output_dir: saves/qwen3-vl-32b/lora/sft
template: qwen3_vl_nothink
num_train_epochs: 30.0cd /LLaMA-Factory
nohup llamafactory-cli train examples/train_lora/qwen3vl_lora_sft_ds3.yaml &
##查看训练过程
tail -f nohup.outdocker run -itd --runtime nvidia --gpus all --name vllm-ascend-gpu --shm-size 500g --ulimit memlock=-1 --ulimit stack=67108864 --net host --entrypoint /bin/bash -v /home/:/home/ -v /tmp/:/tmp/ vllm/vllm-openai:v0.18.0
docker exec -itu root vllm-ascend-gpu bash
apt install git
apt install vim
git config --global http.sslVerify false
git clone https://github.com/AISBench/benchmark.gitcd benchmark/ais_bench/datasets
mkdir textvqa
cd textvqa
pip install modelscope
modelscope download --dataset vllm-ascend/textvqa_subset --local_dir ./
###将上面获取到的微调权重存放在/tmp目录下###
ll /tmp/qwen3_vl_sft_mergedpip install transformers=5.2.0
##原因:由于微调时所用transformers的版本为5.2.0,而当前容器中的版本为4.57.0,若版本不匹配则会有报错:AttributeError: 'list' object has no attribute 'keys',故需要升级vllm serve /tmp/qwen3_vl_sft_merged \
--dtype bfloat16 \
--max_model_len 16384 \
--max-num-batched-tokens 16384 \
--tensor-parallel-size 4 \
--trust-remote-code \
--served-model-name qwen3_vlvim benchmark/ais_bench/benchmark/configs/models/vllm_api/vllm_api_stream_chat.py
##修改其中的path, model, host_ip, host_port, max_out_len, batch_size关键参数。参考:
path="/tmp/qwen3_vl_sft_merged"
model="qwen3_vl"
host_port=8000
max_out_len=12378
batch_size=32
host_ip="90.xx.xx.xx"ais_bench --models vllm_api_stream_chat --datasets textvqa_gen_base64 --debug
| dataset | version | metric | mode | vllm-api-stream-chat |
|----- | ----- | ----- | ----- | -----|
| textvqa | 40b285 | accuracy | gen | 81.43 |继上面启动的qwen3vl服务,进行下述性能测试:
ais_bench --models vllm_api_stream_chat --datasets textvqa_gen_base64 --summarizer default_perf --mode perf╒══════════════════════════╤═════════╤════════════════╤════════════════╤═════════════════╤════════════════╤════════════════╤════════════════╤══════╕
│ Performance Parameters │ Stage │ Average │ Min │ Max │ Median │ P90 │ P99 │ N │
╞══════════════════════════╪═════════╪════════════════╪════════════════╪═════════════════╪════════════════╪════════════════╪════════════════╪══════╡
│ E2EL │ total │ 2861.0 ms │ 104.5 ms │ 23799.5 ms │ 2689.7 ms │ 3992.4 ms │ 6789.3 ms │ 4980 │
├──────────────────────────┼─────────┼────────────────┼────────────────┼─────────────────┼────────────────┼────────────────┼────────────────┼──────┤
│ TTFT │ total │ 1869.4 ms │ 68.2 ms │ 8216.5 ms │ 1803.3 ms │ 2416.7 ms │ 5678.7 ms │ 4980 │
├──────────────────────────┼─────────┼────────────────┼────────────────┼─────────────────┼────────────────┼────────────────┼────────────────┼──────┤
│ TPOT │ total │ 307.2 ms │ 0.0 ms │ 2151.0 ms │ 325.4 ms │ 529.7 ms │ 817.0 ms │ 4980 │
├──────────────────────────┼─────────┼────────────────┼────────────────┼─────────────────┼────────────────┼────────────────┼────────────────┼──────┤
│ ITL │ total │ 211.7 ms │ 0.0 ms │ 4181.8 ms │ 42.2 ms │ 806.8 ms │ 1350.1 ms │ 4980 │
├──────────────────────────┼─────────┼────────────────┼────────────────┼─────────────────┼────────────────┼────────────────┼────────────────┼──────┤
│ OutputTokenThroughput │ total │ 1.3575 token/s │ 0.2404 token/s │ 47.8553 token/s │ 1.2719 token/s │ 1.7991 token/s │ 2.9472 token/s │ 4980 │
╘══════════════════════════╧═════════╧════════════════╧════════════════╧═════════════════╧════════════════╧════════════════╧════════════════╧══════╛
╒═════════════════════════╤═════════╤═════════════════╕
│ Common Metric │ Stage │ Value │
╞═════════════════════════╪═════════╪═════════════════╡
│ Benchmark Duration │ total │ 448687.9206 ms │
├─────────────────────────┼─────────┼─────────────────┤
│ Total Requests │ total │ 4980 │
├─────────────────────────┼─────────┼─────────────────┤
│ Failed Requests │ total │ 0 │
├─────────────────────────┼─────────┼─────────────────┤
│ Success Requests │ total │ 4980 │
├─────────────────────────┼─────────┼─────────────────┤
│ Request Throughput │ total │ 11.099 req/s │
├─────────────────────────┼─────────┼─────────────────┤
│ Total Generated Tokens │ total │ 19066 │
├─────────────────────────┼─────────┼─────────────────┤
│ Output Token Throughput │ total │ 42.4928 token/s │
╘═════════════════════════╧═════════╧═════════════════╛在深入分析微调和推理结果之前,本节先从硬件层面对NVIDIA H20和华为Ascend 910B3进行系统性对比,为后续性能差异分析提供理论依据。
| 算力指标 | NVIDIA H20 | 华为Ascend 910B3 | 差异 |
|---|---|---|---|
| FP16算力 | 733 TFLOPS | 313 TFLOPS | H20高约134% |
| FP32 | ~51 TFLOPS | N/A | H20独有 |
| INT8 | N/A | ~512 TOPS | 910B3高约512 TOPS |
| 功耗 | ~350W | ~350W | 持平 |
算力分析:
FP16计算:H20的Tensor Core提供733 TFLOPS的FP16算力,比910B3的313 TFLOPS高出约134%。这一巨大算力优势直接决定了H20在大模型推理场景中的领先地位。
算力差距来源:H20的算力约为910B3的2.34倍,这个差距在Transformer的自注意力计算、矩阵乘法等核心操作中会被直接放大,体现为显著的性能差异。
INT8量化:910B3在INT8精度下可达~512 TOPS,约为其FP16算力的1.6倍。通过INT8量化,理论上可以将910B3的算力差距缩小,但由于Qwen3-VL-32B-Instruct模型规模较大,全INT8量化可能带来精度损失,需要谨慎评估。
| 内存指标 | NVIDIA H20 | 华为Ascend 910B3 | 差异 |
|---|---|---|---|
| 显存容量 | 96GB HBM3 | 64GB HBM | H20高50% |
| 显存带宽 | ~2.0 TB/s | ~1.6 TB/s | H20高25% |
| 互联带宽 | ~600 GB/s (NVLink) | ~392 GB/s (HCCS) | H20高53% |
内存带宽分析:
显存容量:H20配备96GB HBM3显存,比910B3的64GB多出50%。对于Qwen3-VL-32B-Instruct模型(FP16精度约64GB),H20可支持更大的batch size或更长的上下文窗口,而910B3受限于64GB显存,可能需要使用更小的batch size或采用模型并行。
显存带宽:H20的2.0 TB/s带宽比910B3的1.6 TB/s高25%。由于Transformer推理是显存带宽密集型任务,带宽差异会显著影响Token生成吞吐量。
多卡互联:H20的NVLink提供~600 GB/s互联带宽,比910B3的HCCS ~392 GB/s高53%。在多卡并行推理时,更高的互联带宽可更高效地分片张量,减少卡间通信瓶颈。
综合算力和内存带宽,H20在以下方面领先:
| 性能瓶颈类型 | H20优势体现 | 910B3劣势体现 |
|---|---|---|
| 计算密集型 | FP16算力高134%,LLM的Transformer层计算更快 | 算力受限,自注意力计算耗时更长 |
| 带宽密集型 | 显存带宽高25%,数据供给更充足 | 带宽成为推理瓶颈,GPU利用率可能不高 |
| 多卡扩展型 | NVLink带宽高53%,卡间通信更高效 | HCCS带宽限制多卡线性扩展效率 |
| 显存容量型 | 96GB vs 64GB,可承载更大推理batch | 64GB刚好容纳模型,batch受限 |
| 显存容量利用率 | 96GB可轻松容纳32B模型+大batch | 64GB需精简batch或采用模型并行 |
理论性能差距预估:
基于上述硬件规格分析,H20在Qwen3-VL-32B-Instruct推理任务中的理论性能优势约为:
下图展示了NPU和GPU环境下Qwen3-VL-32B-Instruct模型微调过程中Loss曲线的对比。两种环境采用相同的超参数配置(DeepSpeed分布式训练、LoRA微调),以验证跨平台训练的一致性。

统计值差异分析:
| 统计指标 | 数值 |
|---|---|
| 有效Step | 1890 |
| 平均绝对误差 | 1.887368e-03 |
| 最大绝对误差 | 3.525000e-02 |
| P95 绝对误差 | 8.013750e-03 |
| 平均相对误差 | 1.063029e-01 |
从统计数据可以看出,NPU和GPU两种环境下的微调Loss曲线差异较小:
这验证了LLaMA-Factory在NPU和GPU平台间训练的一致性,为跨平台部署提供了可靠依据。
本节对比Qwen3-VL-32B-Instruct模型在NPU和GPU环境下微调后的TextVQA推理精度。
| 测试环境 | 数据集 | Version | 指标 | 模式 | 精度 |
|---|---|---|---|---|---|
| NPU (昇腾910B) | textvqa | 40b285 | accuracy | gen | 81.53% |
| GPU (NVIDIA) | textvqa | 40b285 | accuracy | gen | 81.43% |
精度差异分析:
| 对比维度 | 数值 |
|---|---|
| NPU精度 | 81.53% |
| GPU精度 | 81.43% |
| 精度差异 | +0.10% (NPU领先) |
| 精度一致性 | 高度一致 |
从测试结果可以看出,NPU和GPU两种硬件平台上的推理精度差异仅为0.10%,在测试误差范围内。这表明:
本节对比Qwen3-VL-32B-Instruct模型在NPU和GPU环境下的推理性能,包括端到端延迟、首Token时间、生成速率等关键指标。
| 性能指标 | 910B3 NPU | H20 GPU | 差异 | 优势平台 |
|---|---|---|---|---|
| E2EL (端到端延迟) | 4998.6 ms | 2861.0 ms | +74.7% | H20 |
| TTFT (首Token时间) | 2736.9 ms | 1869.4 ms | +46.4% | H20 |
| TPOT (每输出Token时间) | 795.2 ms | 307.2 ms | +158.9% | H20 |
| ITL (Token间隔时间) | 470.6 ms | 211.7 ms | +122.3% | H20 |
延迟分析:
| 吞吐量指标 | 910B3 NPU | H20 GPU | 差异 | 优势平台 |
|---|---|---|---|---|
| OutputTokenThroughput (Avg) | 0.7516 token/s | 1.3575 token/s | +80.6% | H20 |
| Output Token Throughput | 24.38 token/s | 42.49 token/s | +74.2% | H20 |
| Request Throughput | 6.37 req/s | 11.10 req/s | +74.3% | H20 |
吞吐量分析:
GPU在吞吐量指标上全面领先NPU约74-81%:
| 稳定性指标 | 910B3 NPU | H20 GPU |
|---|---|---|
| E2EL Median | 4511.6 ms | 2689.7 ms |
| E2EL P99 | 12236.4 ms | 6789.3 ms |
| Failed Requests | 0 | 0 |
| Success Requests | 4980 | 4980 |
稳定性分析:
通过对Qwen3-VL-32B-Instruct模型在华为昇腾910B3和NVIDIA H20环境下的微调训练对比验证,可以得出以下结论:
Loss收敛一致性:两种环境下完成1890步有效训练后,NPU和GPU的Loss曲线平均绝对误差仅为0.00189,表明模型收敛行为高度一致
精度无损迁移:NPU环境微调后的权重在GPU环境推理精度为81.43%,GPU环境微调后的权重在NPU环境推理精度为81.53%,差异在测试误差范围内
框架兼容性:LLaMA-Factory 0.9.5.dev0版本在NPU和GPU平台均能提供稳定的训练体验,DeepSpeed分布式训练有效解决了大模型显存问题
| 评估维度 | 910B3 NPU表现 | H20 GPU表现 | 结论 |
|---|---|---|---|
| 推理精度 | 81.53% | 81.43% | 基本持平 |
| 端到端延迟 | 4998.6ms | 2861.0ms | GPU快75% |
| Token吞吐量 | 24.38 token/s | 42.49 token/s | GPU快74% |
| 请求吞吐量 | 6.37 req/s | 11.10 req/s | GPU快74% |
| 长尾延迟稳定性 | P99=12236ms | P99=6789ms | GPU更稳定 |
| 服务可靠性 | 100% | 100% | 持平 |
| 硬件指标 | H20 | 910B3 | 理论差距 | 实测差距 |
|---|---|---|---|---|
| FP16算力 | 733 TFLOPS | 313 TFLOPS | H20高134% | - |
| 显存容量 | 96GB | 64GB | H20高50% | - |
| 显存带宽 | ~2.0 TB/s | ~1.6 TB/s | H20高25% | - |
| 互联带宽 | ~600 GB/s | ~392 GB/s | H20高53% | - |
| Token吞吐量 | 42.49 token/s | 24.38 token/s | - | H20高74% |
分析结论:
算力冗余现象:H20的理论算力是910B3的2.34倍,但实测吞吐量差距仅为74%(H20是910B3的1.74倍)。这说明推理性能并未完全受算力支配,显存带宽、互联带宽、软件优化等因素同样关键。
显存容量制约:910B3的64GB显存刚好容纳Qwen3-VL-32B-Instruct模型(FP16约64GB),几乎没有额外空间用于增大batch size,这是制约其吞吐量的重要因素。而H20的96GB显存可支持更大的batch,从而提升吞吐量。
软件优化空间:vLLM在昇腾NPU上的适配尚不完善,可能存在额外的软件开销。910B3的实测性能与其理论算力(313 TFLOPS)的匹配度低于H20,这暗示NPU后端可能存在优化空间。
基于上述对比分析,针对不同应用场景给出以下建议:
| 应用场景 | 推荐平台 | 理由 |
|---|---|---|
| 追求最高推理性能 | H20 GPU | 算力2.34倍于910B3,显存更大,吞吐量高74% |
| 华为生态集成 | 910B3 NPU | 适合已部署昇腾硬件的政企场景 |
| 跨平台模型开发 | 两者均可 | 训练一致性高(Loss误差<0.002),权重可互换 |
| 对精度要求极高 | 910B3 NPU | 81.53%略高于H20 81.43% |
| 国产化合规要求 | 910B3 NPU | 完全自主可控,满足信创要求 |
| 大规模商业部署 | H20 GPU | 高吞吐低延迟,降低单次推理成本 |
DeepSpeed分布式优化:通过DeepSpeed ZeRO-3优化策略,成功在8卡昇腾910B环境下完成Qwen3-VL-32B-Instruct模型的LoRA微调,有效解决了单卡显存不足的问题
vLLM推理加速:采用vllm-ascend和vllm-openai作为推理引擎,支持tensor-parallel分布式推理,充分利用多卡并行能力
AISBench标准化测评:使用统一的AISBench测评框架和TextVQA数据集,确保NPU和GPU环境对比的公平性和可复现性
版本兼容性处理:明确指出transformers版本匹配问题(需升级至5.2.0),避免实际部署中的常见坑点
NPU性能优化:针对910B3的硬件特性,探索更多针对昇腾架构的算子融合和内存优化策略:
多模态能力扩展:基于当前的单图推理能力,探索视频理解、图文交错等多模态场景的部署
量化部署研究:针对910B3的INT8优势,探索INT8/INT4量化技术在NPU平台的部署:
显存利用率优化:针对910B3的64GB显存限制,探索:
两者的版本均为0.9.5.dev0
问题描述:微调完成后,使用合并的权重启动vllm推理服务时报错:
AttributeError: 'list' object has no attribute 'keys'根本原因:微调时使用的transformers版本为5.2.0,而推理容器中的默认版本为4.57.0,版本不匹配导致API兼容性问题
解决方案:在启动vllm推理服务前,升级transformers至5.2.0版本
pip install transformers==5.2.0问题描述:直接在8张910B卡环境上进行sft lora微调时,NPU内存溢出
根本原因:LLaMAFactory默认的sft lora微调方式会在每一张卡上都存放完整的Qwen3-VL-32B-Instruct模型权重(模型约64GB),超出单卡显存容量
解决方案:采用DeepSpeed分布式训练优化框架(ZeRO-3策略),将模型权重分片存储到多张卡上
# 使用deepspeed配置文件
cp qwen3_lora_sft_ds3.yaml qwen3vl_lora_sft_ds3.yaml
# 修改配置启用DeepSpeed优化问题描述:数据转换完成后,训练时提示找不到图像文件
根本原因:MindSpeed-MM数据转换脚本生成的路径是绝对路径,如果在不同目录结构下使用会导致路径不匹配
解决方案:
问题描述:启动微调后,如何实时监控训练进度和状态?
监控方法:
# 方法1:查看nohup.out输出
tail -f nohup.out
# 方法2:使用LLaMAFactory内置监控(如果可用)
# 在训练配置中启用 logging_steps 和 report_to
# 方法3:监控NPU/GPU利用率
# NPU环境
npu-smi
# GPU环境
nvidia-smi
# 方法4:监控内存使用
free -h关键监控指标:
| 指标 | 正常范围 | 异常提示 |
|---|---|---|
| GPU/NPU利用率 | 80-100% | 低于50%说明存在瓶颈 |
| 显存占用 | 接近但不超过显存容量 | OOM表示超出显存 |
| Loss下降 | 持续下降,后期趋于平稳 | Loss上升说明学习率过高 |
| 训练速度 | Step/time 稳定 | 突然变慢可能是IO瓶颈 |
问题描述:本指南中的30 epoch微调需要多长时间完成?
时间估算参考:
| 配置 | 硬件环境 | 预估时间 |
|---|---|---|
| 30 epochs, 1890 steps | 8卡910B3 | 约6-10小时 |
| 30 epochs, 1890 steps | 8卡H20 | 约4-8小时 |
影响因素:
实际时间可能因以下因素有所差异:
问题描述:微调时如何确定最优的batch size?
原则说明:
| 模型精度 | 910B3 (64GB) | H20 (96GB) | 推荐起始值 |
|---|---|---|---|
| FP16 | 1-2 per card | 2-4 per card | 1 |
| INT8 | 4-8 per card | 8-16 per card | 4 |
| INT4 | 8-16 per card | 16-32 per card | 8 |
选择方法:
配置示例:
# 在qwen3vl_lora_sft_ds3.yaml中配置
per_device_train_batch_size: 1
gradient_accumulation_steps: 16
# 有效batch size = 1 * 16 * 8 = 128问题描述:微调完成后,如何将训练好的LoRA权重合并并导出?
导出步骤:
# 1. 修改合并配置文件
vim examples/merge_lora/qwen3vl_lora_sft.yaml
# 2. 配置参数
model_name_or_path: /tmp/Qwen3-VL-32B-Instruct
adapter_name_or_path: saves/qwen3-vl-32b/lora/sft
export_dir: saves/qwen3_vl_sft_merged
# 3. 执行合并导出
llamafactory-cli export examples/merge_lora/qwen3vl_lora_sft.yaml
# 4. 查看导出的模型
ls -la saves/qwen3_vl_sft_merged/导出的模型目录结构:
saves/qwen3_vl_sft_merged/
├── config.json
├── model.safetensors # 合并后的完整模型权重
├── tokenizer.json
├── tokenizer_config.json
└── ...使用合并后的模型进行推理:
# 使用vLLM启动推理服务
vllm serve /path/to/saves/qwen3_vl_sft_merged \
--dtype bfloat16 \
--max_model_len 16384 \
--tensor-parallel-size 4 \
--trust-remote-code问题描述:启动vLLM推理服务后,如何验证模型功能正常?
验证方法:
# 1. 检查服务是否启动成功
curl http://localhost:8000/v1/models
# 2. 发送测试请求(使用OpenAI兼容API)
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3_vl",
"messages": [
{"role": "user", "content": "请描述这张图片:<image>"}
],
"max_tokens": 100
}'
# 3. 检查日志是否正常
tail -f /tmp/vllm.log正常响应示例:
{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"created": 1234567890,
"model": "qwen3_vl",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "这张图片展示了一个户外场景..."
},
"finish_reason": "stop"
}]
}问题描述:在NPU上微调的权重能否在GPU上使用,反之亦然?
答案:可以互换使用。
| 训练环境 | 推理环境 | 是否兼容 | 注意事项 |
|---|---|---|---|
| 910B3 NPU | H20 GPU | ✅ 兼容 | 需升级transformers至5.2.0 |
| H20 GPU | 910B3 NPU | ✅ 兼容 | 需使用vllm-ascend |
| 910B3 NPU | 910B3 NPU | ✅ 兼容 | 使用原环境 |
| H20 GPU | H20 GPU | ✅ 兼容 | 使用原环境 |
互换使用的优势:
互换验证结果:
本指南实测数据证明,两种环境下微调的权重在对方平台上均能正常工作,精度差异在测试误差范围内(<0.1%)。