关于bev_ipm量化训练一些细节问题

1.**芯片型号:**J5

2.天工开物开发包OpenExplorer版本:J5_OE_1.1.40

你好,

针对bev的ipm的QAT量化问题我有几个细节没有太理解,希望能点拨以下

问题1. 对于bev_mt_ipm.py的config文件中,QuantStub插入的量化节点scale是通过下面的函数决定的

def get_grid_quant_scale(grid_shape, view_shape):-
max_coord = max(*grid_shape, *view_shape)-
coord_bit_num = math.ceil(math.log(max_coord + 1, 2))-
coord_shift = 15 - coord_bit_num-
coord_shift = max(min(coord_shift, 8), 0)-
grid_quant_scale = 1.0 / (1 << coord_shift)-
return grid_quant_scale

对于这个scale这样计算的目的是什么?因为在做分割bev时的points的scale为1.0/64.0, 而在ipm的vtransformer过程

对points的scale为1.0/128.0,同样img也是1.0/128.0。给个大概解释就行,不求甚解

问题2:

grid_sample函数会对points先进行一次adjust_coords减去一个值,再进行grid_sample过程中又加上去。

它的目的是什么?是为了让伪量化的时候clip尽量小吗?这个与上面的scale关系如何?

附录中是上面提到的操作复制的代码

祝好

给个大概解释就行,不求甚解

code_20230711114515.py

在qat的hnn.Gridsample中,absolute_grid = grid_yx + base_coord 这一行就把之前减去的再加上去了

# Convert to absolute grid.

n, h, w, _ = grid.shape

base_coord = torch.stack(

[

torch.arange(h, device=grid.device)

.reshape(1, h, 1)

.expand(n, h, w),

torch.arange(w, device=grid.device)

.reshape(1, 1, w)

.expand(n, h, w),

],

dim=-1,

)

absolute_grid = grid_yx + base_coord

absolute_grid = absolute_grid.permute(0, 3, 1, 2).unsqueeze(1)

bev_mt_ipm.py中-
map_grid_quant_scale = get_grid_quant_scale(map_shape, view_shape)

bev分割任务中的points的quant scale是不是要改为下面这个(虽然不影响结果)-
map_grid_quant_scale = get_grid_quant_scale(map_shape, grid_size)

您好,对于问题1:grid会有很多比较大的值,这些值都是无效的如果要自己统计会不准,所以要设置下限制下scale值;问题2:grid_sample函数会对points先进行一次adjust_coords减去一个值, 这是plugin中gridsample算子的使用时需要做的操作,但是在grid_sample过程中并没有加上去的操作,请您再确认一下

您好,您这里认为的“加回去”的操作其实是针对plugin中的gridsample算子和公版gridsample算子的grid输入的区别做的操作,公版gridsample算子的grid的范围是[-1,1] ,所以要先把grid转换到绝对坐标(+base_coord),然后再norm到[-1,1];对于bev分割任务中的map_grid_quant_scale的计算,将view_shape改为grid_size后虽然不会影响结果,但是建议不要轻易替换

好的.谢谢

您好,地平线工具链在持续迭代优化,为了给您提供更好的服务,希望您能抽出3分钟左右的时间,将您在使用工具链期间的感受和建议告诉我们,您的宝贵意见对我们很重要,非常感谢!

**问卷链接:**https://wenjuan.feishu.cn/m/cfm?t=st64p6krU3Ji-yvhv