• (O^^O)你是怎么用tensorRT开发的,我是这样的


    作为一个AI打工人怎么能少得了在服务器端推理的框架TensorRT呢,但是安装过的打工人知道,各种依赖,是让人抓狂,那今天我来说一套我的方法

    原理:GPU + nvidia-docker2 + tiny-TensorRT

    先说下笔者的硬件环境(其实就是想秀波GPU)

    首先给服务器安装驱动

    不用安装cuda、cudnn等,具体请看笔者上篇博客 https://www.cnblogs.com/nanmi/p/14132105.html

    安装docker

    既然使用容器化的东西,得安装docker吧,版本安装最新的就好了,网上教程一大堆就不写了。

    安装nvidia-docker2

    安装过程可以参考bewithme大神的博客https://blog.csdn.net/bewithme/article/details/105092159 如果是别的系统的请百度对应的安装方法,笔者宿主机是CentOS

    测试安装的是否能在容器中调用GPU不用按照网上教程直接下载nvidia/cuda镜像,太大了,可以下载相应的tag版本,比如笔者这个就挺好才100多M

    测试方法:

    $ docker run --runtime=nvidia --rm nvidia/cuda:10.0-base nvidia-smi

    有输出显卡的使用内容即成功

    启动tensorrt容器

    $ docker pull venalone/tensorrt7:cuda10.2
    $ docker pull nvcr.io/nvidia/tensorrt:20.12-py3
    $ docker run -itd --name my_tensorrt_env --runtime=nvidia -p 0.0.0.0:xx:22 venalone/tensorrt7:cuda10.2 /bin/bash
    $ docker run -itd --name my_tensorrt_env --runtime=nvidia -p 0.0.0.0:xx:22 nvcr.io/nvidia/tensorrt:20.12-py3 /bin/bash

    进容器先看看

    发现在容器的/usr/local/下cuda也有了,tensorrt也有了,此时python也没有建立软连接的,但是已经在/usr/local/bin下有python3了

    开发环境都建立好了,那我要怎么开发呢,开发tensorrt C++可是很烦人呢,有人说那儿哦用tensorrt python API啊,实际上,我接触到的是,大家没人用python来做推理,那C++ API又很复杂,python API又应用不广泛,

    怎么办呢?答案是tiny-TensorRT,GitHub项目地址 https://github.com/zerollzeng/tiny-tensorrt,这是大神Ren Zeng 在nvidia tensorrt C++ API的基础上做了分装,使得我这种混子之类的可以站在巨人的肩膀上开发

    下载项目及子模块

    $ git clone --recurse-submodules -j8 https://github.com/zerollzeng/tiny-tensorrt.git
    
    $ cd tiny-tensorrt

    该项目包含几个部分:

    cmake:定义了project CMakeLists.txt去查找你系统的架构、cuda等的函数

    plugin:是当模型的某些OP不被支持,这是很常见的事情,自定义的插件代码,里面又三个示例,插件才是灵魂啊!!!

    pybind11:项目作者不仅考虑到C++作为入口,同时也考虑到python作为入口,这样主体是C++的发挥其性能和灵活性,入口却是python入口,果然是大神,膜拜。

    spdlog:是输出日志,打印等函数的分装,这样使用起来就好用了。

    test:是测试调用该框架是最终是如何使用调用的呢,真的分装很好了,极简单了。

    另外几个文件:Int8Calibrator.cpp和其同名头文件是用来做INT8单精度量化的,不了解原理的可以百度下,量化单精度时是分为饱和量化和不饱和量化,网络模型的weight是做不饱和的量化(对称量化),按比例压缩到±127,而对每一层的响应做的是饱和量化,又叫非对称量化,总之int8的模型weight是做不饱和量化,响应(激活值做饱和量化),这个会涉及到KL散度(相对熵),具体可参考我的另外稍早时候的博客,有对量化做详细说明https://www.cnblogs.com/nanmi/p/13607515.html

    PyTrt.cpp是为了做C++和python绑定用的,入口

    Trt.cpp和Trt.h是代码的核心之一,可以详细阅读

    utils.h是定义了一些简单的小工具的组件头文件引用就可以

    编译

    首先在/etc/profile配置环境变量

    export CUDA_HOME=/usr/local/cuda
    export PATH=$CUDA_HOME/bin:$PATH
    export LD_LIBRARY_PATH=$CUDA_HOME/lib64$LD_LIBRARY_PATH
    
    
    export TENSORRT_HOME=/usr/local/TensorRT-7.0.0.11/
    export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:${TENSORRT_HOME}/include
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${TENSORRT_HOME}/lib
    export LIBRARY_PATH=$LIBRARY_PATH:${TENSORRT_HOME}/lib
    export PATH=$PATH:${TENSORRT_HOME}/bin

    然后编译

    修改CMakeLists.txt中放开编译python、test的选项ON

    $ cd tiny-tensorrt
    $ mkdir -p build && cd build
    $ cmake ..
    $ make -j32

    编译完成后,会产生libtinytrt.so结合Trt.h只需要这两个就可以完成对该封装的使用,使用示例在test文件夹下

    Reference

    [1] https://github.com/zerollzeng/tiny-tensorrt

    [2] https://github.com/zerollzeng/tiny-tensorrt/blob/master/docs/CustomPlugin-CN.md

  • 相关阅读:
    做了6年开发,工资涨不上去,怎么办?(安晓辉,循循善诱的分析)
    Hello World
    服务治理框架
    Range锁(也即范围锁)
    C# .NET Socket
    Net Core应用,在CentOS上运行
    分布式锁,进程锁,线程锁
    TEMPDB
    学会Git
    Docker
  • 原文地址:https://www.cnblogs.com/nanmi/p/14141139.html
Copyright © 2020-2023  润新知