传输优化
减少模型输入输出数据在X86端和板端的传输量可提高工具的性能表现,工具可对如下三种使用场景提供传输优化支持。
-
模型输入固定或定期更新。若多帧推理模型的输入张量不变,那么输入张量不需要重复传输,只需在板端存储,后续推理直接复用板端张量。
-
模型输出过滤。未使用到的模型输出不需要回传至X86端。
-
多模型场景中前序模型输出可直接作为后续模型输入。此场景下,可将前序模型输出张量存储在板端且不回传,后续模型的对应输入亦无需传输,使用板端存储张量即可。
类、接口及参数
-
HTensor类
HTensor用作传输优化场景中的输入输出张量,是X86端张量或板端张量的包装类,旨在提供统一的数据接口,并限制部分属性的修改以保证数据一致性。
1). HTensor成员方法:
__init__初始化HTensor对象。
- 参数
2). HTensor属性:
data获取或设置张量数据。设置数据时,若原数据不为
None,则新数据类型需要与原类型一致。3). HTensor属性:
device获取张量存储设备信息。对象构造后禁止修改。
4). HTensor属性:
key获取张量在板端的唯一标识键值,在
device中包含"bpu"时生效。对象构造后禁止修改。5). HTensor属性:
shape获取张量形状。禁止修改,工具自动维护。
-
HbmRpcSession成员方法
__call__中的output_config参数此参数用于配置当前推理帧结束后输出张量的传输行为,其类型为
Dict[str, Dict[str, Any]],一级键为模型输出名称,二级键需包含"device"或"key"(可选)。其中"device"或"key"对应值的含义及约束与HTensor构造函数中device或key参数保持一致。当
output_config中正确配置了模型的某个输出名称时,在当前帧返回的推理结果中,对应输出张量将是HTensor类型。未配置的输出则会以一般类型(numpy.ndarray或torch.Tensor)返回。
传输优化应用示例
-
输入定期更新
此示例中假设模型有一个名为
img的输入,每10帧推理会更新一次,在img更新后的第一帧工具会将其传输至板端,其余帧不会有输入数据的传输。 -
输出过滤
此示例中模型有三个输出,分别为
output_0、output_1及output_2,其中output_2无用被过滤掉,仅output_0和output_1返回至X86端。 -
模型串联
此示例假设传入的hbm文件中包含两个模型:model0与model1,其中model0名为
output_0的输出将直接作为model1名为input_0的输入。此过程中,model0的输出无需回传至X86端,model1的输入也无需传输至板端。 -
综合应用
下述推理pipeline覆盖输入定期更新、输出过滤及模型串联三个场景,流程图如下:
参考代码如下:
