Horizon 模型多 Batch 配置
一、基础概念
1. input_shape
单 batch(N=1):
多 batch(N>1,静态):
2. input_batch
使用前提:
- input_shape 第一维必须为 1
原始 ONNX 模型本身需支持 batch 推理
配置示例:
最终生成的模型支持 batch=4 的输入。
方式 | 说明 |
|---|---|
input_shape: 4x3x224x224 | 静态多 batch,shape 固定,校准数据也必须是 batch=4 |
input_shape: 1x3x224x224 + input_batch: 4 | 动态多 batch,校准数据只需 batch=1,更灵活 |
3. separate_batch
separate_batch: True
每个 batch 独立送入,不要求内存连续:
这个选项主要用于 NV12 / pyramid 图像输入场景,因为摄像头出来的帧天然是一帧一帧独立的,无法合并为连续 buffer。
二、两种模型导出形态
明确了三个参数之后,模型导出主要对应两种形态。
形态一:静态多 Batch 模型
编译时 batch 就固定了。
特点与限制:
batch size 不可修改
- 校准数据(calibration data)的 shape 必须与之完全匹配,即也需要是 (4, 3, 224, 224)
- 不支持 input_batch 参数(两者冲突)
- 不涉及 separate_batch,输入本身就是连续 tensor
形态二:动态多 Batch 模型
特点与限制:
校准数据只需 batch=1,准备简单
- batch size 可以在不同部署场景中灵活调整,只需修改 input_batch
推理时实际送入的是 batch=4 的数据,runtime 内部负责调度
是工程部署的推荐方式
三、三种部署方案
根据输入数据来源和处理方式的不同,实际部署中对应三种方案。
方案一:静态多 Batch + Featuremap 输入
适用场景:
输入数据已经过外部预处理(resize、归一化等),以 tensor 形式直接输入,不走板端图像处理流水线。模型 shape 固定,batch 不需要变化。
配置:
数据准备:
注意:
不能在此方案中使用板端 resize / crop 等图像预处理操作,一旦 batch > 1 并且使用了图像预处理,编译阶段就会报错:
方案二:动态多 Batch + Featuremap 输入
适用场景:
同样是预处理好的 tensor 输入,但希望部署更灵活,不想每次改 batch 都重新编译,或者校准数据准备成本较高。
配置:
数据准备:
校准数据只需准备 batch=1 的单张图:
推理时 runtime 会自动将 batch 扩展为 4:
方案三:NV12 图像输入 + separate_batch
适用场景:
输入来自摄像头、图像 pipeline(pyramid / resizer),数据格式为 NV12(YUV420),不经过外部预处理,直接送原始图像帧。
配置:
数据准备:
每帧图像独立送入,不需要拼接为连续 buffer:
关键限制:
- separate_batch 必须设为 True,否则 NV12 输入无法正确处理
四、常见错误与解决方法
错误一:batch>1 时使用了板端图像预处理
报错:
原因:
解决方法:
或者将separate_batch 设为 True
错误二:校准数据 shape 与模型不匹配
报错:
原因:
解决方法:
或者改用动态多 batch 方案(方案二),从根本上规避这个问题。
五、方案对比与选型建议
方案 | 输入类型 | input_shape | input_batch | separate_batch |
|---|---|---|---|---|
静态多 batch | featuremap | 4x3x224x224 | 不使用 | 不适用 |
动态多 batch | featuremap | 1x3x224x224 | 4 | 不适用 |
NV12 图像输入 | nv12 | 1x3x224x224 | 4 | True |