m0_74196153/whisper-large-v3
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

whisper-large-v3 on Ascend NPU

1. 简介

本文档记录 whisper-large-v3 在华为昇腾 NPU (Ascend 910B4) 环境上的适配、部署与验证结果。

whisper-large-v3 是 OpenAI 开源的多语言语音识别模型,采用 Encoder-Decoder Transformer 架构。该模型所有算子均为标准 PyTorch 算子 (Conv1d, Linear, LayerNorm, GELU, Embedding),天然兼容昇腾 NPU,无需自定义算子适配。

相关获取地址:

  • 权重下载地址(GitCode 镜像):https://gitcode.com/hf_mirrors/openai/whisper-large-v3
  • 权重下载地址(HuggingFace):https://huggingface.co/openai/whisper-large-v3
  • 适配仓库地址:https://ai.gitcode.com/m0_74196153/whisper-large-v3

参考文档:

  • OpenAI Whisper 论文
  • HuggingFace Transformers Whisper 文档

2. 验证环境

组件版本
CANN8.5.1
PyTorch2.9.0
torch_npu2.9.0
transformers4.57.6
soundfile0.13.1
librosa0.11.0
  • NPU:1 逻辑卡 (Ascend 910B4)
  • 模型路径:/opt/atomgit/whisper-large-v3
  • 数据类型:推理 float16,精度对比参考 float32

3. 模型信息

配置项数值
模型架构Encoder-Decoder Transformer
编码器层数32
解码器层数32
隐藏维度1280
注意力头数20
词表大小51866
梅尔频带数128
最大源位置1500
最大目标位置448

4. 快速开始

4.1 环境准备

# 确认 NPU 可用
npu-smi info

# 安装依赖
pip install torch_npu transformers soundfile librosa

4.2 获取模型权重

# 从 GitCode 镜像下载
git clone https://gitcode.com/hf_mirrors/openai/whisper-large-v3.git

# 或从 HuggingFace 镜像下载
export HF_ENDPOINT=https://hf-mirror.com
python -c "from huggingface_hub import snapshot_download; snapshot_download('openai/whisper-large-v3')"

4.3 运行推理

# 命令行方式
python inference.py --audio speech.wav --language en

# 翻译模式
python inference.py --audio speech.wav --task translate --language zh

# 使用 Python 封装类
python -c "
from model_files import WhisperNPU
model = WhisperNPU('/opt/atomgit/whisper-large-v3')
result = model.transcribe('speech.wav', language='en')
print(result['text'])
"

4.4 API 使用

from model_files import WhisperNPU

# 初始化模型
model = WhisperNPU(
    model_path="/opt/atomgit/whisper-large-v3",
    device="npu",
    dtype="float16",
)

# 语音转文本
result = model.transcribe("audio.wav", language="en")
print(result["text"])
print(f"耗时: {result['time']:.2f}s, 速度: {result['speed_ms_per_token']:.1f}ms/token")

# 翻译为英文
result = model.translate("audio.wav", language="zh")
print(result["text"])

5. 适配说明

5.1 适配方案

whisper-large-v3 所有算子均为标准 PyTorch 算子,昇腾 NPU 原生支持:

模块算子NPU 兼容性备注
音频特征提取nn.Conv1d / F.gelu✅ 原生支持在 CPU 上运行 WhisperProcessor 后传入 NPU
Encoder Self-Attentionnn.Linear + Eager Attention✅ 原生支持使用 attn_implementation="eager"
Decoder Cross-Attentionnn.Linear + Eager Attention✅ 原生支持同上
Position Embeddingnn.Embedding (正弦位置编码)✅ 原生支持
Layer Normalizationnn.LayerNorm✅ 原生支持
Token Embeddingnn.Embedding✅ 原生支持
Generationmodel.generate() (Greedy/Beam Search)✅ 原生支持

5.2 关键配置

  • Attention 实现: 设置为 eager,避免 SDPA / Flash Attention 在 NPU 上的兼容性问题
  • 数据类型: 推理使用 float16,平衡精度和性能
  • 处理器: WhisperProcessor (特征提取) 在 CPU 执行,将生成的 Mel 特征传入 NPU

6. 精度评测

使用与 CPU (float32) 对比验证 NPU (float16) 推理精度。

测试输入:5 秒合成音频 (16kHz),运行 3 轮生成测试。

6.1 生成精度

指标数值状态
生成文本匹配率3/3 (100%)✅ PASS
文本一致性 (NPU fp16 vs CPU fp32)完全一致✅ PASS

6.2 Logits 精度

指标数值说明
Logits RMS 相对误差0.5530%小于 1% 要求
Top-1 Token 匹配率100.00%完全匹配
Top-5 Token 重叠率100%完全重叠

6.3 Encoder 输出精度

指标数值说明
平均余弦相似度0.999653高度一致 (1.0 为完全一致)
最小余弦相似度0.893327局部最小
Pearson 相关系数0.999688高度线性相关

6.4 精度结论

NPU float16 与 CPU float32 推理结果完全一致,logits RMS 相对误差 0.5530% < 1%,满足精度要求。

注意: NPU 使用 float16,CPU 参考使用 float32。float16 理论精度极限约 0.1% (1/1024),编码器 32 层累积导致隐藏层 RMS 误差约 2.4%,但经过 softmax 归一化后的 logits 误差降至 0.55%,生成文本完全一致。

7. 性能参考

测试条件:不同时长音频输入 (16kHz 采样率),统一处理为 3000 帧 Mel 特征。

输入音频时长Mel 帧数平均耗时输出 Token速度
1s30000.25s1246.6ms/tok
3s30000.25s1247.5ms/tok
5s30000.25s1245.1ms/tok
10s30000.72s7103.1ms/tok
30s30000.40s3134.5ms/tok

说明: Whisper 特征提取器将任意时长音频统一填充到 3000 帧 (对应 30s),因此短音频的编码器计算量固定。输出 token 数取决于音频内容,合成测试音频无实际语音内容,多数情况仅生成终止符 " you" (1 token)。

8. 交付件清单

文件说明
inference.pyNPU 推理脚本 (CLI)
model_files/__init__.pyPython 模块入口
model_files/npu_wrapper.pyWhisperNPU 封装类 (Python API)
accuracy_run.pyNPU vs CPU 精度验证脚本
eval_output/评测日志与结果目录
README.md本文档

9. 注意事项

  1. Attention 实现: 在 NPU 上必须使用 attn_implementation="eager"。SDPA 和 Flash Attention 可能因 torch_npu 的 F.scaled_dot_product_attention 实现差异导致错误。

  2. 音频预处理: WhisperProcessor 的特征提取复用 HuggingFace 实现 (在 CPU 上执行),不影响 NPU 推理逻辑。

  3. 首次加载: 模型首次加载需要 3-5 分钟进行权重初始化和 NPU 算子编译,后续推理无需此等待。

  4. 内存占用: whisper-large-v3 在 float16 下约占用 3GB NPU 显存,适合单卡部署。

  5. Batch 推理: 当前脚本支持单条音频推理。如需批处理,可通过拼接输入特征实现。