本文档记录 wav2vec2-large-xlsr-53-greek 在昇腾 NPU(Ascend 910B4)上的适配、推理与精度验证结果。该模型为希腊语语音识别模型,基于 Wav2Vec2 架构,使用 CTC 解码。
| 组件 | 版本 |
|---|---|
transformers | 4.57.6 |
torch | 2.9.0+cpu |
torch-npu | 2.9.0.post1+gitee7ba04 |
datasets | 4.8.5 |
librosa | 0.11.0 |
soundfile | 0.13.1 |
Ascend 910B4,1 逻辑卡8.5.13.11.14本项目采用 torch_npu.contrib.transfer_to_npu 自动迁移方案,无需修改模型内部代码,仅需在入口脚本所有 import 之前注入以下两行:
import torch_npu
from torch_npu.contrib import transfer_to_nputransfer_to_npu 会自动完成以下映射:
| 原始 CUDA API | 自动映射目标 |
|---|---|
torch.cuda.is_available() | 返回 True(NPU 可用时) |
torch.Tensor.cuda() / nn.Module.cuda() | .npu() |
torch.device('cuda') | torch.device('npu') |
torch.cuda.* 系列 API | torch.npu.* |
import torch
import numpy as np
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
import librosa
MODEL_NAME = "./modelscope_cache/jonatasgrosman/wav2vec2-large-xlsr-53-greek"
def generate_test_audio(sr=16000, duration=3.0):
t = np.linspace(0, duration, int(sr * duration), endpoint=False)
audio = 0.5 * np.sin(2 * np.pi * 440 * t) + 0.3 * np.sin(2 * np.pi * 880 * t)
rng = np.random.default_rng(42)
audio = audio + 0.01 * rng.standard_normal(audio.shape)
return audio.astype(np.float32), sr
processor = Wav2Vec2Processor.from_pretrained(MODEL_NAME)
model = Wav2Vec2ForCTC.from_pretrained(MODEL_NAME)
model.eval()
audio, sr = generate_test_audio()
audio = librosa.resample(audio, orig_sr=sr, target_sr=16000)
inputs = processor(audio, sampling_rate=16000, return_tensors="pt", padding=True)
with torch.no_grad():
outputs = model(inputs.input_values)
logits = outputs.logits
print(f"logits shape: {logits.shape}")import torch_npu
from torch_npu.contrib import transfer_to_npu
import torch
import numpy as np
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
import librosa
MODEL_NAME = "./modelscope_cache/jonatasgrosman/wav2vec2-large-xlsr-53-greek"
def generate_test_audio(sr=16000, duration=3.0):
t = np.linspace(0, duration, int(sr * duration), endpoint=False)
audio = 0.5 * np.sin(2 * np.pi * 440 * t) + 0.3 * np.sin(2 * np.pi * 880 * t)
rng = np.random.default_rng(42)
audio = audio + 0.01 * rng.standard_normal(audio.shape)
return audio.astype(np.float32), sr
processor = Wav2Vec2Processor.from_pretrained(MODEL_NAME)
model = Wav2Vec2ForCTC.from_pretrained(MODEL_NAME)
model.eval()
model.to("npu:0")
audio, sr = generate_test_audio()
audio = librosa.resample(audio, orig_sr=sr, target_sr=16000)
inputs = processor(audio, sampling_rate=16000, return_tensors="pt", padding=True)
input_values = inputs.input_values.to("npu:0")
with torch.no_grad():
outputs = model(input_values)
logits = outputs.logits
print(f"logits shape: {logits.shape}, device: {logits.device}")使用合成音频(3 秒,16kHz,440Hz + 880Hz 正弦波叠加噪声)作为输入,对比 NPU 与 CPU 输出的 logits。
| 指标 | 数值 | 说明 |
|---|---|---|
| Argmax 一致率 | 100.00% | 每个时间步的预测类别完全一致 |
| 全范围相对误差 | 0.1195% | 最大绝对误差 / logits 动态范围 |
| 余弦相似度 | 0.99999964 | 输出向量方向几乎完全一致 |
| 最大绝对误差 | 2.53e-02 | 相对于 logits 范围(~21)可忽略 |
| 均方根误差 | 5.70e-03 | - |
| Top-1 一致率 | 100.00% | - |
| Top-3 一致率 | 100.00% | - |
| Top-5 一致率 | 99.33% | - |
argmax 预测在每个时间步上完全相同,CTC 解码后的转写结果完全一致。在 Ascend 910B4 单卡上,使用 3 秒合成音频进行单条推理:
| 指标 | CPU | NPU |
|---|---|---|
| 首次加载模型 | ~12s | ~15s(含算子编译) |
| 单条推理耗时 | ~280ms | ~45ms |
| 加速比 | - | ~6.2x |
注:NPU 首次运行需编译算子,二次运行可复用编译缓存,推理延迟稳定。
torch_npu 自动将 float64 降级为 float32,因为 Ascend910 不支持 double 精度。本模型本身为 float32,不受影响。sampling_rate=16000。wav2vec2-npu-adapt/
├── baseline_cpu.py # CPU 参考推理脚本
├── inference_npu.py # NPU 推理脚本(含 transfer_to_npu)
├── accuracy_compare.py # 精度对比验证脚本
├── README.md # 本文档
└── modelscope_cache/ # 本地模型权重
└── jonatasgrosman/
└── wav2vec2-large-xlsr-53-greek/
├── config.json
├── pytorch_model.bin
├── preprocessor_config.json
└── vocab.json# 1. 环境准备
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0
# 2. 安装依赖
pip install transformers datasets librosa soundfile -i https://repo.huaweicloud.com/repository/pypi/simple/
# 3. 下载模型(如未下载)
python3 -c "from modelscope import snapshot_download; snapshot_download('jonatasgrosman/wav2vec2-large-xlsr-53-greek', cache_dir='./modelscope_cache')"
# 4. 运行 NPU 推理
python3 inference_npu.py
# 5. 精度对比
python3 accuracy_compare.py