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)
颜值即正义
3
您好,对于问题1:grid会有很多比较大的值,这些值都是无效的如果要自己统计会不准,所以要设置下限制下scale值;问题2:grid_sample函数会对points先进行一次adjust_coords减去一个值, 这是plugin中gridsample算子的使用时需要做的操作,但是在grid_sample过程中并没有加上去的操作,请您再确认一下
颜值即正义
4
您好,您这里认为的“加回去”的操作其实是针对plugin中的gridsample算子和公版gridsample算子的grid输入的区别做的操作,公版gridsample算子的grid的范围是[-1,1] ,所以要先把grid转换到绝对坐标(+base_coord),然后再norm到[-1,1];对于bev分割任务中的map_grid_quant_scale的计算,将view_shape改为grid_size后虽然不会影响结果,但是建议不要轻易替换
颜值即正义
6
您好,地平线工具链在持续迭代优化,为了给您提供更好的服务,希望您能抽出3分钟左右的时间,将您在使用工具链期间的感受和建议告诉我们,您的宝贵意见对我们很重要,非常感谢!
**问卷链接:**https://wenjuan.feishu.cn/m/cfm?t=st64p6krU3Ji-yvhv