减少模型输入输出数据在X86端和板端的传输量可提高工具的性能表现,工具可对如下三种使用场景提供传输优化支持。
模型输入固定或定期更新。若多帧推理模型的输入张量不变,那么输入张量不需要重复传输,只需在板端存储,后续推理直接复用板端张量。
模型输出过滤。未使用到的模型输出不需要回传至X86端。
多模型场景中前序模型输出可直接作为后续模型输入。此场景下,可将前序模型输出张量存储在板端且不回传,后续模型的对应输入亦无需传输,使用板端存储张量即可。
HTensor类
HTensor用作传输优化场景中的输入输出张量,是X86端张量或板端张量的包装类,旨在提供统一的数据接口,并限制部分属性的修改以保证数据一致性。
1). HTensor成员方法:__init__
初始化HTensor对象。
| 参数 | 说明 |
|---|---|
data | 待封装的张量数据。 |
device | 张量的存储设备,可选值包括 None 、 "cpu" 、 "bpu" 或 ["cpu", "bpu"] 。其中 "cpu" 代表X86端, "bpu" 代表板端。 |
key | 在板端用于唯一标识该张量的键值。 |
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覆盖输入定期更新、输出过滤及模型串联三个场景,流程图如下:
参考代码如下: