ppq icon indicating copy to clipboard operation
ppq copied to clipboard

调度部分算子至FP32时,生成engine失败

Open zhjw0927 opened this issue 8 months ago • 2 comments

大佬:

我使用PPQ量化模型时,根据逐层误差的提示将误差较大的层调度至非量化平台上,生成了动态范围文件。 在构建Engine时,使用setDynamicRange API去加载动态范围,和使用layer->setPrecision(nvinfer1::DataType::kHALF) 将调度至非量化平台上的算子设置成FP16精度。 结果显示 Internal Error (Assertion nbPTQScales == nbChannels failed.)。

下图中左侧三个Conv被调度至了非量化平台上(PPQ阶段),和使用TensorRT API设置为FP16精度(Engine阶段)。我尝试理解上述报错的原因,第一可能是因为左侧三个Conv为FP16精度,所以其输入和输出都为FP16精度,最右侧Conv为INT8精度,其输入和输出都为INT8精度,四个Conv的输出存在两种类型,所以在Concat算子内发生错误;第二可能是因为四个Conv在进行横向融合时,因为精度不同所以发生了错误,但这种情况下,TensorRT在融图时,不会先考虑参与融合的算子的精度吗?图融合 和 INT8量化在构建Engine时是哪一个先被执行呀?

麻烦大佬帮忙指导下。

Screenshot from 2023-12-27 09-41-56

下图中的Conv算子在PPQ阶段被调度至了非量化平台上,在生成Engine时被API显式设置FP16 层精度。Sigmoid和Mul算子是量化状态。在构建Engine时,Conv的输入和输出都是FP16精度,该输出在输入到Sigmoid和Mul算子前会被转化成INT8精度,执行INT8计算。 麻烦大佬帮忙指导下,我的理解有没有错误。

Screenshot from 2023-12-27 09-49-08

感谢。

zhjw0927 avatar Dec 27 '23 15:12 zhjw0927