| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 |
动态 batch 分档(dynamic batch size)ATC 用例
一套完整可复现的动态分档用例:ONNX 生成 -> ATC 分档编译 -> ACL C++ 运行时加载执行 -> 与 onnxruntime CPU 结果对拍。
已在本机验证通过(2026-08-24):
- 芯片:
Ascend910_9362(npu-smi 可见,torch_npuget_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. 编译并上板执行对拍
关键点说明
-
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)。 -
运行时切档:动态分档模型比原始模型多一个 4 字节的 batch 辅助输入 (
inputs=2, input[1] size=4)。执行前调用:aclmdlSetDynamicBatchSize(modelId, inputDataset, 0, batch);当前档位即写入该辅助输入;执行后输出仅前
batch×10个 float 有效。 -
档位查询:
aclmdlGetDynamicBatch(desc, &batchInfo)从 OM 中读出全部档位, 本例运行时打印dynamic batch gears (4): 1 2 4 8。 -
对拍标准:
|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等接受非 constaclmdlDesc*,而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可见设备)