DiariZen / analysis.md
inoryQwQ's picture
Upload folder using huggingface_hub
37c4768 verified
|
Raw
History Blame Contribute Delete
4.56 kB

Magnetar 技术分析

初始判断

  • 模型来源是 GitHub 仓库 DiariZen,已隔离 clone 到任务目录,不修改上游源码。
  • 目标硬件为 AX650,编译配置需要设置 npu_mode=NPU3。
  • ACQUIRE 扫描未发现 .pt/.pth/.onnx/.safetensors 等权重,需从 README 或外部下载入口确认主模型。
  • 未提供 BOARD,因此 RUNONBOARD 按流程记录为跳过。

主模型选择

  • 根 README 的推理示例指定 ,因此将其作为默认主模型。
  • DiariZen 完整 pipeline 包含分割模型、embedding 模型和聚类后处理;AXMODEL 优先导出可 NPU 化的分割神经网络 ,聚类/RTTM 后处理保留在 SDK CPU 侧实现。

主模型选择(修正)

  • 根 README 的推理示例指定 BUT-FIT/diarizen-wavlm-large-s80-md,因此将其作为默认主模型。
  • DiariZen 完整 pipeline 包含分割模型、embedding 模型和聚类后处理;AXMODEL 优先导出可 NPU 化的分割神经网络 pytorch_model.bin,聚类/RTTM 后处理保留在 SDK CPU 侧实现。

环境管理修正

  • 用户要求虚拟环境统一使用 uv 管理。
  • 已移除先前 python -m venv/pip 创建的半成品 cache/venv,后续使用 uv venv 与 uv pip。

EXPORT 问题:opset17 LayerNormalization

  • torch.onnx.export 使用 opset 17 时生成 /LayerNormalization 节点,ONNX checker 报 input 1 is marked single but has an empty string
  • 判断为 PyTorch 2.1.1 对部分 LayerNorm/GroupNorm 图的 ONNX opset17 导出兼容问题。
  • 修复策略:降级到 opset 16,让 LayerNorm 分解为基础算子后再进行 ONNX checker 与 ONNXRuntime 对分。

COMPILE 配置修正

  • Pulsar2 20260520 镜像中 compiler.check 是整数/枚举字段,不接受 JSON bool false。
  • 已移除该字段,避免配置解析失败;不启用 highest_mix_precision。

COMPILE 问题:Pulsar2 Fuse_LayerNormalization_v2 transformation check

  • 首次完整编译在 Pulsar2 ONNX 优化阶段失败,位置为 float_optimizations.Fuse_LayerNormalization_v2
  • 差异约 max_abs_diff=0.00215,发生在输入 waveform 的前端归一化子图,属于 Pulsar2 transformation 校验容差失败。
  • 尝试配置 onnx_opt.disable_transformation_check=true,不修改 ONNX 语义,不启用 highest_mix_precision。

COMPILE STOP:长序列 attention Gather tiling 失败

  • 16 秒输入产生 799 帧,WavLM attention 中出现 (1,16,799,799) 的注意力张量。
  • Pulsar2 在 AX650/NPU3 后端 tiling /layers.0/attention/Gather_1 时失败,workspace/mem_limit 不足或 Gather tiler 不支持该切片模式。
  • 这属于需要修改模型图或导出策略的 COMPILE STOP,按流程暂停等待用户确认。
  • 可选方案:
    1. 缩短静态输入窗口(例如 4s/8s),降低 attention 二次复杂度;需要重新 EXPORT/COMPILE/SIMULATE。
    2. 拆分 WavLM 与后端 Conformer,只编译后端或部分子图;SDK 侧保留 WavLM CPU/其他后端。
    3. 尝试不同 Pulsar2 版本或 compiler slice/tile 配置,但不保证解决 AxGather tiling。
    4. 改导出策略规避 Gather attention pattern。

4s 策略结果

  • 已按用户确认将静态导出窗口从 16s 降到 4s。
  • 4s ONNX 与 PyTorch 对分通过,cosine 接近 1,说明导出本身有效。
  • Pulsar2 量化完成,MACs 降至约 16.6G,但 NPU 后端仍在同一 /layers.0/attention/Gather_1 失败。
  • 判断:当前主要阻塞是 WavLM attention 导出图里的 Gather pattern 与 AX650 NPU backend tiler 不兼容;仅缩短到 4s 不足以解决。

Pulsar2 source patch validation

  • User pointed out source Pulsar2 should be launched with USE_PULSAR2 (conda activate npu; source script/npu_dev).
  • In /home/yrz/Codes/npu-codebase, the AX650 gather builder bug was localized to axnn/axnn/backend/ax650npu/oprimpl/gather.py.
  • Root cause: when tx.strides[dim] > max_stride, the split workaround used tx[:, start:end], which supplies only two slice entries. For a collapsed 3-D tensor (1,16,44576), this accidentally slices dimension 1 and fails Tensor.__getitem__ because rank is 3. The intended split is along the last contiguous payload dimension.
  • Patch: replace tx[:, start:end] with tx[..., start:end], and reuse the same ellipsis slice for the output tensor.
  • Source Pulsar2 validation (compile_4s_srcpatch/compile.log) no longer fails at /layers.0/attention/Gather_1; compilation proceeds past Gather tiling and now stops later at AxQuantizedLayerNorm for /Gather_output_0 shape (1,64000).