(ubuntu 18.04 cuda 10.2 pytorch onnx→tensorrt) 使用tensorrt加载并运行onnx模型

本文介绍了如何在Ubuntu 18.04环境下,使用CUDA 10.2和TensorRT 7.0安装TensorRT,并将PyTorch模型转换为ONNX格式,然后利用TensorRT加载并运行ONNX模型进行预测。主要流程包括TensorRT和pycuda的安装,PyTorch到ONNX的转换,以及TensorRT调用ONNX模型进行预测。需要注意的是,TensorRT对pad层的要求以及7.0.0.11版本不支持batchnorm层。

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

2021.4

0. TensorRT介绍

https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html

  • TensorRT的核心是一个C ++库,可促进对NVIDIA图形处理单元(GPU)进行高性能推断。 它旨在与TensorFlow,Caffe,PyTorch,MXNet等深度学习框架互补地工作。它专门致力于在GPU上快速有效地运行已经受过训练的网络,以生成结果(包括检测,回归或推断任务等)。
  • TensorRT根据指定的精度(FP32,FP16或INT8)组合各层,优化内核选择,通过归一化、转换为更优化的矩阵数学运算等方式,改善延迟,吞吐量和效率。
  • 主要流程:
    在这里插入图片描述

1. 安装tensorrt、pycuda

1.1 安装tensorrt

  • 环境:ubuntu18.04, 2080Ti,安装cuda10.2+cudnn 7.6.5,且在~/.bashrc中添加cuda、cudnn所在位置:
    在这里插入图片描述

  • tensorrt下载链接:https://developer.nvidia.com/zh-cn/tensorrt

    需要选择tensorrt 7.0.0.11(适用于Ubuntu18.04、cuda10.2、cudnn7.6,其他更高的tensorrt版本要求cudnn8,因此此处选择tensorrt 7.0.0.11)
    在这里插入图片描述

    • 下载之后解压:

      tar xzvf TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn7.6.tar.gz
      
    • 解压后得到“TensorRT-7.0.0.11”文件,包含以下目录:
      在这里插入图片描述

  • 安装指导:打开doc/pdf/TensorRT-Installation-Guide.pdf

    由于下载的是tar安装文件,因此根据文件中4.3 tar file installation章节安装即可

    主要安装步骤如下:

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/TensorRT-7.0.0.11/lib   #TensorRT文件所在目录
    
    cd TensorRT-7.0.0.11/python
    pip3 install tensorrt-*-cp3x-none-linux_x86_64.whl # 根据python版本选择whl文件
    
    cd TensorRT-7.0.0.11/graphsurgeon
    pip3 install graphsurgeon-0.4.1-py2.py3-none-any.whl
    
  • 验证安装:进入samples目录,该目录下有很多c++、python的tensorrt使用示例,可以详细学习一下

    • 进入samples/sampleMNIST目录

      make clean   # 可能需要sudo
      make 
      
      cd ../../bin
      ./sample_mnist
      
    • 还需要准备数据:进入data/minist目录下,运行

      python download_pgms.py
      

      得到0.pgm~9.pgm,注意download_pgms.py里面的mnist下载链接可能无效,此时可以找一个有效的链接进行替换

    • 得到结果
      在这里插入图片描述

1.2 安装pycuda

pip install pycuda

2. 将pytorch模型转化为onnx模型

  • tensorrt无法直接读取pytorch模型,因此需要先转化为onnx

  • 以alexnet为例,主要代码:

    import torch
    import torchvision
    
    def get_model():
        model = torchvision.models.alexnet(pretrained=True).cuda()
        resnet_model = model.eval()
        return model
    
    def get_onnx(model, onnx_save_path, example_tensor):
        example_tensor = example_tensor.cuda()
        _ = torch.onnx.export(model, 
                            example_tensor, 
                            onnx_save_path,
                            verbose=True,
                            training=False,
                            do_constant_folding=False,
                            input_names=['input'],
                            output_names=['output'])
    
    if __name__ == '__main__':
        model = get_model()
        onnx_save_path = "alexnet.onnx"
        example_tensor = torch.randn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值