199 LIMITED
用户5057
分享
课件12--3CUDA-BEVFusion量化代码解析
输入“/”快速插入内容
课件12--3CUDA-BEVFusion量化代码解析
•
模型大小的的改变
◦
执行ptq.py前模型大小421M
◦
执行ptq.py后模型大小236M
代码块
JSON
pip install pytorch-quantization --extra-index-url https://pypi.ngc.nvidia.com
官方提供的量化技巧
主要作用是对bevfusion模型进行量化并导出pth文件存储量化后的模型结构和权重。
这是是官方提到的量化时需要注意的三个方面:
•
在模型进行前向时,使用 FuseBn 可以为模型带来更好的性能,所以这个操作需要在模型校准前实现。
•
Add 和 Concat 层是具有多输入的,需要对所有输入使用相同量化器,这样可以降低发生 Reformat 的可能。
◦
Reformat 表示量化过程中出现精度格式转换。如果使用不同精度的量化器,就会造成这种问题的发生。
◦
input1 使用 8bit 量化器,量化为 int8,input2 使用 4bit 量化器,量化为 int4。此时在 Add 操作时,需要将其中一个输入 reformat 为另一种精度,以保证精度一致。例如重新格式化 input2 为 int8:
代码块
Go
x = quantize(input1, 8bit_quantizer) # x为int8
y = quantize(input2, 4bit_quantizer) # y为int4
y = reformat(y, int8) # 将y reformat为int8
out = add(x, y) # 两输入为int8时可以相加
◦
这样会引入额外的计算开销。因此,为了避免不必要的 Reformat , 对 Add 或 Concat 这种具有多输入的层,应该使用相同的量化器,保证输入精度一致,避免了 Reformat 的发生。
•
量化某些层时会造成严重的 mAP 掉点,所以在校准之后关闭这些层的量化是很有必要的。
1.
ptq.py
结果:导出一个量化后的模型
'qat/ckpt/bevfusion_ptq.pth'
1.1
量化模块初始化
在 _DEFAULT_QUANT_MAP 中添加新的条目,并将输入校准方式设置为
histogram
。
1.2
解析命令行参数
1.3
加载配置信息