MMDeploy模型转换与TensorRT推理遇到问题及解决方案
最近使用MMDeploy对MMSegmentation训练好的模型进行转换,在Jeton上进行TensorRT推理。踩过了一些坑,分享一下。
我使用的硬件与基础环境:Jeton Orin NX 16GB,JatPack 5.1.1 (Cuda 11.4.315, cuDNN 8.6.0.166, TensorRT 8.5.2.2)
在配置MMDeploy环境、模型转换、TRT推理遇到的主要问题与解决方案如下:
1. 版本兼容性。由于涉及的库、包非常多。尤其是pytorch、mmcv、numpy等容易因为版本兼容性不佳导致运行出现各种报错。我最终配成功后,主要的包、库的版本如下:
Python(3.8.20)、Pytoch(1.11.0)、Torchvision( 0.12.0)、MMCV(2.0.0rc4)、ONNX(1.10.0)、ONNXruntime(1.10.0)、MMDeploy(1.3.1)、MMSegmentation(1.2.0)
2. 转trt_int8模型时,有个--calib-dataset-cfg参数,需要传入标定数据集的配置文件,用于量化过程的标定。官方教程里没有给出详细的该配置文件的便些说明。能找到一个MMDetection模型int8量化的标定数据配置文件示例。
TensorRT Support — mmdeploy 1.3.1 文档https://mmdeploy.readthedocs.io/zh-cn/latest/05-supported-backends/tensorrt.html?highlight=calib%20dataset%20cfg
但这个是用户自定义数据集的示例。还需要进行注册之类的。实际最简单的方法就是,不填该参数,会自动使用模型配置文件中给出的验证集数据做标定。但要注意的是,配置文件中的数据集路径往往是模型在服务器训练时的存放位置,因此,需要把模型配置文件中数据集的路径按照Jetson上实际存放路径进行修改。
3. 在模型转换好后,运行推理时,遇到报错:TypeError: __init__() got an unexpected keyword argument 'test_out_dir'
这应该也是因为库的版本不匹配造成的。但我实在不想再去调整库的版本,因为调整完可能又有新的问题。所以我就顺腾摸瓜,根据报错信息定位到报错的位置,将“mmdeploy/mmdeploy/codebase/base/task.py”文件211行注释掉,问题解决了。
4. 解决上面的问题后,运行推理又出了新的报错:TypeError: FormatCode() got an unexpected keyword argument 'verify'
应该也是因为版本不匹配造成的。依然是根据报错信息定位出错位置,修改“mmengine-for-jetson-main/mmengine-0.8.4/mmengine/config.py”文件1476行,将verify=true去掉。
至此,模型转换、推理均能成功运行了。