本文档记录 whisper-large-v3 在华为昇腾 NPU (Ascend 910B4) 环境上的适配、部署与验证结果。
whisper-large-v3 是 OpenAI 开源的多语言语音识别模型,采用 Encoder-Decoder Transformer 架构。该模型所有算子均为标准 PyTorch 算子 (Conv1d, Linear, LayerNorm, GELU, Embedding),天然兼容昇腾 NPU,无需自定义算子适配。
相关获取地址:
参考文档:
| 组件 | 版本 |
|---|---|
CANN | 8.5.1 |
PyTorch | 2.9.0 |
torch_npu | 2.9.0 |
transformers | 4.57.6 |
soundfile | 0.13.1 |
librosa | 0.11.0 |
1 逻辑卡 (Ascend 910B4)/opt/atomgit/whisper-large-v3float16,精度对比参考 float32| 配置项 | 数值 |
|---|---|
| 模型架构 | Encoder-Decoder Transformer |
| 编码器层数 | 32 |
| 解码器层数 | 32 |
| 隐藏维度 | 1280 |
| 注意力头数 | 20 |
| 词表大小 | 51866 |
| 梅尔频带数 | 128 |
| 最大源位置 | 1500 |
| 最大目标位置 | 448 |
# 确认 NPU 可用
npu-smi info
# 安装依赖
pip install torch_npu transformers soundfile librosa# 从 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')"# 命令行方式
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'])
"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"])whisper-large-v3 所有算子均为标准 PyTorch 算子,昇腾 NPU 原生支持:
| 模块 | 算子 | NPU 兼容性 | 备注 |
|---|---|---|---|
| 音频特征提取 | nn.Conv1d / F.gelu | ✅ 原生支持 | 在 CPU 上运行 WhisperProcessor 后传入 NPU |
| Encoder Self-Attention | nn.Linear + Eager Attention | ✅ 原生支持 | 使用 attn_implementation="eager" |
| Decoder Cross-Attention | nn.Linear + Eager Attention | ✅ 原生支持 | 同上 |
| Position Embedding | nn.Embedding (正弦位置编码) | ✅ 原生支持 | |
| Layer Normalization | nn.LayerNorm | ✅ 原生支持 | |
| Token Embedding | nn.Embedding | ✅ 原生支持 | |
| Generation | model.generate() (Greedy/Beam Search) | ✅ 原生支持 |
eager,避免 SDPA / Flash Attention 在 NPU 上的兼容性问题float16,平衡精度和性能WhisperProcessor (特征提取) 在 CPU 执行,将生成的 Mel 特征传入 NPU使用与 CPU (float32) 对比验证 NPU (float16) 推理精度。
测试输入:5 秒合成音频 (16kHz),运行 3 轮生成测试。
| 指标 | 数值 | 状态 |
|---|---|---|
| 生成文本匹配率 | 3/3 (100%) | ✅ PASS |
| 文本一致性 (NPU fp16 vs CPU fp32) | 完全一致 | ✅ PASS |
| 指标 | 数值 | 说明 |
|---|---|---|
| Logits RMS 相对误差 | 0.5530% | 小于 1% 要求 |
| Top-1 Token 匹配率 | 100.00% | 完全匹配 |
| Top-5 Token 重叠率 | 100% | 完全重叠 |
| 指标 | 数值 | 说明 |
|---|---|---|
| 平均余弦相似度 | 0.999653 | 高度一致 (1.0 为完全一致) |
| 最小余弦相似度 | 0.893327 | 局部最小 |
| Pearson 相关系数 | 0.999688 | 高度线性相关 |
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%,生成文本完全一致。
测试条件:不同时长音频输入 (16kHz 采样率),统一处理为 3000 帧 Mel 特征。
| 输入音频时长 | Mel 帧数 | 平均耗时 | 输出 Token | 速度 |
|---|---|---|---|---|
| 1s | 3000 | 0.25s | 1 | 246.6ms/tok |
| 3s | 3000 | 0.25s | 1 | 247.5ms/tok |
| 5s | 3000 | 0.25s | 1 | 245.1ms/tok |
| 10s | 3000 | 0.72s | 7 | 103.1ms/tok |
| 30s | 3000 | 0.40s | 3 | 134.5ms/tok |
说明: Whisper 特征提取器将任意时长音频统一填充到 3000 帧 (对应 30s),因此短音频的编码器计算量固定。输出 token 数取决于音频内容,合成测试音频无实际语音内容,多数情况仅生成终止符 " you" (1 token)。
| 文件 | 说明 |
|---|---|
inference.py | NPU 推理脚本 (CLI) |
model_files/__init__.py | Python 模块入口 |
model_files/npu_wrapper.py | WhisperNPU 封装类 (Python API) |
accuracy_run.py | NPU vs CPU 精度验证脚本 |
eval_output/ | 评测日志与结果目录 |
README.md | 本文档 |
Attention 实现: 在 NPU 上必须使用 attn_implementation="eager"。SDPA 和 Flash Attention 可能因 torch_npu 的 F.scaled_dot_product_attention 实现差异导致错误。
音频预处理: WhisperProcessor 的特征提取复用 HuggingFace 实现 (在 CPU 上执行),不影响 NPU 推理逻辑。
首次加载: 模型首次加载需要 3-5 分钟进行权重初始化和 NPU 算子编译,后续推理无需此等待。
内存占用: whisper-large-v3 在 float16 下约占用 3GB NPU 显存,适合单卡部署。
Batch 推理: 当前脚本支持单条音频推理。如需批处理,可通过拼接输入特征实现。