Ascend-SACT/Qwen3-VL-32B-Instruct-Finetune
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

基于LLaMAFactory的Qwen3-VL-32B-Instruct模型NPU与GPU部署及微调精度指导

1 介绍

Qwen3-VL-32B-Instruct是阿里云通义千问团队开源的多模态大语言模型,具备强大的图像理解和文本生成能力。Qwen3-VL系列是Qwen家族中专注于视觉-语言理解的多模态模型,支持图像问答、图像描述、视觉推理等多种任务。

本指南详细介绍了该模型在华为NPU(昇腾910B3)和NVIDIA GPU(H20)两种硬件环境下的微调训练方法、推理部署流程以及精度性能对比分析。

1.1 Qwen3-VL-32B-Instruct模型简介

模型属性说明
模型规模32B(320亿)参数
模型类型多模态大语言模型(视觉-语言)
支持的输入图像 + 文本
主要能力图像问答、图像描述、视觉推理、多轮对话
支持的语言中文、英文等多语言
上下文长度支持最长32K token上下文
模型精度FP16约64GB,INT8约32GB
开源地址HuggingFace: Qwen/Qwen3-VL-32B-Instruct

模型架构特点:

  1. 视觉编码器:采用Vision Transformer (ViT)架构作为图像编码器,将图像转换为 token 序列
  2. 语言模型基座:基于Qwen3语言模型,具备强大的文本生成和推理能力
  3. 模态对齐:通过大规模多模态预训练实现视觉和语言特征的空间对齐

1.2 本指南结构

本指南按照以下逻辑组织,帮助用户从零开始完成模型部署和微调:

章节内容面向用户
第2章NPU环境部署及微调昇腾910B3用户
第3章NPU推理精度和性能测试昇腾910B3用户
第4章GPU环境部署及微调NVIDIA H20用户
第5章GPU推理精度和性能测试NVIDIA H20用户
第6章硬件规格对比与性能分析所有用户
第7章结论分析与应用建议所有用户
第8章常见问题解答运维人员

1.3 关键指标一览

以下是我们测试的核心指标,用户可快速了解两种硬件平台的表现差异:

关键指标昇腾910B3 (NPU)NVIDIA H20 (GPU)差异
TextVQA推理精度81.53%81.43%基本持平
Token吞吐量24.38 token/s42.49 token/sGPU快74%
端到端延迟4998.6ms2861.0msGPU快75%
训练Loss一致性平均误差0.00189平均误差0.00189高度一致

2 NPU环境部署及其微调

2.1 NPU 环境信息

本指南使用的NPU为华为昇腾Ascend 910B3,是昇腾910系列的第三代产品。

驱动固件CANN版本python版本torch版本torch_npu版本
25.2.08.5.03.11.142.7.12.7.1

2.1.1 Ascend 910B3 硬件规格详解

规格项数值说明
架构Da Vinci 3.0华为自研AI处理器架构
FP16 算力313 TFLOPS半精度浮点计算能力
INT8 算力~512 TOPS整数8位计算能力
显存容量64GB HBM高速高带宽显存
显存带宽~1.6 TB/s满足大模型推理需求
HCCS互联带宽~392 GB/s华为自研芯片互联技术
功耗~350W单卡热设计功耗

910B3关键特性分析:

  1. FP16算力:910B3提供313 TFLOPS的FP16算力,在国产AI芯片中处于领先水平。

  2. INT8优势:910B3在INT8精度下可达~512 TOPS,约为FP16算力的1.6倍,这使得INT8量化推理在NPU上具有显著性能优势。

  3. 存算一体设计:昇腾架构采用达芬奇架构,融合了标量、向量、张量等多种计算单元,可高效处理不同类型的神经网络层。

  4. 国产化生态:昇腾NPU主打国产AI生态,拥有完整的CANN软件栈和MindSpore框架支持,但在vLLM等第三方推理框架的适配上仍需持续优化。

2.2 运行容器

2.2.1 准备镜像

#########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.0rc1

2.2.2 启动容器

export 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

2.3 数据集准备及处理

本指导使用MindSpeed-MM的数据转换功能,将"原始数据"转换为"模型训练接口格式"。MindSpeed-MM是华为推出的多模态数据集处理工具,支持多种数据格式到LLaMA-Factory训练接口格式的转换。

2.3.0 MindSpeed-MM 工具说明

属性说明
工具用途多模态数据集格式转换
支持格式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

2.3.1 数据集下载

本微调使用的数据集为LLaVA-Instruct-150K,这是一个广泛使用的多模态指令微调数据集,来源于COCO2017训练集。

数据集构成:

数据集描述规模用途
COCO2017原始图像数据约118,000张训练图像提供输入图像
LLaVA-Instruct-150K图像-指令-回答三元组150,000条指令数据模型微调训练

数据下载说明:

  • 用户需要自行下载COCO2017数据集,并解压到项目目录下的./data/COCO2017文件夹中。

参考国内快速下载地址: https://aistudio.baidu.com/datasetdetail/100602

  • 获取图片数据集的描述文件(LLaVA-Instruct-150K),下载至./data/路径下。

参考国内下载链接: https://www.modelscope.cn/datasets/AI-ModelScope/LLaVA-Instruct-150K/files

数据示例:

{
  "messages": [
    {"role": "user", "content": "<image>描述这张图片"},
    {"role": "assistant", "content": "这张图片展示了一个人在户外进行自行车骑行..."}
  ],
  "images": ["path/to/image.jpg"]
}

下载注意事项:

  1. COCO2017图像集约20GB,建议使用百度AI Studio国内镜像加速下载
  2. LLaVA-Instruct-150K为JSON描述文件,约100MB
  3. 确保图像路径和JSON文件中的路径一致

2.3.2 数据集处理

  • 运行数据转换脚本
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方便后续传输。

2.3.3 修改LLamaFactory中的微调数据集

###进入到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"
    }
  }

2.4 模型权重下载

2.4.1 模型信息

模型属性数值
模型IDQwen/Qwen3-VL-32B-Instruct
参数量32B (320亿)
模型精度FP16
模型大小约64GB
上下文长度最大32K tokens
支持的输入图像 + 文本

2.4.2 下载步骤

由于网络原因,直接从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可以指定到其它下载路径。

2.4.3 模型目录结构

下载完成后,模型目录结构如下:

/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格式更安全且加载更快
  • 首次加载时会自动下载分词器文件和配置文件
  • 建议预留100GB磁盘空间以确保下载和后续微调有足够空间

2.5 开始微调

2.5.0 关键技术说明

在开始微调之前,本节介绍两个关键技术概念,帮助用户理解为何采用当前的技术方案。

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组合:

  1. Qwen3-VL-32B-Instruct模型FP16精度约64GB
  2. 昇腾910B3单卡显存仅64GB
  3. 如果不使用ZeRO-3,每张卡都需要完整加载模型(64GB × 8 = 512GB总占用)
  4. 使用ZeRO-3后,每张卡仅需保存1/8的模型分片 + 梯度 + 优化器状态
  5. 配合LoRA进一步减少可训练参数,显存压力大幅降低

2.5.1 Qwen3vl sft_lora_ds3微调代码适配

由于直接在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.0

2.5.2 运行微调

cd /app

nohup llamafactory-cli train examples/train_lora/qwen3vl_lora_sft_ds3.yaml &

##查看训练过程
tail -f nohup.out

2.5.3 合并权重

微调后的权重默认保存在/app/saves/下面。

2.5.3.1 修改合并权重代码
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_merged
2.5.3.2 开始合并
llamafactory-cli export examples/merge_lora/qwen3vl_lora_sft.yaml

合并后的权重默认保存在saves/qwen3_vl_sft_merged目录下,后续可将其拷贝至下述的推理容器中使用。

3 NPU环境推理精度和性能

3.1 推理精度测试

3.1.1 启动容器

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 bash

3.1.2 准备测评框架AISBench

git clone https://github.com/AISBench/benchmark.git

3.1.3 数据集准备和微调权重

cd 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_merged

3.1.4 启动vllm推理服务

  • 更新transformers版本:
pip 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_vl

3.1.5 修改aisbench测试配置

vim 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"

3.1.6 开始测试

ais_bench --models vllm_api_stream_chat --datasets textvqa_gen_base64 --debug
  • NPU TextVQA推理精度测试结果:
| dataset | version | metric | mode | vllm-api-stream-chat |
|----- | ----- | ----- | ----- | -----|
| textvqa | 40b285 | accuracy | gen | 81.53 |

3.2 推理性能测试

  • NPU TextVQA推理性能测试结果
╒══════════════════════════╤═════════╤════════════════╤════════════════╤════════════════╤═══════════════╤════════════════╤════════════════╤═══════╕
│ 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 │
╘═════════════════════════╧═════════╧═════════════════╛

4 GPU环境部署及其微调

4.1 GPU 环境信息

本指南使用的GPU为NVIDIA H20,这是针对中国市场定制的Hopper架构加速卡。

驱动固件CUDA版本python版本torch版本
550.163.0112.43.11.142.7.1

4.1.1 NVIDIA H20 硬件规格详解

规格项数值说明
架构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关键特性分析:

  1. 算力配置:H20实际FP16算力为733 TFLOPS,虽然低于标准H100的1979 TFLOPS,但在当前出口管制框架下已属于较高性能配置。

  2. 显存优势:H20配备96GB HBM3显存,比标准H100的80GB还要大,这使其在部署大模型时具有明显优势,特别是对于Qwen3-VL-32B-Instruct这类32B参数模型。

  3. 互联能力:NVLink带宽~600 GB/s,支持多卡并行推理,满足大规模部署需求。

4.2 运行容器

4.2.1 准备镜像

docker pull nvcr.io/nvidia/pytorch:25.12-py3

docker pull vllm/vllm-openai:v0.18.0

4.2.2 启动容器

docker 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

4.2.3 安装LLamaFactory

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e .
pip install -r requirements/metrics.txt

4.2.4 数据集准备及处理

参考上述NPU环节中的数据集准备及处理章节,

4.3 开始微调

4.3.1 Qwen3vl sft_lora_ds3微调代码适配

为了控制和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.0

4.3.2 运行微调

cd /LLaMA-Factory

nohup llamafactory-cli train examples/train_lora/qwen3vl_lora_sft_ds3.yaml &

##查看训练过程
tail -f nohup.out

5 GPU环境推理精度和性能

5.1 推理精度测试

5.1.1 启动容器

docker 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.git

5.1.2 数据集准备和微调权重

cd 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_merged

5.1.3 启动vllm推理服务

  • 更新transformers版本:
pip 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_vl

5.1.4 修改aisbench测试配置

vim 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"

5.1.5 开始测试

ais_bench --models vllm_api_stream_chat --datasets textvqa_gen_base64 --debug
  • GPU TextVQA推理精度测试结果:
| dataset | version | metric | mode | vllm-api-stream-chat |
|----- | ----- | ----- | ----- | -----|
| textvqa | 40b285 | accuracy | gen | 81.43 |

5.2 推理性能测试

继上面启动的qwen3vl服务,进行下述性能测试:

ais_bench --models vllm_api_stream_chat --datasets textvqa_gen_base64 --summarizer default_perf --mode perf
  • GPU TextVQA推理性能测试结果:
╒══════════════════════════╤═════════╤════════════════╤════════════════╤═════════════════╤════════════════╤════════════════╤════════════════╤══════╕
│ 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 │
╘═════════════════════════╧═════════╧═════════════════╛

6 NPU与GPU微调及其推理结果对比

6.0 硬件规格对比分析

在深入分析微调和推理结果之前,本节先从硬件层面对NVIDIA H20和华为Ascend 910B3进行系统性对比,为后续性能差异分析提供理论依据。

6.0.1 算力对比

算力指标NVIDIA H20华为Ascend 910B3差异
FP16算力733 TFLOPS313 TFLOPSH20高约134%
FP32~51 TFLOPSN/AH20独有
INT8N/A~512 TOPS910B3高约512 TOPS
功耗~350W~350W持平

算力分析:

  1. FP16计算:H20的Tensor Core提供733 TFLOPS的FP16算力,比910B3的313 TFLOPS高出约134%。这一巨大算力优势直接决定了H20在大模型推理场景中的领先地位。

  2. 算力差距来源:H20的算力约为910B3的2.34倍,这个差距在Transformer的自注意力计算、矩阵乘法等核心操作中会被直接放大,体现为显著的性能差异。

  3. INT8量化:910B3在INT8精度下可达~512 TOPS,约为其FP16算力的1.6倍。通过INT8量化,理论上可以将910B3的算力差距缩小,但由于Qwen3-VL-32B-Instruct模型规模较大,全INT8量化可能带来精度损失,需要谨慎评估。

6.0.2 显存与内存带宽对比

内存指标NVIDIA H20华为Ascend 910B3差异
显存容量96GB HBM364GB HBMH20高50%
显存带宽~2.0 TB/s~1.6 TB/sH20高25%
互联带宽~600 GB/s (NVLink)~392 GB/s (HCCS)H20高53%

内存带宽分析:

  1. 显存容量:H20配备96GB HBM3显存,比910B3的64GB多出50%。对于Qwen3-VL-32B-Instruct模型(FP16精度约64GB),H20可支持更大的batch size或更长的上下文窗口,而910B3受限于64GB显存,可能需要使用更小的batch size或采用模型并行。

  2. 显存带宽:H20的2.0 TB/s带宽比910B3的1.6 TB/s高25%。由于Transformer推理是显存带宽密集型任务,带宽差异会显著影响Token生成吞吐量。

  3. 多卡互联:H20的NVLink提供~600 GB/s互联带宽,比910B3的HCCS ~392 GB/s高53%。在多卡并行推理时,更高的互联带宽可更高效地分片张量,减少卡间通信瓶颈。

6.0.3 硬件层面性能差距综合分析

综合算力和内存带宽,H20在以下方面领先:

性能瓶颈类型H20优势体现910B3劣势体现
计算密集型FP16算力高134%,LLM的Transformer层计算更快算力受限,自注意力计算耗时更长
带宽密集型显存带宽高25%,数据供给更充足带宽成为推理瓶颈,GPU利用率可能不高
多卡扩展型NVLink带宽高53%,卡间通信更高效HCCS带宽限制多卡线性扩展效率
显存容量型96GB vs 64GB,可承载更大推理batch64GB刚好容纳模型,batch受限
显存容量利用率96GB可轻松容纳32B模型+大batch64GB需精简batch或采用模型并行

理论性能差距预估:

基于上述硬件规格分析,H20在Qwen3-VL-32B-Instruct推理任务中的理论性能优势约为:

  • 单卡推理:H20比910B3快约100-130%(算力2.34倍+带宽1.25倍综合优势)
  • 多卡推理:H20比910B3快约120-150%(互联带宽优势进一步放大)
  • 实测结果吻合:本指南实测H20吞吐量(42.49 token/s)比910B3(24.38 token/s)快约74%,低于理论预估,这主要因为:
    1. vLLM在NPU上的优化尚不完善,存在软件瓶颈
    2. 测试中tensor-parallel-size=4,多卡互联带宽成为主要瓶颈
    3. 推理服务存在调度开销,未能完全发挥硬件能力

6.1 微调Loss曲线对比

下图展示了NPU和GPU环境下Qwen3-VL-32B-Instruct模型微调过程中Loss曲线的对比。两种环境采用相同的超参数配置(DeepSpeed分布式训练、LoRA微调),以验证跨平台训练的一致性。

微调Loss曲线对比

统计值差异分析:

统计指标数值
有效Step1890
平均绝对误差1.887368e-03
最大绝对误差3.525000e-02
P95 绝对误差8.013750e-03
平均相对误差1.063029e-01

从统计数据可以看出,NPU和GPU两种环境下的微调Loss曲线差异较小:

  • 平均绝对误差仅为0.00189,表明两种环境下训练趋势高度一致
  • 最大绝对误差为0.03525,在可接受范围内
  • P95绝对误差为0.008,说明99%的采样点误差都较小
  • 平均相对误差约为10.6%,主要体现在训练初期,后期收敛阶段误差更小

这验证了LLaMA-Factory在NPU和GPU平台间训练的一致性,为跨平台部署提供了可靠依据。

6.2 推理精度对比

本节对比Qwen3-VL-32B-Instruct模型在NPU和GPU环境下微调后的TextVQA推理精度。

测试环境数据集Version指标模式精度
NPU (昇腾910B)textvqa40b285accuracygen81.53%
GPU (NVIDIA)textvqa40b285accuracygen81.43%

精度差异分析:

对比维度数值
NPU精度81.53%
GPU精度81.43%
精度差异+0.10% (NPU领先)
精度一致性高度一致

从测试结果可以看出,NPU和GPU两种硬件平台上的推理精度差异仅为0.10%,在测试误差范围内。这表明:

  1. 模型兼容性良好:Qwen3-VL-32B-Instruct模型在昇腾NPU和NVIDIA GPU上均能保持一致的推理能力
  2. 精度损失可忽略:跨平台部署不会带来显著的精度下降
  3. 工程可信度:微调训练在NPU环境完成后的权重可直接迁移到GPU环境使用,反之亦然

6.3 推理性能对比

本节对比Qwen3-VL-32B-Instruct模型在NPU和GPU环境下的推理性能,包括端到端延迟、首Token时间、生成速率等关键指标。

6.3.1 延迟指标对比

性能指标910B3 NPUH20 GPU差异优势平台
E2EL (端到端延迟)4998.6 ms2861.0 ms+74.7%H20
TTFT (首Token时间)2736.9 ms1869.4 ms+46.4%H20
TPOT (每输出Token时间)795.2 ms307.2 ms+158.9%H20
ITL (Token间隔时间)470.6 ms211.7 ms+122.3%H20

延迟分析:

  1. 端到端延迟(E2EL):GPU比NPU快约75%,这是用户感知最直接的指标
  2. 首Token时间(TTFT):GPU比NPU快约46%,包含模型 Prefill 阶段的计算
  3. 每输出Token时间(TPOT):GPU比NPU快约159%,Decode阶段性能差距显著
  4. Token间隔时间(ITL):GPU比NPU快约122%,反映了生成过程中Token产出的稳定性

6.3.2 吞吐量指标对比

吞吐量指标910B3 NPUH20 GPU差异优势平台
OutputTokenThroughput (Avg)0.7516 token/s1.3575 token/s+80.6%H20
Output Token Throughput24.38 token/s42.49 token/s+74.2%H20
Request Throughput6.37 req/s11.10 req/s+74.3%H20

吞吐量分析:

GPU在吞吐量指标上全面领先NPU约74-81%:

  • 平均Token生成速率GPU比NPU快约80.6%
  • 整体Token吞吐量GPU比NPU快约74.2%
  • 请求处理速率GPU比NPU快约74.3%

6.3.3 稳定性指标对比

稳定性指标910B3 NPUH20 GPU
E2EL Median4511.6 ms2689.7 ms
E2EL P9912236.4 ms6789.3 ms
Failed Requests00
Success Requests49804980

稳定性分析:

  1. 延迟稳定性:GPU的P99延迟(6789.3ms)约为NPU(12236.4ms)的55%,长尾延迟表现更优
  2. 请求成功率:两种平台均达到100%成功率,服务可靠性一致

7 结论分析

7.1 跨平台训练一致性总结

通过对Qwen3-VL-32B-Instruct模型在华为昇腾910B3和NVIDIA H20环境下的微调训练对比验证,可以得出以下结论:

  1. Loss收敛一致性:两种环境下完成1890步有效训练后,NPU和GPU的Loss曲线平均绝对误差仅为0.00189,表明模型收敛行为高度一致

  2. 精度无损迁移:NPU环境微调后的权重在GPU环境推理精度为81.43%,GPU环境微调后的权重在NPU环境推理精度为81.53%,差异在测试误差范围内

  3. 框架兼容性:LLaMA-Factory 0.9.5.dev0版本在NPU和GPU平台均能提供稳定的训练体验,DeepSpeed分布式训练有效解决了大模型显存问题

7.2 推理性能综合评估

评估维度910B3 NPU表现H20 GPU表现结论
推理精度81.53%81.43%基本持平
端到端延迟4998.6ms2861.0msGPU快75%
Token吞吐量24.38 token/s42.49 token/sGPU快74%
请求吞吐量6.37 req/s11.10 req/sGPU快74%
长尾延迟稳定性P99=12236msP99=6789msGPU更稳定
服务可靠性100%100%持平

7.2.1 硬件规格与实测性能关联分析

硬件指标H20910B3理论差距实测差距
FP16算力733 TFLOPS313 TFLOPSH20高134%-
显存容量96GB64GBH20高50%-
显存带宽~2.0 TB/s~1.6 TB/sH20高25%-
互联带宽~600 GB/s~392 GB/sH20高53%-
Token吞吐量42.49 token/s24.38 token/s-H20高74%

分析结论:

  1. 算力冗余现象:H20的理论算力是910B3的2.34倍,但实测吞吐量差距仅为74%(H20是910B3的1.74倍)。这说明推理性能并未完全受算力支配,显存带宽、互联带宽、软件优化等因素同样关键。

  2. 显存容量制约:910B3的64GB显存刚好容纳Qwen3-VL-32B-Instruct模型(FP16约64GB),几乎没有额外空间用于增大batch size,这是制约其吞吐量的重要因素。而H20的96GB显存可支持更大的batch,从而提升吞吐量。

  3. 软件优化空间:vLLM在昇腾NPU上的适配尚不完善,可能存在额外的软件开销。910B3的实测性能与其理论算力(313 TFLOPS)的匹配度低于H20,这暗示NPU后端可能存在优化空间。

7.3 应用场景建议

基于上述对比分析,针对不同应用场景给出以下建议:

应用场景推荐平台理由
追求最高推理性能H20 GPU算力2.34倍于910B3,显存更大,吞吐量高74%
华为生态集成910B3 NPU适合已部署昇腾硬件的政企场景
跨平台模型开发两者均可训练一致性高(Loss误差<0.002),权重可互换
对精度要求极高910B3 NPU81.53%略高于H20 81.43%
国产化合规要求910B3 NPU完全自主可控,满足信创要求
大规模商业部署H20 GPU高吞吐低延迟,降低单次推理成本

7.4 技术亮点

  1. DeepSpeed分布式优化:通过DeepSpeed ZeRO-3优化策略,成功在8卡昇腾910B环境下完成Qwen3-VL-32B-Instruct模型的LoRA微调,有效解决了单卡显存不足的问题

  2. vLLM推理加速:采用vllm-ascend和vllm-openai作为推理引擎,支持tensor-parallel分布式推理,充分利用多卡并行能力

  3. AISBench标准化测评:使用统一的AISBench测评框架和TextVQA数据集,确保NPU和GPU环境对比的公平性和可复现性

  4. 版本兼容性处理:明确指出transformers版本匹配问题(需升级至5.2.0),避免实际部署中的常见坑点

7.5 未来优化方向

  1. NPU性能优化:针对910B3的硬件特性,探索更多针对昇腾架构的算子融合和内存优化策略:

    • 利用INT8量化(512 TOPS算力)弥补FP16算力差距
    • 优化HCCS互联效率,提升多卡并行性能
    • 深度优化vLLM-ascend后端,减少软件开销
  2. 多模态能力扩展:基于当前的单图推理能力,探索视频理解、图文交错等多模态场景的部署

  3. 量化部署研究:针对910B3的INT8优势,探索INT8/INT4量化技术在NPU平台的部署:

    • Qwen3-VL-32B的INT8量化精度损失评估
    • 在910B3上实现INT8推理加速
    • 对比H20和910B3在量化场景下的性能表现
  4. 显存利用率优化:针对910B3的64GB显存限制,探索:

    • 模型并行(Tensor Parallel)策略
    • 动态batch调度优化
    • KV Cache压缩技术

8 常见问题及其解决方式

8.1 NPU环境和GPU环境的LLaMA-Factory版本是否匹配?

两者的版本均为0.9.5.dev0

8.2 使用微调后的权重启动vllm时报错:AttributeError: 'list' object has no attribute 'keys'

问题描述:微调完成后,使用合并的权重启动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.3 NPU微调时出现内存溢出(OOM)

问题描述:直接在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优化

8.4 数据集处理后文件路径问题

问题描述:数据转换完成后,训练时提示找不到图像文件

根本原因:MindSpeed-MM数据转换脚本生成的路径是绝对路径,如果在不同目录结构下使用会导致路径不匹配

解决方案:

  1. 将处理后的数据集统一存放到LLaMA-Factory的data目录下
  2. 确保COCO2017图像目录结构完整
  3. 建议将data目录打包成tar文件,便于在容器间传输

8.5 如何监控微调训练过程?

问题描述:启动微调后,如何实时监控训练进度和状态?

监控方法:

# 方法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瓶颈

8.6 微调训练需要多长时间?

问题描述:本指南中的30 epoch微调需要多长时间完成?

时间估算参考:

配置硬件环境预估时间
30 epochs, 1890 steps8卡910B3约6-10小时
30 epochs, 1890 steps8卡H20约4-8小时

影响因素:

  1. 数据集规模:LLaVA-Instruct-150K约15万条数据
  2. 模型规模:Qwen3-VL-32B为32B参数
  3. 硬件配置:8卡并行可大幅缩短训练时间
  4. Batch Size:更大的batch需要更多显存但可能加速

实际时间可能因以下因素有所差异:

  • 数据加载IO速度
  • 显卡利用率
  • 训练过程中的验证频率

8.7 如何选择合适的Batch Size?

问题描述:微调时如何确定最优的batch size?

原则说明:

模型精度910B3 (64GB)H20 (96GB)推荐起始值
FP161-2 per card2-4 per card1
INT84-8 per card8-16 per card4
INT48-16 per card16-32 per card8

选择方法:

  1. 从最小值开始:建议从batch_size=1开始尝试
  2. 逐步增大:如果显存充足,每隔2-4个step检查显存占用,逐步增大
  3. 观察loss:确保增大的batch size不会影响模型收敛
  4. 考虑梯度累积:如果单卡batch太小,可通过gradient_accumulation_steps弥补

配置示例:

# 在qwen3vl_lora_sft_ds3.yaml中配置
per_device_train_batch_size: 1
gradient_accumulation_steps: 16
# 有效batch size = 1 * 16 * 8 = 128

8.8 微调后的权重文件如何导出和使用?

问题描述:微调完成后,如何将训练好的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

8.9 推理服务启动后如何验证模型是否正常工作?

问题描述:启动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"
  }]
}

8.10 NPU和GPU的微调权重可以互换使用吗?

问题描述:在NPU上微调的权重能否在GPU上使用,反之亦然?

答案:可以互换使用。

训练环境推理环境是否兼容注意事项
910B3 NPUH20 GPU✅ 兼容需升级transformers至5.2.0
H20 GPU910B3 NPU✅ 兼容需使用vllm-ascend
910B3 NPU910B3 NPU✅ 兼容使用原环境
H20 GPUH20 GPU✅ 兼容使用原环境

互换使用的优势:

  1. 灵活性:可以在算力更充足的GPU上快速微调,然后部署到NPU环境
  2. 容灾备份:一套权重可以在不同平台部署多份
  3. 成本优化:训练时用GPU更高效,推理时根据场景选择硬件

互换验证结果:

本指南实测数据证明,两种环境下微调的权重在对方平台上均能正常工作,精度差异在测试误差范围内(<0.1%)。