OpenPPL / ppq

PPL Quantization Tool (PPQ) is a powerful offline neural network quantization tool.
Apache License 2.0
1.58k stars 236 forks source link

Users must provide dynamic range for all tensors that are not Int32 or Bool. #469

Closed ehuaa closed 1 year ago

ehuaa commented 1 year ago

将官方示例https://github.com/openppl-public/ppq/blob/3e32875eae87bd72cf4248238790adf9d483016d/ppq/samples/Yolo/02_Quantization.py 中的模型改成pytorch版本的,用trt量化会报以下的warning

[05/15/2023-22:56:54] [TRT] [W] onnx2trt_utils.cpp:374: Your ONNX model has been generated with INT64 weights, while TensorRT does not natively support INT64. Attempting to cast down to INT32. [05/15/2023-22:56:54] [TRT] [W] Calibrator is not being used. Users must provide dynamic range for all tensors that are not Int32 or Bool.

看上去是有的tensor 在act_quant_info的key中没有找到,那这些没有量化信息的tensor就无法提供dynamic range 。那是不是根据TRT中的message [05/15/2023-22:56:54] [TRT] [W] Calibrator is not being used. Users must provide dynamic range for all tensors that are not Int32 or Bool. 没有提供全部的dynamic range 校准集在TRT上就无法使用了,谢谢

ZhangZhiPku commented 1 year ago

这个里面有nms算子?

ehuaa commented 1 year ago

这个里面有nms算子?

使用的是yolov3-spp的模型,然后里面有split算子,发现无法量化,想问下是这个原因么 1684290733223

ehuaa commented 1 year ago

补充一下 就是split算子没有在json文件中看到quant_info tensorRT 量化生成engine的时候有如下warning image @ZhangZhiPku

ZhangZhiPku commented 1 year ago

他这个是这样的,你的onnx里面有很多算子,他们不止包括conv, gemm这些纯粹做计算的东西,还包括很多 split, reshape 这样捣鼓形状的算子,这些算子按道理说不能量化。 比如你这里有个变量叫 /28/reshape_3_output_0,这个东西应该是在倒腾形状的,我一旦给它量化掉你这个网路可能就跑不通了,此时PPQ会自动识别网络中那些算子需要被量化,而不需要量化的tensor是不会有scale, offset这些信息的。Tensorrt会向你报告这些警告,你可以手动检查一下此处的量化策略是否是对的,如果不是预期的行为,你可以手动修改量化调度方案,强制一些算子参与量化或者解除某些算子的量化。 通常来讲如果你的网络不是很复杂,PPQ 的做法一般都是正确的,因为当初也是对着这些视觉模型调过的...

ehuaa commented 1 year ago

些算子按道理

多谢大佬回复,刚刚看了下是的,然后现在有个问题,我用https://github.com/openppl-public/ppq/blob/3e32875eae87bd72cf4248238790adf9d483016d/ppq/samples/Yolo/02_Quantization.py 这段代码量化之后发现和fp16推理的速度是一样的,然后verbose查看了下网络构建的信息,发现只有前三层是用的Int8推理的,后面tensorrt的engine构建都用了Half类型, 想问下这个一般怎么查原因呢 1684411264420

ps: 我用的yolo3-spp的模型跑的

ehuaa commented 1 year ago

是不是因为我用的是V100 的tensorcore不支持int8呀....所以他选kernel的时候发现总是fp16的更快么

ZhangZhiPku commented 1 year ago

V100 tencorcore支持int8的,说起来你可能不信,NV的卡是先支持的int8后支持的fp16,有fp16的卡都支持int8应该... 我不是很清楚目前是ppq的调度出现了错误还是tensorrt那边有什么问题,你可以参考这个例子: https://github.com/openppl-public/ppq/blob/master/ppq/samples/Yolo/yolo_5.py 手动操作,量化所有的卷积

ehuaa commented 1 year ago

V100 tencorcore支持int8的,说起来你可能不信,NV的卡是先支持的int8后支持的fp16,有fp16的卡都支持int8应该... 我不是很清楚目前是ppq的调度出现了错误还是tensorrt那边有什么问题,你可以参考这个例子: https://github.com/openppl-public/ppq/blob/master/ppq/samples/Yolo/yolo_5.py 手动操作,量化所有的卷积

多谢大佬回复,昨天换了个A100的环境 就可以使用相同的代码int8 TRT量化推理了,看了下NV官网,貌似确实是V100太老了不支持=。= 1684590379951

ZhangZhiPku commented 1 year ago

啊这