tensorRT 7.0 学习笔记(六)———踩过的一些坑

8 篇文章 1 订阅
本文档详细记录了在使用TensorRT 7.0时遇到的挑战,包括批处理推理问题、动态形状转换、INT8量化异常以及自定义插件注意事项。在EXPLICIT_BATCH模式下,静态批处理推理可能导致问题,而使用EXPLICIT_PRECISION则在量化过程中可能遇到错误。此外,某些模型分支的量化失败可能源于数据不足或权重归零。自定义插件开发应遵循特定接口以支持EXPLICIT_BATCH转换。
摘要由CSDN通过智能技术生成

本篇文章主要记录下,我在使用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 维的。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值