如 x = x[valid_indices], 其中valid_indices为二维布尔变量,导致x的shape是变化的,在地平线工具链里Tensor 的维度在运行时是固定的,不支持动态的;如果用torch.where去实现(不符合条件的维度赋值为0),维度是固定了,后续如果接网络,会引入误差,有很多0参与计算;请问有啥好的解决方案不


你好,这个问题我们分两个部分来看:
1. 认知对齐:你说的没错,1)目前地平线BPU硬件推理的一个重要特性就是不支持动态shape的Tensor,所以 Tensor维度静态化这个是必须的。 2) Tensor维度 静态后,相对与动态 Tensor 多出的部分用0填充如果不加任何限制和记录确实为为后面的计算 引入误差,比如说BN,计算mean时,sum不变count变大了。
2. 处理方法: 用0填充数据如果不加任何限制和记录会为后面的计算引入误差,为了消除计算误差,可以通过mask记录有效数据和无效数据,静态化后的tensor 通过mask机制 在后续的计算中从计算中“逻辑上忽略” 是可以消除掉这个误差的 。拿 计算mean来说, 静态化后引入的 填充数 0不会对sum产生影响,计算count是,通过 mask 也可以计算出准备的count值,从理论上是 消除掉了这个误差的。
3. 另外:作为mask机制的补充,也可以根据业务 固定最大数量填充(padding)+ batch内部排序,在 batch 内部(每个batch大小根据最大数量进行了shape固定 )把 有效值 排序放前面,后面用padding填满, 然后使用额外的 lengths 变量记录每个batch中有效条目数,后续操作中通过lengths跳过无效区域。