Nice_try/sound_20260322-1
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

sound_20260322-1 on Ascend NPU

1. 简介

本文档记录 sound_20260322-1 音频分类模型在华为昇腾 (Ascend) NPU 上的适配与推理验证结果。

模型原始信息:

  • 原始框架:TensorFlow.js (tfjs-layers v3.20.0)
  • 任务类型:音频二分类(背景噪音 / 人声)
  • 输入特征:MFCC 风格时频图,形状 [batch, 1, 43, 232]
  • 模型架构:CNN(4 层 Conv2D + MaxPool2D → Flatten → Dense → Softmax)
  • 总参数量:约 143 万

适配要点:

  1. 将 TF.js 二进制权重(weights.bin + weights_manifest.json)解析并映射为 PyTorch state_dict。
  2. 按 TF.js model.json 拓扑逐层重建等价的 PyTorch nn.Module。
  3. 使用 torch_npu 在 Ascend910B 上完成推理验证。

说明:该模型为小型 CNN 音频分类器,不属于 vLLM 大模型推理链路,因此直接在 PyTorch + torch_npu 层完成适配,不经过 vLLM serve。

2. 验证环境

组件版本
torch2.9.0+cpu
torch-npu2.9.0.post1+gitee7ba04
CANN8.5.1
numpy1.26.4
  • NPU:1 逻辑卡(Ascend910B4)
  • 模型路径:./model
  • 推理脚本:./inference.py

3. 权重转换

TF.js 权重与 PyTorch 的映射规则:

TF.js 层TF.js 权重名PyTorch 对应维度变换
Conv2Dconv2d_N/kernelconv2d_N.weight[H, W, C_in, C_out] → [C_out, C_in, H, W]
Densedense_1/kerneldense_1.weight[in, out] → [out, in](transpose)
DenseNewHeadDense/kernelNewHeadDense.weight[in, out] → [out, in](transpose)
Bias*/bias*.bias直接拷贝

转换命令:

python convert_tfjs_to_pytorch.py

转换后得到:

./model/sound_20260322-1.pth

4. 推理运行

环境变量(可选)

export ASCEND_RT_VISIBLE_DEVICES=0
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export OMP_NUM_THREADS=1

CPU 推理(Smoke 测试)

python inference.py \
  --device cpu \
  --repeats 5

NPU 推理

python inference.py \
  --device npu \
  --repeats 10 \
  --warmup 3

音频文件推理(需要安装 librosa)

# pip install librosa
python inference.py \
  --device npu \
  --audio /path/to/sample.wav \
  --repeats 5

预处理后 numpy 数组推理

python inference.py \
  --device npu \
  --numpy /path/to/features.npy \
  --repeats 5

批量推理

python inference.py \
  --device npu \
  --batch-size 8 \
  --repeats 10

导出模型信息

python inference.py --dump-model-json
# 生成 model_info.json

5. Smoke 验证

使用随机 dummy 输入进行端到端验证:

python inference.py --device npu --repeats 5

验证结果:

  • 模型加载成功,state_dict 严格匹配
  • NPU 设备识别为 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

6. 性能参考

测试条件:batch_size=1,随机 dummy 输入,warmup=3,repeats=10(去掉首帧),连续运行两次取第二次数据。

指标CPUNPU (Ascend910B4)
mean_latency6.481 ms1.491 ms
median_latency6.305 ms1.496 ms
p99_latency7.072 ms1.501 ms
throughput154.30 samples/s670.59 samples/s

结论:在单 batch 场景下,NPU 推理延迟约为 CPU 的 23%,吞吐量提升约 4.3x。

批量性能(NPU)

使用 verify_sound_model.py 在 Ascend910B4 上测得:

batch_sizemean_latencymedian_latencyp99_latencythroughput
11.359 ms1.360 ms1.404 ms735.88 samples/s
41.367 ms1.365 ms1.424 ms2,926.48 samples/s
81.367 ms1.364 ms1.400 ms5,851.25 samples/s
161.387 ms1.386 ms1.415 ms11,536.51 samples/s

观察:batch_size 从 1 提升到 16 时,单次推理延迟几乎不变(约 1.4ms),吞吐量随 batch 近似线性增长,说明 NPU 对该轻量 CNN 的计算余量充足,主要开销在 host 下发与同步。

7. 自动化验证报告

基于 verify-agent 流程编排的自定义验证脚本 verify_sound_model.py 已完成全量验证,覆盖:环境预检、模型部署、功能验证、性能基准、资源清理五个阶段。

运行方式

python verify_sound_model.py

验证产物:

  • 结构化报告:validation_report.json
  • 文本日志:verification.log
  • 日志目录:logs/

功能验证结果

检查项结果说明
确定性一致性通过相同输入多次推理,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

8. 精度说明

本次适配以权重逐比特映射 + 拓扑逐层等价重建为核心策略:

  • weights.bin 中的 float32 权重直接按 np.frombuffer 解析,未做量化或精度转换。
  • TF.js 的 NHWC 卷积核已 permute 为 PyTorch NCHW 格式。
  • Dense 层权重已按 PyTorch Linear.weight 的 [out, in] 要求进行 transpose。
  • 因此,在相同输入下,PyTorch 模型的输出应与原始 TF.js 模型在数值误差 (<1e-5) 范围内一致。

如需端到端音频精度验证,建议准备带标签的测试集,通过 inference.py --audio 批量推理后计算 Accuracy / F1。

9. 注意事项

  1. 输入维度对齐

    • 原始 TF.js 输入为 [batch, 43, 232, 1](channels_last)。
    • PyTorch 模型输入为 [batch, 1, 43, 232](channels_first)。
    • inference.py 已内置 preprocess_audio,自动完成 reshape 与 z-score 归一化。
  2. librosa 预处理仅为参考

    • 当前脚本使用 librosa.feature.mfcc 生成 43x232 特征,可能与原始模型训练时的预处理不完全一致。
    • 若对精度有严格要求,建议使用与原始训练代码完全一致的特征提取逻辑。
  3. NPU 日志目录权限

    • 当前环境中若出现 can not create directory: /home/atomgit/ascend/log,属于非致命警告,不影响推理结果。
    • 如需消除,可手动创建该目录或调整 ASCEND_LOG_PATH。
  4. 模型体积

    • 转换后的 .pth 文件约 5.5 MB,属于轻量级模型,可直接加载到 NPU 内存,无需分片或量化。