| 属性 | 值 |
|---|---|
| 模型名称 | Qwen3-4B-Thinking-2507-FP8 |
| 模型来源 | ModelScope / HuggingFace |
| 架构 | Qwen3ForCausalLM |
| 参数量 | 4B |
| Hidden Size | 2560 |
| 层数 | 36 |
| Attention Heads | 32 (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) |
| 项目 | 版本 |
|---|---|
| CANN | 8.5.1 |
| PyTorch | 2.5.1 |
| torch_npu | 2.9.0.post1 |
| vLLM | 0.18.0 |
| vllm-ascend | 0.18.0rc1 |
| Transformers | 4.51.0 |
| Python | 3.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 中新增两层补丁:
Config 层拦截 (patch/platform/patch_minimax_m2_config.py):
ModelConfig._verify_quantization 中拦截,检测到 qwen3 + fp8 + npu 时,将 cfg.quantization 设为 None,绕过平台验证Worker 层反量化 (patch/worker/patch_qwen3_fp8.py):
Qwen3ForCausalLM.load_weights,在权重加载时实时将 FP8 权重 + weight_scale_inv 反量化为 BF16bf16_weight = fp8_weight.to(bf16) * expanded_scale_inv| 文件 | 动作 | 说明 |
|---|---|---|
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 | 修改 | 文档索引更新 |
确保已安装 vLLM + vllm-ascend 并激活 NPU 插件:
pip install vllm==0.18.0 vllm-ascend==0.18.0rc1# 方式一: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-FP8vllm 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.# 服务就绪检查
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 返回模型信息真实权重测试
vllm serve /opt/atomgit/models/Qwen3-4B-Thinking-2507-FP8 \
--dtype bfloat16 --max-model-len 32768 --port 8000[1, 2, 4, 8, 16]推理示例输出
{
"choices": [{
"message": {
"role": "assistant",
"content": "嗯,用户让我简单介绍一下自己。首先,我需要确定用户想要的是什么。可能他们刚接触我,想了解我的功能..."
}
}]
}方法:FP8 权重反量化后,在 Ascend910 NPU (vLLM-Ascend) 与 CPU (transformers bf16) 上使用相同输入、温度=0 进行确定性解码,逐 token 对比输出。
对比基线:CPU (transformers 4.51.0, bfloat16, 相同反量化权重)
| 测试类别 | 测试输入 | NPU 预测 | CPU 基线 | 期望答案 | NPU 正确 | CPU 正确 |
|---|---|---|---|---|---|---|
| Math | 15+27=? | 42 | 42 | 42 | ✅ | ✅ |
| Math | 100/4=? | 25 | 25 | 25 | ✅ | ✅ |
| Math | 5*3=? | 15 | 15 | 15 | ✅ | ✅ |
| Math | sqrt(144)=? | 12 | 12 | 12 | ✅ | ✅ |
| Math | 7*8=? | 56 | 56 | 56 | ✅ | ✅ |
| Knowledge | Capital of France? | Paris | Paris | Paris | ✅ | ✅ |
| Knowledge | Closest planet to Sun? | Mercury | Mercury | Mercury | ✅ | ✅ |
| Knowledge | WWII end year? | 1945 | 1945 | 1945 | ✅ | ✅ |
| Logic | Cats are animals? | Yes | Yes | Yes | ✅ | ✅ |
| Logic | A>B>C → A>C? | Yes | Yes | Yes | ✅ | ✅ |
| Coding | print(2+2) output? | 4 | 4 | 4 | ✅ | ✅ |
| 指标 | NPU | CPU | 差异 |
|---|---|---|---|
| 正确数 | 11/11 | 11/11 | 0 |
| 准确率 | 100% | 100% | 0% |
| 误差 | — | — | < 1% ✅ PASS |
| Token 级匹配率 | — | — | 100% (确定性解码完全一致) |
详细数据见
accuracy_report.json。测试脚本见tests/目录。
| 指标 | 数值 |
|---|---|
| 权重加载时间 | ~43 秒 (4.8 GB safetensors) |
| 反量化后显存 | ~7.7 GB |
| ACL Graph 编译时间 | ~2 分钟(首次启动) |
| 支持的最大 batch size | 16(配置值) |
| 块大小 (block size) | 128 |
| 功能 | 状态 | 说明 |
|---|---|---|
| 文本生成 | 支持 | 已验证 |
| FP8 量化 | 支持 | 加载时反量化为 BF16 |
| Thinking 模式 | 支持 | 在 prompt 中追加 /think |
| Tensor Parallelism | 支持 | 未在单卡上验证多卡 |
| Pipeline Parallelism | 支持 | 框架层面支持 |
| ACL Graph | 支持 | PIECEWISE 模式 |
| Prefix Caching | 支持 | 默认开启 |
| Chunked Prefill | 支持 | 默认开启 |
| 多模态 | 不支持 | 本模型为纯文本模型 |
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 中的量化配置。
本适配报告基于模型原有的 Apache-2.0 许可证发布。
模型版权归属 Alibaba Cloud(通义千问团队)。