文件最后提交记录最后更新时间
12 天前
12 天前
12 天前
12 天前
12 天前
12 天前
12 天前
12 天前
12 天前
12 天前
README

动态 batch 分档(dynamic batch size)ATC 用例

一套完整可复现的动态分档用例:ONNX 生成 -> ATC 分档编译 -> ACL C++ 运行时加载执行 -> 与 onnxruntime CPU 结果对拍。

已在本机验证通过(2026-08-24):

  • 芯片:Ascend910_9362(npu-smi 可见,torch_npu get_device_properties 报告)
  • CANN:/home/developer/Ascend/cann-9.2.0(ATC 版本 9.2.0)
  • 系统:aarch64 / g++ 9.4.0
  • 结果:batch=1/2/4/8 四档全部执行成功,最大绝对误差 < 1e-3,RESULT: PASS

目录内容

文件 说明
gen_onnx.py 生成动态 batch ONNX 模型及各档位输入/期望输出
atc.sh ATC 动态分档编译脚本(--dynamic_batch_size="1,2,4,8"
main.cpp ACL C++ 运行时:加载 OM、查询分档信息、逐档执行并对拍
Makefile 编译 run_dyncase(链接 -lascendcl
run_all.sh 一键全流程:生成 -> 编译 -> 构建 -> 上板验证
model.onnx 生成的动态 batch 模型(输入 [-1,3,224,224]
model_dyn_bs.om ATC 产出的离线模型
data/input_{1,2,4,8}.bin 各档位输入(float32 NCHW)
data/expected_{1,2,4,8}.bin onnxruntime CPU 期望输出(float32,b×10)

模型结构

input [-1, 3, 224, 224]        # batch 维动态
  Conv(3->8, 3x3, pad=1) -> ReLU -> MaxPool(2x2)     # 224 -> 112
  Conv(8->16, 3x3, pad=1) -> ReLU -> AveragePool(2x2) # 112 -> 56
  Flatten -> MatMul(50176->10) -> Add(bias)           # output [-1, 10]

权重用固定 seed(numpy.random.default_rng)生成,可完全复现。

使用方法

cd dynamic_batch_atc_case
./run_all.sh                 # 全流程,默认 soc_version=Ascend910_9362
./run_all.sh Ascend910B3     # 或指定其他 soc_version

分步执行:

python3 gen_onnx.py   # 1. 生成 model.onnx + data/*.bin
bash atc.sh           # 2. ATC 编译出 model_dyn_bs.om
make && ./run_dyncase # 3. 编译并上板执行对拍

关键点说明

  1. ATC 分档参数:batch 维写 -1,配合 --dynamic_batch_size 列出档位:

    atc --framework=5 --model=model.onnx --output=model_dyn_bs \
        --soc_version=Ascend910_9362 \
        --input_shape="input:-1,3,224,224" \
        --dynamic_batch_size="1,2,4,8"
    

    ATC 按**最大档位(8)**分配输入/输出 buffer(input[0] 4816896B = 8×3×224×224×4)。

  2. 运行时切档:动态分档模型比原始模型多一个 4 字节的 batch 辅助输入 (inputs=2, input[1] size=4)。执行前调用:

    aclmdlSetDynamicBatchSize(modelId, inputDataset, 0, batch);
    

    当前档位即写入该辅助输入;执行后输出仅前 batch×10 个 float 有效。

  3. 档位查询aclmdlGetDynamicBatch(desc, &batchInfo) 从 OM 中读出全部档位, 本例运行时打印 dynamic batch gears (4): 1 2 4 8

  4. 对拍标准|npu - ref| <= 1e-3 + 1e-4*|ref|,与 onnxruntime CPU EP 比, 实测最大绝对误差 ~8.8e-4。

环境适配备注(本机踩坑记录)

  • onnx 1.22 将 AvgPool 更名为 AveragePool(旧名从 schema 注册表移除), 本例直接使用新名,本机 ATC 9.2.0 可正常解析。
  • onnx 1.22 / onnxruntime 1.29 的 Gemm 在符号(动态)batch 维下符号形状推断 有 bug(strict 推断报 Dimension mismatch in unification),故全连接层用 MatMul + Add 实现,功能等价且 ATC 支持良好。
  • ACL 头文件中 aclmdlGetNumInputs/aclmdlGetInputSizeByIndex 等接受非 const aclmdlDesc*,而 aclmdlGetDynamicBatch 接受 const 指针,写 demo 时注意。

依赖

  • python3: onnx, onnxruntime, numpy
  • CANN Toolkit(含 atc 与 libascendcl.so),环境变量 ASCEND_HOME_PATH 已设置 (Makefile 回退路径:/home/developer/Ascend/cann-9.2.0
  • NPU 驱动正常(npu-smi info 可见设备)