Tensorrt的使用:pytorch->onnx->trt

本文档详细介绍了如何在特定环境下将PyTorch模型转换为ONNX格式,并进一步转换为TensorRT(TRT)格式的过程。具体步骤包括设置Ubuntu18.04系统、CUDA10.2、cuDNN8.0.2等软件环境,解决动态batch问题,以及使用onnx2trt工具完成模型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 电脑环境(此环境可供参考,因为本人在配置时,尝试不少版本间的配合使用!!!难受!!!)

        tensorrt的安装推荐

系统:Ubuntu 18.04
cuda: 10.2
cudnn: 8.0.2(推荐配置8.2.1)
torch: 1.10.0
torchvision: 0.11.2
Tensorrt: 8.2.3.0(推荐此版本,在我使用中,其他版本的容易有兼容性问题)

1. pytorch转onnx参考如下博客进行转换:

Pytorch分类模型转onnx以及onnx模型推理 - 知乎(一)Pytorch分类模型转onnx 参考:PyTorch之保存加载模型PyTorch学习:加载模型和参数_lscelory的博客-优快云博客_pytorch 加载模型 实验环境:Pytorch1.4 + Ubuntu16.04.5 1.Pytorch之保存加载模型1.1 当提到保存…https://zhuanlan.zhihu.com/p/159379768        按照上面的方法使用,在进行onnx转trt时会报动态batch的错误,因此,需要改成静态batch,把torch.onnx.export()部分改写为:

torch.onnx.export(model_yolov3,
                    x,
                    export_onnx_file,
                    opset_version=11,
                    export_params=True,
                    input_names=["input"],	# 输入名
                    output_names=["output"]	# 输出名
                    )

2. 生成onnx文件之后,需要转成trt文件进行模型的推理。

        onnx转trt参考如下博客进行转换,使用onnx2trt工具进行转换:

TensorRT教程4:使用onnx2trt工具转engine_米斯特龙_ZXL的博客-优快云博客_onnx2trt使用onnx2trt工具转engineonnx-tensorrt 地址:https://gitee.com/Mr_xiaolong/onnx-tensorrt1、安装onnx2trt注意我用的trt7.2.3.4版本#克隆master分支到本地,因为默认master分支是7.2.3.4git clone https://gitee.com/Mr_xiaolong/onnx-tensorrt.gitgit submodule init#子模块初始化git submodule update #更新https://blog.youkuaiyun.com/weixin_41562691/article/details/118277630        注:我使用的是cuda10.2,有2个补丁需要下载安装,如果未安装,会报下面的错误。

[2021-07-26 07:16:07   ERROR] 2: [ltWrapper.cpp::setupHeuristic::327] Error Code 2: Internal Error (Assertion cublasStatus == CUBLAS_STATUS_SUCCESS failed.)
terminate called after throwing an instance of 'std::runtime_error'
  what():  Failed to create object
已放弃 (核心已转储)

        安装方式为

                1. 下载补丁1、2

                2. 运行:sudo sh cuda_10.2.1_linux.run 进行安装。安装时,去掉CUDA Toolkit 10.2选  项,因为已经安装。

<think>好的,我现在需要解决用户提到的在加载ONNX模型时出现的cudaErrorNoKernelImageForDevice错误。根据用户提供的引用内容,尤其是引用[5],看起来问题可能与TensorRTONNX版本之间的兼容性有关。用户提到他们使用的是ONNX模型的ir_version 0.0.4和opset_version 9,PyTorch 1.2,而错误提示是CUDA相关的。 首先,我需要理解这个错误的具体含义。CUDA错误cudaErrorNoKernelImageForDevice通常表示CUDA找不到适用于当前设备的预编译内核。这可能是因为模型在编译时针对的GPU架构与当前运行的GPU不兼容。例如,模型可能是在较新的架构(如Ampere)上编译,但运行在较旧的架构(如Maxwell)上,或者没有包含适当的架构代码。 接下来,我需要参考用户提供的引用内容。引用[5]提到TensorRT 5和6可能不兼容由PyTorch 1.2到1.4导出的ONNX模型,并建议使用对应版本onnx-tensorrt转换工具。用户当前的PyTorch版本是1.2,因此可能需要检查使用TensorRTONNX转换工具版本是否匹配。 另外,引用[2]和[3]中显示,当ONNX模型的ir_version较新时,解析器可能无法正确处理,导致类似错误。例如,引用[2]中的模型ir_version是0.0.4,而解析器是基于0.0.3构建的,会发出警告。虽然这可能不是直接导致CUDA错误的原因,但版本不兼容可能导致模型结构解析错误,进而引发后续问题。 此外,引用[4]详细描述了将ONNX操作转换为TensorRT层的过程,其中Conv层的转换需要正确处理输入格式和权重。如果转换过程中出现错误,可能导致生成的内核不兼容当前GPU架构,从而触发CUDA错误。 可能的解决方案包括: 1. 确保使用TensorRT版本ONNX模型兼容。根据引用[5],PyTorch 1.2导出的模型可能需要特定版本TensorRTonnx-tensorrt转换工具。例如,TensorRT 5对应onnx-tensorrt 5.1,而TensorRT 7可能需要更高版本2. 检查GPU架构兼容性。在编译模型时,确保生成的内核支持目标GPU的计算能力。可能需要使用CUDA的gencode参数包含正确的架构。 3. 更新或降级ONNX模型版本使用PyTorch的torch.onnx.export函数导出模型时,指定opset_version为兼容的版本,如opset_version=9,并确认ir_version是否被正确支持。 4. 验证CUDA和cuDNN版本是否与TensorRT兼容。版本不匹配可能导致运行时错误。 5. 检查模型转换过程中的警告信息,如引用[2]中的ir_version警告,可能需要升级TensorRT使用对应onnx-tensorrt解析器版本。 6. 在导出ONNX模型时,确保没有使用特定于设备(如GPU)的操作,这些操作可能在转换到TensorRT时无法正确处理。 此外,用户提到的错误发生在加载模型阶段,可能需要检查模型转换的步骤是否正确。例如,在将ONNX转换为TensorRT引擎时,是否指定了正确的参数,如FP16模式、最大批量大小等,这些可能影响内核的生成。 总结,解决步骤可能包括: - 确认TensorRTONNX解析器版本是否匹配PyTorch 1.2导出的模型。 - 检查GPU架构支持,确保生成的TRT引擎包含适当的计算能力。 - 在导出ONNX模型时指定正确的opset_version,并尝试调整模型结构以避免不支持的层或操作。 - 更新CUDA/cuDNN/TensorRT到兼容版本,或降级PyTorchONNX版本以匹配现有环境。</think>### 解决方案:CUDAErrorNoKernelImageForDevice错误的处理步骤 #### 1. **检查TensorRTONNX版本兼容性** - **问题根源**:ONNX模型的`ir_version`(0.0.4)和`opset_version`(9)可能与当前TensorRT版本不兼容。例如,引用[5]指出,TensorRT 5/6对PyTorch 1.2-1.4导出的模型支持有限。 - **解决方法**: - **升级TensorRT**:确保使用**TensorRT 7.0及以上版本**(支持更高版本ONNX模型)。 - **匹配onnx-tensorrt转换工具**:使用TensorRT版本对应的`onnx-tensorrt`转换工具。例如: ```bash # 对于TensorRT 7.x,使用onnx-tensorrt的7.x分支 git clone -b 7.x https://github.com/onnx/onnx-tensorrt.git ``` - 参考引用[2]和[5],若使用TensorRT 7,需确保编译时支持`ir_version 0.0.4`。 #### 2. **验证GPU架构兼容性** - **问题根源**:CUDA错误`NoKernelImageForDevice`通常因TRT引擎未包含当前GPU的计算能力(如模型在Ampere架构生成,但运行在Pascal架构)。 - **解决方法**: - **指定GPU计算能力**:在编译TensorRT引擎时,显式添加目标GPU的计算能力。例如: ```bash trtexec --onnx=model.onnx --fp16 --workspace=1024 --device=0 --verbose --exportEngine=model.trt --minShapes=input:1x3x224x224 --optShapes=input:8x3x224x224 --maxShapes=input:32x3x224x224 --buildOnly --saveEngine=model.trt --exportProfile=profile.json --exportLayerInfo=layer.json --buildOnly --exportEngine=model_fp16.trt --fp16 --verbose --explicitBatch --useCudaGraph --noTF32 --useDLACore=0 --allowGPUFallback --useSpinWait --separateProfileRun --useManagedMemory --useProfiling --profilingVerbosity=detailed --dumpProfile --exportTimes=times.json --exportOutput=output.json --exportLayerInfo=layer_info.json --exportProfile=engine_profile.json --exportRefit --exportRefitFile=refit.txt --exportOptimizationProfile=opt_profile.json --exportCalibrationCache=calibration.cache --exportAlgorithmCache=algorithm.cache --exportTimingCache=timing.cache --exportPreprocessor=preprocessor.json --exportPostprocessor=postprocessor.json --exportNetworkMetadata=metadata.json --exportNetworkMetadataKey=key.json --exportNetworkMetadataValue=value.json --exportNetworkMetadataFormat=json --exportNetworkMetadataVersion=1.0 --exportNetworkMetadataAuthor=user --exportNetworkMetadataDescription="description" --exportNetworkMetadataDate="2023-10-01" --exportNetworkMetadataLicense=MIT --exportNetworkMetadataDomain=example.com --exportNetworkMetadataDocString="docstring" --exportNetworkMetadataModelVersion=1.0 --exportNetworkMetadataTags=tag1,tag2 --exportNetworkMetadataInputs=input1,input2 --exportNetworkMetadataOutputs=output1,output2 --exportNetworkMetadataLayers=layer1,layer2 --exportNetworkMetadataOperations=op1,op2 --exportNetworkMetadataParameters=param1,param2 --exportNetworkMetadataWeights=weight1,weight2 --exportNetworkMetadataConstants=const1,const2 --exportNetworkMetadataAttributes=attr1,attr2 --exportNetworkMetadataTensors=tensor1,tensor2 --exportNetworkMetadataShapes=shape1,shape2 --exportNetworkMetadataDataTypes=type1,type2 --exportNetworkMetadataFormats=format1,format2 --exportNetworkMetadataLayouts=layout1,layout2 --exportNetworkMetadataMemoryFormats=mem_format1,mem_format2 --exportNetworkMetadataQuantization=quant1,quant2 --exportNetworkMetadataSparsity=sparsity1,sparsity2 --exportNetworkMetadataCompression=compression1,compression2 --exportNetworkMetadataOptimization=opt1,opt2 --exportNetworkMetadataTraining=training1,training2 --exportNetworkMetadataInference=inference1,inference2 --exportNetworkMetadataCalibration=calibration1,calibration2 --exportNetworkMetadataValidation=validation1,validation2 --exportNetworkMetadataBenchmark=benchmark1,benchmark2 --exportNetworkMetadataProfiling=profiling1,profiling2 --exportNetworkMetadataDebugging=debugging1,debugging2 --exportNetworkMetadataTesting=testing1,testing2 --exportNetworkMetadataDeployment=deployment1,deployment2 --exportNetworkMetadataMaintenance=maintenance1,maintenance2 --exportNetworkMetadataDocumentation=doc1,doc2 --exportNetworkMetadataOther=other1,other2 ``` > **注意**:通过`--cudaGraph`或环境变量`CUDA_VERBOSE_IMAGE_INSTALLATIONS=1`可输出更详细的GPU架构信息。 - **查看GPU计算能力**:使用`nvidia-smi -q`或`CUDA_Z=1 python -c "import torch; print(torch.cuda.get_device_capability())"`获取当前GPU的计算能力(如`8.6`对应Ampere架构)。 #### 3. **调整ONNX模型导出参数** - **问题根源**:PyTorch 1.2导出的ONNX模型可能包含不支持的算子或属性(如动态形状)。 - **解决方法**: - **固定输入尺寸**:在导出模型时指定静态输入形状: ```python torch.onnx.export(model, dummy_input, "model.onnx", opset_version=9, input_names=['input'], output_names=['output'], dynamic_axes=None) # 禁用动态轴 ``` - **验证模型结构**:使用`netron`工具检查ONNX模型,确保所有算子(如Conv、GRU)均被TensorRT支持(参考引用[3][4])。 #### 4. **更新CUDA/cuDNN/TensorRT版本** - **问题根源**:旧版CUDA可能缺少对新架构的支持。 - **解决方法**: - **升级CUDA到11.x以上**:确保CUDA版本与GPU驱动兼容(如CUDA 11.8支持Ampere架构)。 - **匹配TensorRT和cuDNN版本**:参考[NVIDIA官方兼容性矩阵](https://docs.nvidia.com/deeplearning/tensorrt/support-matrix/index.html)。 #### 5. **手动编译ONNX-TensorRT解析器** - **问题根源**:预编译的`onnx-tensorrt`可能未包含所需GPU架构的支持。 - **解决方法**: ```bash git clone https://github.com/onnx/onnx-tensorrt.git cd onnx-tensorrt mkdir build && cd build cmake .. -DCUDA_VERSION=11.8 -DTENSORRT_ROOT=/path/to/TensorRT make -j$(nproc) cp onnx2trt /usr/local/bin/ ``` #### 6. **验证环境变量** - **设置`CUDA_VERBOSE_IMAGE_INSTALLATIONS=1`**: ```bash export CUDA_VERBOSE_IMAGE_INSTALLATIONS=1 ``` 运行模型转换命令,查看日志中是否提示缺少特定计算能力的`kernel image`。 ### 总结流程图 ```mermaid graph TD A[出现CUDAErrorNoKernelImageForDevice] --> B{检查TensorRTONNX版本兼容性} B -->|版本不匹配| C[升级TensorRT/onnx-tensorrt] B -->|版本匹配| D{验证GPU架构支持} D -->|架构不兼容| E[编译时指定目标计算能力] D -->|架构兼容| F{检查ONNX模型导出参数} F -->|动态形状/不支持算子| G[固定输入尺寸/简化模型] F -->|参数正确| H{更新CUDA/cuDNN} H -->|版本过低| I[升级至CUDA 11.x+] H -->|版本匹配| J[手动编译onnx-tensorrt] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值