本篇文章主要记录下,我在使用trt7.0时遇到的一些问题
1.batch inference
在trt7.0转换模型时创建IWorkDefinition 时需要使用接口:IBuilder::createNetWorkV2,此时需要使用制定一个flag这个flag可以是EXPLICIT_BATCH 或EXPLICIT_PRECISION.
当使用EXPLICIT_BATCH时,生成的engine 输入为4dims的(NCHW)但是无法用trt<6.0的接口(IExcutionContext::execute_async)做batch inference(只用batch_idx=0有数据,其他都是0)。原因:
来源: https://forums.developer.nvidia.com/t/tensorrt-engine-batch-inference-only-has-one-result/126017/7
所以只能使用之前(上一篇)提到的dynamic shape的方式实现batch inference
当使用EXPLICIT_PRECISION 作为flag时可以用之前的接口实现batch inference 但是,量化时会报错:
这个问题我还在等官方回复:https://forums.developer.nvidia.com/t/got-assertion-si-count-1-failed-when-create-engine-with-int8-calibration/173800
而且,有些模型会转换不成功。
2.int8 量化
有些模型(大概率是带分支的模型)在量化时会出现量化失败的问题,只在log中输出,不会crash 或者exception。 具体log为: XXX(tensor的名字) normaly zero, calibration failed.
有两种可能,1.量化时的数据太少,或者设的batchSzie太小,量化时无法得到某个向量的范围,此时需要增多calibration dataset的数据以及batch size:
如果尝试后还是同样的问题量化失败,说明,模型训练完后这一分支(或者某一层)的权重很有可能已经都是0,需要自己对这一分支(或者层)做剪枝处理。
3.custom plugin
在写自定义插件时,一定要使用 pluginV2IOExt/pluginV2Ext/IpluginV2DynamicExt ,这是因为 其他的类,虽然也可以使用,但是不支持 EXPICIT_BATCH 转换(会报 not support no implicit batch 类似的错误)
同时注意enqueue 参数的含义:
inputs/outputs 是指针数组(指向指针的指针),其一共有 num_inputs/num_outputs 个指针(即该层有几个输入,几个输出)且每个指针指向的数据维度是 NCHW 维的。