weixin_43499674/Qwen3-4B-Thinking-2507-FP8
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Qwen3-4B-Thinking-2507-FP8 昇腾 NPU 适配测评报告

模型信息

属性值
模型名称Qwen3-4B-Thinking-2507-FP8
模型来源ModelScope / HuggingFace
架构Qwen3ForCausalLM
参数量4B
Hidden Size2560
层数36
Attention Heads32 (Query) / 8 (KV)
位置编码RoPE (theta=5,000,000)
激活函数SiLU
最大序列长度262,144
量化格式FP8 E4M3,Block-wise [128, 128]
权重文件model.safetensors (约 4.8 GB)

适配环境

硬件环境

项目配置
NPU 型号Atlas A2 (Ascend 910B4)
NPU 数量1
HBM 容量32 GB
CPU 架构ARM (aarch64)

软件环境

项目版本
CANN8.5.1
PyTorch2.5.1
torch_npu2.9.0.post1
vLLM0.18.0
vllm-ascend0.18.0rc1
Transformers4.51.0
Python3.11.14

适配说明

不兼容点

vLLM 的 NPU 平台 supported_quantization 仅支持 ['ascend', 'compressed-tensors'],原生不支持 fp8。直接加载会触发验证错误:

fp8 quantization is currently not supported in npu.

此外,vLLM 的 FP8 线性层依赖 cutlass_scaled_mm、deepgemm、flashinfer 等 CUDA/Hopper 专用算子,在昇腾上无 fallback 路径。

解决方案

采用与 MiniMax-M2 FP8 相同的成熟策略,在 vllm-ascend 中新增两层补丁:

  1. Config 层拦截 (patch/platform/patch_minimax_m2_config.py):

    • 在 ModelConfig._verify_quantization 中拦截,检测到 qwen3 + fp8 + npu 时,将 cfg.quantization 设为 None,绕过平台验证
  2. Worker 层反量化 (patch/worker/patch_qwen3_fp8.py):

    • 包装 Qwen3ForCausalLM.load_weights,在权重加载时实时将 FP8 权重 + weight_scale_inv 反量化为 BF16
    • 反量化公式:bf16_weight = fp8_weight.to(bf16) * expanded_scale_inv
    • 保持与 MiniMax-M2 相同的实现风格,便于维护

修改文件清单

文件动作说明
vllm_ascend/patch/platform/patch_minimax_m2_config.py修改扩展 _should_disable_fp8,新增 qwen3 支持
vllm_ascend/patch/worker/patch_qwen3_fp8.py新增为 Qwen3ForCausalLM 注入 FP8 反量化逻辑
vllm_ascend/patch/worker/__init__.py修改导入新 patch
tests/e2e/models/configs/Qwen3-4B-Thinking-2507-FP8.yaml新增E2E 测试配置
docs/source/tutorials/models/Qwen3-4B-Thinking-2507-FP8.md新增模型部署文档
docs/source/tutorials/models/index.md修改文档索引更新

快速开始

1. 环境准备

确保已安装 vLLM + vllm-ascend 并激活 NPU 插件:

pip install vllm==0.18.0 vllm-ascend==0.18.0rc1

2. 下载模型权重

# 方式一:ModelScope(推荐)
modelscope download --model Qwen/Qwen3-4B-Thinking-2507-FP8 --local_dir /models/Qwen3-4B-Thinking-2507-FP8

# 方式二:HuggingFace(镜像)
HF_ENDPOINT=https://hf-mirror.com huggingface-cli download Qwen/Qwen3-4B-Thinking-2507-FP8 --local-dir /models/Qwen3-4B-Thinking-2507-FP8

3. 启动服务

vllm serve /models/Qwen3-4B-Thinking-2507-FP8 \
  --dtype bfloat16 \
  --tensor-parallel-size 1 \
  --max-model-len 32768 \
  --max-num-seqs 16 \
  --port 8000

启动日志中应出现:

WARNING  Detected fp8 Qwen3 checkpoint on NPU. Disabling fp8 quantization and loading dequantized bf16 weights instead.

4. 验证推理

# 服务就绪检查
curl -sf http://127.0.0.1:8000/v1/models

# 文本推理
curl -s http://127.0.0.1:8000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "/models/Qwen3-4B-Thinking-2507-FP8",
    "messages": [{"role": "user", "content": "你好,请简单介绍一下自己"}],
    "temperature": 0.7,
    "max_tokens": 128
  }'

验证结果

验证项清单

验证项方法结果
Dummy 权重加载--load-format dummy通过
真实权重加载model.safetensors 反量化通过
服务启动/v1/models 就绪检查通过
文本推理/v1/chat/completions通过
ACL Graph 编译PIECEWISE 模式通过

实际验证记录

Dummy 测试

vllm serve /tmp/qwen3-4b-fp8 --load-format dummy --dtype bfloat16 --max-model-len 32768 --port 8000
  • 状态:服务正常启动,/v1/models 返回模型信息
  • 推理:API 返回 token 序列正常

真实权重测试

vllm serve /opt/atomgit/models/Qwen3-4B-Thinking-2507-FP8 \
  --dtype bfloat16 --max-model-len 32768 --port 8000
  • 权重加载:safetensors 单文件 4.8GB,加载耗时 43 秒
  • 反量化后显存占用:约 7.7 GB
  • ACL Graph 编译:PIECEWISE 模式,batch sizes [1, 2, 4, 8, 16]
  • 中文推理:输出连贯,自我介绍内容符合 Qwen3 风格

推理示例输出

{
  "choices": [{
    "message": {
      "role": "assistant",
      "content": "嗯,用户让我简单介绍一下自己。首先,我需要确定用户想要的是什么。可能他们刚接触我,想了解我的功能..."
    }
  }]
}

NPU vs CPU 精度误差量化对比

方法:FP8 权重反量化后,在 Ascend910 NPU (vLLM-Ascend) 与 CPU (transformers bf16) 上使用相同输入、温度=0 进行确定性解码,逐 token 对比输出。

对比基线:CPU (transformers 4.51.0, bfloat16, 相同反量化权重)

测试类别测试输入NPU 预测CPU 基线期望答案NPU 正确CPU 正确
Math15+27=?424242✅✅
Math100/4=?252525✅✅
Math5*3=?151515✅✅
Mathsqrt(144)=?121212✅✅
Math7*8=?565656✅✅
KnowledgeCapital of France?ParisParisParis✅✅
KnowledgeClosest planet to Sun?MercuryMercuryMercury✅✅
KnowledgeWWII end year?194519451945✅✅
LogicCats are animals?YesYesYes✅✅
LogicA>B>C → A>C?YesYesYes✅✅
Codingprint(2+2) output?444✅✅

精度汇总

指标NPUCPU差异
正确数11/1111/110
准确率100%100%0%
误差——< 1% ✅ PASS
Token 级匹配率——100% (确定性解码完全一致)

详细数据见 accuracy_report.json。测试脚本见 tests/ 目录。

性能数据

指标数值
权重加载时间~43 秒 (4.8 GB safetensors)
反量化后显存~7.7 GB
ACL Graph 编译时间~2 分钟(首次启动)
支持的最大 batch size16(配置值)
块大小 (block size)128

功能支持矩阵

功能状态说明
文本生成支持已验证
FP8 量化支持加载时反量化为 BF16
Thinking 模式支持在 prompt 中追加 /think
Tensor Parallelism支持未在单卡上验证多卡
Pipeline Parallelism支持框架层面支持
ACL Graph支持PIECEWISE 模式
Prefix Caching支持默认开启
Chunked Prefill支持默认开启
多模态不支持本模型为纯文本模型

注意事项

  1. FP8 反量化开销:模型加载时会将 FP8 权重实时反量化为 BF16,首次加载时间比原生 BF16 模型略长(约增加 5~10 秒),推理阶段无额外开销。
  2. 显存占用:反量化后显存占用与 BF16 版本相当(约 7.7 GB),单卡 32GB 绰绰有余。
  3. ACL Graph 首次编译:首次启动需要编译 ACL Graph,耗时约 2 分钟,后续启动若缓存命中则大幅缩短。
  4. HCCL 建议:若后续扩展到多卡 TP,建议设置 HCCL_OP_EXPANSION_MODE=AIV 以优化通信性能。

常见问题

Q: 为什么启动时提示 "Disabling fp8 quantization"?

A: 这是预期行为。vLLM-Ascend 当前不支持原生 FP8 算子,因此通过 patches 在加载时将 FP8 权重反量化为 BF16,以兼容昇腾 NPU。

Q: 反量化后的精度如何?

A: 反量化采用 checkpoint 中自带的 weight_scale_inv 进行逐 block [128,128] 还原,精度损失极小,实际推理输出与 BF16 版本无感知差异。

Q: 是否支持 --quantization fp8 参数?

A: 不支持。启动时无需也不应指定 --quantization fp8,patch 会自动处理 config 中的量化配置。

相关链接

  • 模型主页:ModelScope | HuggingFace
  • Qwen3 官方介绍:Qwen3 Blog
  • vLLM-Ascend 文档:vllm-ascend

版权与许可

本适配报告基于模型原有的 Apache-2.0 许可证发布。

模型版权归属 Alibaba Cloud(通义千问团队)。