本文档记录 sound_20260322-1 音频分类模型在华为昇腾 (Ascend) NPU 上的适配与推理验证结果。
模型原始信息:
背景噪音 / 人声)[batch, 1, 43, 232]适配要点:
weights.bin + weights_manifest.json)解析并映射为 PyTorch state_dict。model.json 拓扑逐层重建等价的 PyTorch nn.Module。torch_npu 在 Ascend910B 上完成推理验证。说明:该模型为小型 CNN 音频分类器,不属于 vLLM 大模型推理链路,因此直接在 PyTorch + torch_npu 层完成适配,不经过 vLLM serve。
| 组件 | 版本 |
|---|---|
torch | 2.9.0+cpu |
torch-npu | 2.9.0.post1+gitee7ba04 |
CANN | 8.5.1 |
numpy | 1.26.4 |
1 逻辑卡(Ascend910B4)./model./inference.pyTF.js 权重与 PyTorch 的映射规则:
| TF.js 层 | TF.js 权重名 | PyTorch 对应 | 维度变换 |
|---|---|---|---|
| Conv2D | conv2d_N/kernel | conv2d_N.weight | [H, W, C_in, C_out] → [C_out, C_in, H, W] |
| Dense | dense_1/kernel | dense_1.weight | [in, out] → [out, in](transpose) |
| Dense | NewHeadDense/kernel | NewHeadDense.weight | [in, out] → [out, in](transpose) |
| Bias | */bias | *.bias | 直接拷贝 |
转换命令:
python convert_tfjs_to_pytorch.py转换后得到:
./model/sound_20260322-1.pthexport ASCEND_RT_VISIBLE_DEVICES=0
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export OMP_NUM_THREADS=1python inference.py \
--device cpu \
--repeats 5python inference.py \
--device npu \
--repeats 10 \
--warmup 3# pip install librosa
python inference.py \
--device npu \
--audio /path/to/sample.wav \
--repeats 5python inference.py \
--device npu \
--numpy /path/to/features.npy \
--repeats 5python inference.py \
--device npu \
--batch-size 8 \
--repeats 10python inference.py --dump-model-json
# 生成 model_info.json使用随机 dummy 输入进行端到端验证:
python inference.py --device npu --repeats 5验证结果:
state_dict 严格匹配Ascend910B4[batch, 2],Softmax 概率和为 1.0背景噪音 / 人声 两分类概率正常输出示例输出:
[INFO] Using device: npu:0
[INFO] NPU device: Ascend910B4
[INFO] Loaded checkpoint from ./model/sound_20260322-1.pth
[INFO] Input tensor shape: torch.Size([1, 1, 43, 232])
[RESULT] Sample 0: class=背景噪音, confidence=0.8499, probs={'背景噪音': 0.8499, '人声': 0.1501}
[PERF] Latency: mean=1.491ms, median=1.496ms, p99=1.501ms
[PERF] Throughput: 670.59 samples/sec测试条件:batch_size=1,随机 dummy 输入,warmup=3,repeats=10(去掉首帧),连续运行两次取第二次数据。
| 指标 | CPU | NPU (Ascend910B4) |
|---|---|---|
mean_latency | 6.481 ms | 1.491 ms |
median_latency | 6.305 ms | 1.496 ms |
p99_latency | 7.072 ms | 1.501 ms |
throughput | 154.30 samples/s | 670.59 samples/s |
结论:在单 batch 场景下,NPU 推理延迟约为 CPU 的 23%,吞吐量提升约 4.3x。
使用 verify_sound_model.py 在 Ascend910B4 上测得:
| batch_size | mean_latency | median_latency | p99_latency | throughput |
|---|---|---|---|---|
| 1 | 1.359 ms | 1.360 ms | 1.404 ms | 735.88 samples/s |
| 4 | 1.367 ms | 1.365 ms | 1.424 ms | 2,926.48 samples/s |
| 8 | 1.367 ms | 1.364 ms | 1.400 ms | 5,851.25 samples/s |
| 16 | 1.387 ms | 1.386 ms | 1.415 ms | 11,536.51 samples/s |
观察:batch_size 从 1 提升到 16 时,单次推理延迟几乎不变(约 1.4ms),吞吐量随 batch 近似线性增长,说明 NPU 对该轻量 CNN 的计算余量充足,主要开销在 host 下发与同步。
基于 verify-agent 流程编排的自定义验证脚本 verify_sound_model.py 已完成全量验证,覆盖:环境预检、模型部署、功能验证、性能基准、资源清理五个阶段。
python verify_sound_model.py验证产物:
validation_report.jsonverification.loglogs/| 检查项 | 结果 | 说明 |
|---|---|---|
| 确定性一致性 | 通过 | 相同输入多次推理,max_diff = 0.00e+00 |
| Softmax 合法性 | 通过 | 概率和严格等于 1.0 |
| 输出形状 (BS=1/4/8) | 通过 | 均为 [batch, 2] |
| CPU-NPU 数值一致性 | 通过 | max_diff = 4.45e-05(<1e-4) |
NPU: Ascend910B4 (1 card)
CANN: 8.5.1
torch_npu: 2.9.0.post1+gitee7ba04
torch: 2.9.0+cpu
npu-smi: OK./validation_report.json
./verification.log本次适配以权重逐比特映射 + 拓扑逐层等价重建为核心策略:
weights.bin 中的 float32 权重直接按 np.frombuffer 解析,未做量化或精度转换。NHWC 卷积核已 permute 为 PyTorch NCHW 格式。Linear.weight 的 [out, in] 要求进行 transpose。<1e-5) 范围内一致。如需端到端音频精度验证,建议准备带标签的测试集,通过 inference.py --audio 批量推理后计算 Accuracy / F1。
输入维度对齐
[batch, 43, 232, 1](channels_last)。[batch, 1, 43, 232](channels_first)。inference.py 已内置 preprocess_audio,自动完成 reshape 与 z-score 归一化。librosa 预处理仅为参考
librosa.feature.mfcc 生成 43x232 特征,可能与原始模型训练时的预处理不完全一致。NPU 日志目录权限
can not create directory: /home/atomgit/ascend/log,属于非致命警告,不影响推理结果。ASCEND_LOG_PATH。模型体积
.pth 文件约 5.5 MB,属于轻量级模型,可直接加载到 NPU 内存,无需分片或量化。