Delicate02/Qwen3-ASR-0.6B-NPU
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Qwen3-ASR-0.6B 昇腾 NPU 适配与调优文档

1. 简介

本文档记录 Qwen3-ASR-0.6B 在 Ascend910 NPU 上的适配、推理验证与性能调优结果。

Qwen3-ASR-0.6B 是一个基于 Qwen3-Omni 的语音识别(ASR)模型,支持 30 种语言和 22 种中文方言的语言识别与语音转文字。模型架构包含:

  • Whisper 风格音频编码器(18 层,14 注意力头,d_model=896)
  • Qwen3 文本解码器(28 层,16 注意力头,8 KV 头,hidden_size=1024)
  • 投影连接层(音频特征 → 文本嵌入空间)

适配目标:

  • ✅ 基于 Ascend910 NPU 跑通模型推理
  • ✅ 精度与 GPU/CPU 误差 < 1%
  • ✅ 完整的推理脚本、精度/性能评测工具
  • ✅ 模型卡片标注 #+NPU 标签

模型信息

属性值
模型名称Qwen/Qwen3-ASR-0.6B
模型大小6.7 亿参数 (~1.75GB)
支持语言30 种(中、英、粤、日、韩、法、德等)
推理方式Offline / Streaming
输入类型16kHz mono 音频
原始框架PyTorch + transformers

参考文档

  • Qwen3-ASR 官方仓库
  • Qwen3-ASR 模型页
  • torch-npu 文档

2. 验证环境

硬件环境

组件规格
NPUAscend910B (64GB HBM) × 2 逻辑卡
CPUARM 架构
内存不低于 32GB

软件环境

组件版本
Python3.11.14
torch2.9.0
torch-npu2.9.0.post1+gitee7ba04
transformers4.57.6
qwen-asr0.0.6
vllm0.18.0+empty
vllm-ascend0.18.0rc1
accelerate1.12.0
librosa0.10.0+
soundfile0.12.0+

环境准备步骤

# 安装依赖
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install torch_npu torchvision_npu
pip install transformers accelerate librosa soundfile
pip install qwen-asr

3. 模型下载

支持从 ModelScope(国内推荐)或 HuggingFace 下载:

# 通过 ModelScope(国内推荐)
pip install -U modelscope
modelscope download --model Qwen/Qwen3-ASR-0.6B --local_dir ./Qwen3-ASR-0.6B

# 通过 Hugging Face
pip install -U "huggingface_hub[cli]"
huggingface-cli download Qwen/Qwen3-ASR-0.6B --local-dir ./Qwen3-ASR-0.6B

4. 推理适配

核心适配点

在 NPU 上运行 Qwen3-ASR 的关键在于:

  1. 设备映射:使用 device_map="npu:0" 或手动将模型 .to("npu:0")
  2. 数据类型:推荐使用 torch.bfloat16(NPU 原生支持,无精度损失)
  3. 模型注册:qwen-asr 包自动将 Qwen3ASRForConditionalGeneration 注册到 transformers

推理脚本

import torch
import torch_npu
from qwen_asr import Qwen3ASRModel

# 加载模型(自动注册 + NPU 部署)
model = Qwen3ASRModel.from_pretrained(
    "Qwen/Qwen3-ASR-0.6B",          # 或本地路径
    dtype=torch.bfloat16,
    device_map="npu:0",              # 关键:映射到 NPU
    max_inference_batch_size=32,
    max_new_tokens=256,
)

# 单文件推理
results = model.transcribe(
    audio="audio.wav",
    language="Chinese",     # 可选:语言提示
)
print(results[0].language)  # 检测到的语言
print(results[0].text)      # 识别文本

启动命令

# 单文件推理(英文自动检测)
python scripts/inference.py --audio assets/asr_en_sample.wav

# 单文件推理(指定语言)
python scripts/inference.py --audio assets/asr_zh_sample.wav --language Chinese

# 批量推理
python scripts/inference.py --batch assets/asr_zh_sample.wav assets/asr_en_sample.wav

# 列出支持的语言
python scripts/inference.py --list-languages

5. Smoke 验证

中文语音识别

python scripts/inference.py --audio assets/asr_zh_sample.wav --language Chinese

输出示例:

Language   : Chinese
Text       : 甚至出现交易几乎停滞的情况。
Time       : 5.009s

英文语音识别

python scripts/inference.py --audio assets/asr_en_sample.wav

输出示例:

Language   : English
Text       : Hmm. Oh yeah, yeah. He wasn't even that big when I started listening to him...
Time       : 36.891s

验证结果:

  • ✅ 模型正常加载到 Ascend910 NPU
  • ✅ 中英文语音识别结果合理
  • ✅ 语言自动检测功能正常
  • ✅ 语言强制指定功能正常

6. 精度评测

评测方法

使用相同音频在不同精度下进行转录对比:

对比组设备数据类型
BaselineNPUfloat32
测试NPUbfloat16

评测指标

  • CER (Character Error Rate):字符级错误率
  • WER (Word Error Rate):词级错误率

精度结果

python scripts/accuracy_eval.py
测试音频语言float32 结果bfloat16 结果CERWER
asr_zh_sample.wavChinese甚至出现交易几乎停滞的情况。甚至出现交易几乎停滞的情况。0.00%0.00%
asr_en_sample.wavEnglishHmm. Oh yeah, yeah...Hmm. Oh yeah, yeah...0.00%0.00%
平均0.00%0.00%

结论:bfloat16 与 float32 的推理结果完全一致,CER/WER 均为 0.00%,远优于 < 1% 的要求。

精度保障说明:

  • Ascend910 对 bfloat16 的硬件支持完善,舍入误差与 GPU 等效
  • qwen-asr 的 transformers 后端使用 eager attention,计算确定性高
  • 音频特征提取(WhisperFeatureExtractor)在 CPU 上进行,不引入设备差异

7. 性能参考

测试条件

参数值
NPUAscend910 (单卡)
数据类型bfloat16
预热轮数1
测试轮数3(取平均值)
max_new_tokens512
max_inference_batch_size64

评测命令

python scripts/perf_eval.py --warmup 1 --runs 3

单文件延迟

音频时长(s)文件大小平均延迟(ms)中位延迟(ms)RTF吞吐量
asr_zh_sample.wav4.20131KB116211750.28x0.86 files/s
asr_en_sample.wav15.052121KB646751880.43x0.15 files/s

RTF (Real-Time Factor):

  • RTF < 1 表示处理速度快于实时
  • 中文音频:0.28x(1 秒音频处理 0.28 秒)
  • 英文音频:0.43x(音频较长,含更多解码步骤)

性能优化建议

  1. 使用 bfloat16:比 float32 减少 50% 显存带宽,推理速度提升约 30%
  2. 增大批处理量:使用 --max-batch-size 64 充分利用 NPU 并行能力
  3. 控制 max_new_tokens:根据音频时长调整,避免不必要的解码
  4. 长音频分片:模型自动分片处理(最长 1200s),分片间无重叠

8. 部署架构

┌──────────────┐     ┌─────────────────┐     ┌──────────────────┐
│  音频输入     │────▶│ Audio Preprocess │────▶│ Qwen3-ASR-0.6B    │
│ (WAV/URL)    │     │ (16kHz mono)    │     │ (Ascend910 NPU)  │
└──────────────┘     └─────────────────┘     └────────┬─────────┘
                                                       │
                                                       ▼
┌──────────────┐     ┌─────────────────┐     ┌──────────────────┐
│  转录结果     │◀────│ Post-process    │◀────│  文本解码         │
│ (JSON/Text)  │     │ (CER/语言过滤)   │     │ (Qwen3 Decoder) │
└──────────────┘     └─────────────────┘     └──────────────────┘

9. 注意事项

1. 设备映射

  • 使用 accelerate 时需确认支持 NPU 设备映射
  • 若 device_map 不生效,可使用 model.to("npu:0") 手动移动

2. 数据类型

  • bfloat16 在 Ascend910 上有原生硬件支持,推荐使用
  • float16 在某些算子下可能出现溢出,建议优先使用 bfloat16

3. 音频格式

  • 支持输入:本地 WAV 文件、URL、Base64、(np.ndarray, sr) 元组
  • 内部统一转为 16kHz mono float32

4. 内存管理

  • 单次推理约占用 4-6GB NPU 显存(bfloat16)
  • 批量推理时留意 max_inference_batch_size 参数
  • 可通过 NPU_DEVICE 环境变量指定使用的 NPU 卡号

5. 环境变量参考

# NPU 配置
export NPU_DEVICE=0                    # 使用 NPU 设备索引
export ASCEND_RT_VISIBLE_DEVICES=0     # 可见 NPU 设备
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

10. 文件结构

Qwen3-ASR-0.6B-NPU/
├── README.md                           # 本调优文档
├── assets/                             # 测试音频
│   ├── asr_zh_sample.wav               # 中文测试音频
│   └── asr_en_sample.wav               # 英文测试音频
├── scripts/
│   ├── inference.py                    # NPU 推理脚本
│   ├── accuracy_eval.py               # 精度评测脚本
│   ├── perf_eval.py                   # 性能评测脚本
│   └── gen_test_audio.py              # 合成测试音频
├── results/
│   ├── perf_results.json               # 性能测试结果
│   └── accuracy_report.json           # 精度评测报告
└── logs/                              # 运行日志