码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • tensorRT简明使用


    github:https://github.com/wang-xinyu/tensorrtx

    参考:TensorRT详细入门指北,如果你还不了解TensorRT,过来看看吧_程序员老潘的博客-CSDN博客_lstm tensorrt

    默认前置条件已安装驱动、CUDA、cudnn、pytorch。

    这里以ubuntu20.04,驱动470,CUDA11.1.1,cudnn8.1.1,pytorch1.12,tensorrt7.2.3.4为例。

    简介

    tensorrt主要用于优化模型推理速度,是硬件相关的。主要有两种将torch转化为tensorrt的方式:

    1. github路线:首先保存模型的.pth权重文件,然后将其转化为.wts文件。之后编写c++程序对.wts进行编译,生成.engine文件,通过.engine来进行tensorrt的推理。

    2. onnx路线:将网络结构保存为onnx格式,然后利用ONNX-TensorRT工具将onnx转换为tensorrt模型即可。

    安装

    下载路径:NVIDIA TensorRT | NVIDIA Developer

    选择对应版本下载:

    nvidia-smi

    查看驱动版本:

    这里显示的CUDA Version是电脑最高支持的版本,实际11.0-11.4均可,电脑实际版本根据下述命令查询:

    nvcc --version

     

    找到对应版本下载:

    虽然显示的是18.04但20.04也是可以使用的。

    安装与检查:

    1. \\ tensorrt安装
    2. sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda11.1-trt7.2.3.4-ga-20210226_1-1_amd64.deb
    3. sudo apt update
    4. sudo apt install tensorrt
    5. \\ opencv安装
    6. sudo add-apt-repository ppa:timsc/opencv-3.3
    7. sudo apt-get update
    8. sudo apt install libopencv-dev
    9. \\ 检查是否安装成功
    10. dpkg -l | grep cuda
    11. dpkg -l | grep nvinfer
    12. dpkg -l | grep opencv

    装其它版本的opencv参考:Ubuntu 18.04 安装opencv4.2.0_翟羽嚄的博客-CSDN博客_ubuntu安装opencv4.2 

    github路线[1]

    以lenet为例,pytorch代码中获得网络的输出:

    1. git clone https://github.com/wang-xinyu/pytorchx
    2. cd pytorchx/lenet
    3. python lenet5.py # get lenet5.pth
    4. python inference.py # get lenet5.wts

    lenet5.wts,第1行是参数个数,接下来的10行,每行开头为参数名,数量,然后是值:

    make lenet5,分为c++版本和python版本:

    1. git clone https://github.com/wang-xinyu/tensorrtx
    2. cd tensorrtx/lenet
    3. cp [PATH-OF-pytorchx]/pytorchx/lenet/lenet5.wts .

    c++(推荐):

    1. mkdir build
    2. cd build
    3. cmake ..
    4. make
    5. ./lenet -s # 生成lenet5.engine
    6. ./lenet -d # 推理

    python(不推荐,除非tensorrt装的最新版本):

    1. pip install --upgrade setuptools pip
    2. pip install pycuda
    3. pip install nvidia-pyindex
    4. pip install nvidia-tensorrt==<your tensorrt version>
    5. python lenet.py -s # 生成lenet5.engine
    6. python lenet.py -d # 推理

    和之前直接pytorch输出的结果一致。

     

    错误汇总

    1. make时报错:

    (1) .../logging.h:239:10:  error: looser throw specifier for xxxx

    参考:https://blog.csdn.net/lxx191079173/article/details/123511086

    修改logging.h 239行:

    1. void log(Severity severity, const char* msg) override
    2. //改为
    3. void log(Severity severity, nvinfer1::AsciiChar const* msg) noexcept

    (2)  lenet.cpp:2:10: fatal error: cuda_runtime_api.h: 没有那个文件或目录

    参考:【已解决】 fatal error: cuda_runtime.h: 没有那个文件或目录_HeyMountain的博客-CSDN博客_cuda_runtime.h: 没有那个文件或目录

    1. sudo gedit ~/.bashrc
    2. # 加入以下语句
    3. export CPATH=/usr/local/cuda-11.1/targets/x86_64-linux/include:$CPATH
    4. export LD_LIBRARY_PATH=/usr/local/cuda-11.1/targets/x86_64-linux/lib:$LD_LIBRARY_PATH
    5. export PATH=/usr/local/cuda-11.1/bin:$PATH
    6. source ~/.bashrc

    无效。

    我是在conda虚拟环境下make的,参考:ERROR: cuda_runtime_api.h: No such file or directory_圆滚熊的博客-CSDN博客

    export CUDA_HOME = /usr/local/cuda-11.1
    

    无效。

    参考:解决 :fatal error: cuda_runtime.h: No such file or directory_seaun163的博客-CSDN博客_cuda runtime.h

    在CMakeLists.txt中找到:

    修改为自己对应的名称:

    删除build文件夹后重新创建和cmake make:

    成功。

    2.  ./lenet -s 时报错:

    (1) [W] [TRT] TensorRT was linked against cuBLAS/cuBLAS LT 11.3.0 but loaded cuBLAS/cuBLAS LT 11.2.1

    参考:[TRT] TensorRT was linked against cuBLAS/cuBLAS LT 11.5.1 but loaded cuBLAS/cuBLAS LT 11.4.2_陈 洪 伟的博客-CSDN博客

    nvcc --version 查询得到,电脑的cuda是11.1版本。

    通过:Release Notes :: CUDA Toolkit Documentation

    可知,11.1.0版本对应的cuBLAS是11.2.1.74,而11.1.1版本对应11.3.0.106,跟报错信息对上了。

    因此重装11.1.1的cuda[2]:

    1. wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run
    2. sudo sh cuda_11.1.1_455.32.00_linux.run

    按提示安装,显示CUDA Installer界面时,不要勾选安装驱动。

    (2) [W] [TRT] Try increasing the workspace size to 4194304 bytes to get better performance.

    参考:trt-yolo app 测试“try increasing the workspace size with IBuilder::setMaxWorkspaceSize()” 错误处理_DONGHUIB的博客-CSDN博客

    修改lenet.cpp中workspace:

    20改为30,删除build,从头编译:

    错误消失。could not open plan output file 问题通过 sudo 解决。

    3. python方式生成engine时报错:

    ModuleNotFoundError: No module named 'tensorrt'

    参考:​​​​​​​A Guide to using TensorRT on the Nvidia Jetson Nano - Donkey Car

    1. nvcc --version
    2. pip install pycuda
    3. export PYTHONPATH=/usr/lib/python3/dist-packages:$PYTHONPATH
    4. # 或者虚拟环境下python路径
    5. which python # <...>/anaconda3/envs/objDet/bin/python
    6. export PYTHONPATH=<...>/anaconda3/envs/objDet/lib/python3.8/site-packages

    无效。

    参考:https://github.com/NVIDIA-AI-IOT/torch2trt/issues/429

    1. pip install --upgrade setuptools pip
    2. pip install nvidia-pyindex
    3. pip install nvidia-tensorrt==<your tensorrt version>

    成功: 

    4. python lenet.py -s 时报错:

    参考:Issues with dynamic shapes Try increasing the workspace size with IBuilderConfig::setMaxWorkspaceSize() - #9 by qc_dong - TensorRT - NVIDIA Developer Forums

    推荐升级tensorrt为最新版。 

    onnx路线

    1. 将torch网络结构转化成onnx模型

    根据:网络结构可视化onnx+netron_络小绎的博客-CSDN博客_onnx网络可视化

    2. 验证onnx正确性,check_onnx.py:

    1. # -*- coding: utf-8 -*-
    2. """
    3. 验证onnx模型的正确性。
    4. @Time : 8/10/22 1:52 PM
    5. @Auth : lakuite
    6. @File : check_onnx.py
    7. @From : https://zhuanlan.zhihu.com/p/371239130
    8. https://blog.csdn.net/m0_37192554/article/details/112304434
    9. """
    10. import onnx
    11. import numpy as np
    12. import onnxruntime as rt
    13. import torch
    14. from lenet5 import Lenet5
    15. torch.manual_seed(1)
    16. model_path = 'lenet5.onnx'
    17. # 验证模型合法性
    18. onnx_model = onnx.load(model_path)
    19. onnx.checker.check_model(onnx_model)
    20. image = torch.randn(2, 1, 32, 32) # torch
    21. image_arr = np.array(image).astype('float32') # onnx要2个batch,且为array格式,不然报错
    22. # 设置模型session以及输入信息
    23. sess = rt.InferenceSession(model_path)
    24. input_name = sess.get_inputs()[0].name # input.1
    25. output = sess.run(None, {input_name: image_arr})
    26. print(output)
    27. # 对比两者结果是否一致,精确到小数点后5位
    28. y_torch = np.array(Lenet5()(image).detach().numpy().flatten())
    29. y_onnx = np.array(output).flatten()
    30. np.testing.assert_almost_equal(y_torch,y_onnx, decimal=5)
    31. print("ok!")

     

    3. 使用tensorrt中的trtexec工具进行onnx到tensorrt的转换:

    /usr/src/tensorrt/bin/trtexec --onnx=lenet5.onnx --saveEngine=lenet5.trt --workspace=6000

    如果tensorrt是使用deb安装的,默认装在/usr/src/下。如果是rar安装的,到对应路径下的bin目录里寻找trtexec。

    4. 运行tensorrt模型,首先需要安装torch2trt库:

    1. git clone https://github.com/NVIDIA-AI-IOT/torch2trt
    2. cd torch2trt
    3. python setup.py install

    trt.py:

    1. # -*- coding: utf-8 -*-
    2. """
    3. @Time : 8/10/22 3:34 PM
    4. @Auth : lakuite
    5. @File : trt.py
    6. @From : https://zhuanlan.zhihu.com/p/371239130
    7. """
    8. import tensorrt as trt
    9. import torch
    10. import numpy as np
    11. from torch2trt import TRTModule
    12. torch.manual_seed(1)
    13. logger = trt.Logger(trt.Logger.INFO)
    14. with open("lenet5.trt", "rb") as f, trt.Runtime(logger) as runtime:
    15. engine=runtime.deserialize_cuda_engine(f.read())
    16. model_all_names = []
    17. for idx in range(engine.num_bindings):
    18. is_input = engine.binding_is_input(idx)
    19. name = engine.get_binding_name(idx)
    20. op_type = engine.get_binding_dtype(idx)
    21. model_all_names.append(name)
    22. shape = engine.get_binding_shape(idx)
    23. print('input id:',idx,' is input: ', is_input,' binding name:', name, ' shape:', shape, 'type: ', op_type)
    24. print(model_all_names)
    25. image = torch.randn(2, 1, 32, 32).to('cuda:0') # 不加.to('cuda:0')会报错
    26. trt_model = TRTModule(engine, ["input.1"], ["32"])
    27. result_trt = trt_model(image)
    28. print(result_trt)

    可以看到,有1个输入1个输出,shape和value都能和onnx对应上。

    5. 安装Polygraphy,查看onnx转化tensorrt后的精度损失:

    1. python -m pip install colored polygraphy --extra-index-url https://pypi.ngc.nvidia.com
    2. # 配置环境变量
    3. sudo gedit ~/.bashrc
    4. export PATH=~/.local/bin:$PATH # 最后一行加入
    5. source ~/.bashrc
    6. polygraphy run lenet5.onnx --trt --onnxrt --rtol 1e-05 --atol 1e-05

    一些Polygraphy的介绍:TensorRT/tools/Polygraphy/polygraphy at master · NVIDIA/TensorRT · GitHub 

    错误汇总

    1. 运行trt.py时报错:RuntimeError: CUDA error: an illegal memory access was encountered

    参考:CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below m_氵文大师的博客-CSDN博客

    在trt.py中加入:

    1. import os
    2. os.environ['CUDA_LAUNCH_BLOCKING'] = '1'

    获得新的报错信息:

    参考: [TensorRT] ERROR: ../rtExt/cuda/cudaTiledPoolingRunner.cpp (117) - Cuda Error in execute: 719 (unspecified launch failure) - CUDA Programming and Performance - NVIDIA Developer Forums

    Never mind, I found the problem. I added torch.device in some classes to check if everything is running on the GPU and not CPU and this messed everything up. After deleting them it worked fine.

    确保输入加载在GPU上:

    image = torch.randn(2, 1, 32, 32).to('cuda:0')

    同时去除之前加的import os相关代码即可。

    参考文档

    [1] Getting Started with TensorRTx

    [2] CUDA的正确安装/升级/重装/使用方式

  • 相关阅读:
    windbg正确搜索堆上和栈上内存方法
    Azkaban
    深入理解New操作符
    idea如何排查jar冲突
    vue中使用keep-alive无效以及include 和 exclude用法
    python+selenium自动化测试项目实战
    Mac搭建Jmeter分布式加压步骤
    mysql死锁查看
    南卡和声阔真无线降噪耳机哪款更好?南卡和声阔蓝牙耳机测评
    深入解析Java HashMap的Resize源码
  • 原文地址:https://blog.csdn.net/qq_35756383/article/details/124557789
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号