• 深度学习 之 模型部署【2】TensorRT 入门


    TensorRT 简介

    TensorRT 是 英伟达公司 根据自己的 硬件设备 面向 AI工作者 推出的 一种 模型部署方案

    同时 可以对网络进行 压缩、优化,它通过 combines layers、kernel 优化选择,以及根据指定精度执行归一化和转换成最优的 matrix math 方法,改善网络延迟、吞吐量和效率,实现模型加速,官方称 可以达到 6倍以上;

    它支持 多种 深度学习 框架,如 tf、pytroch等,即 它 可以从 深度学习框架中 直接 读取 网络结构 和 权重,没有框架的开销;  【不同的深度学习框架有自己的模型定义方式,TensoRT要获取模型的网络结构和参数权重,必然需要先能够“读懂”框架的“语言”】

    它本质上是一个 推理框架

    TensorRT 依赖于Nvidia的深度学习硬件环境,可以是GPU也可以是DLA,如果没有的话则无法使用

    更可喜的是它全面支持 python;

    windows10 下安装 TensorRT

    安装教程 还是 官网,下图为官网部分截图

     说明

    1. 在 TensorRT8 以后才支持 在 windows 的 python 操作

    2.经测试,无需安装 PyCUDA,可能后面应用时候需要,到时候再说

    3.TensorRT 只支持 部分 CUDA 版本      【刚开始没看官网,白折腾半天】

    4.注意对 深度学习框架版本 的 支持

    安装步骤

    1. 安装好 cuda 和 cudnn

    2. 下载 tensorRT,https://developer.nvidia.com/tensorrt,      【windows 下 python 接口 只能下载 版本8】

    3.解压

    4.把 lib 里 所有 dll 库 拷贝到 cuda 安装目录的 bin 目录下,或者 把 lib 目录放到 环境变量的 path 里

    5.进入 解压后的python目录,选择对应的 tensorrt 版本,pip 安装

    pip install tensorrt-8.2.3.0-cp38-none-win_amd64.whl

    6.其他非必要步骤 

    如果需要读取 onnx 格式模型文件,还需安装 onnx_graphsurgeon,进入该目录

    pip install onnx_graphsurgeon-0.3.12-py2.py3-none-any.whl

    同理执行

    pip install graphsurgeon-0.4.5-py2.py3-none-any.whl
    pip install uff-0.6.9-py2.py3-none-any.whl

    7.测试是否安装成功

    import tensorrt as trt
    print(trt.__version__)

    TensorRT 加速原理 

    简单理解下,把 3 次 1x1 卷积 合并了

    了解即可 

     TensorRT 使用方法

    通过 使用流程方法 可进一步理解 TensorRT 是干嘛的

    部署流程分为 预处理阶段 和 推理阶段,具体如下:

    1. 导出 深度学习 网络定义 和 权重参数 

    2. 解析 深度学习 网络定义 和 权重参数    【这两步说明 支持 多种框架】

    3. 根据 显卡算子 构造出最优执行计划

    4. 将最优执行计划 序列化存储

    5. 反序列化 最优执行计划

    6. 进行推理

    补充说明

    1. 步骤 3 说明 tensorrt 是和 硬件/显卡、环境/cuda 绑定的,如果 硬件、环境 发生变换,需要重新部署

    2. 虽说 tensorrt 支持 多种框架,但 通常 会把 tf、torch 等框架 的模型和参数转换成 onnx 格式,然后用 tensorrt 部署,

    因为 onnx 不像 tf、torch 那样需要安装对应的包,onnx 可认为是一种通用 语言,可以把 各种框架 转换成 该 语言,方便后续操作    【具体参考我的其他博客】

    预推理阶段

    该阶段是 结合 网络结构、参数 和 软硬件环境 生成 最优执行计划,并且 序列化 为 xxx.engine 文件;     【时间较长,故序列化】

    可以使用 tensorrt 自带的 trtexec.exe 实现(bin目录下),也可用 代码实现;

    命令行实现方式

    trtexec --onnx=xxx.onnx --saveEngine=xxx.engine --fp16

    fp16 模型量化的方式,还可取 int8,不推荐,虽然速度快,但精度损失较大

    python 代码实现预推理

    # 导入必用依赖
    import tensorrt as trt
    # 创建logger:日志记录器
    logger = trt.Logger(trt.Logger.WARNING)
     
    # 创建构建器builder
    builder = trt.Builder(logger)
    # 预创建网络
    network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
    # 加载onnx解析器
    parser = trt.OnnxParser(network, logger)
    success = parser.parse_from_file(onnx_path)
    for idx in range(parser.num_errors):
      print(parser.get_error(idx))
    if not success:
      pass  # Error handling code here
    # builder配置
    config = builder.create_builder_config()
    # 分配显存作为工作区间,一般建议为显存一半的大小
    config.max_workspace_size = 1 << 30  # 1 Mi
    serialized_engine = builder.build_serialized_network(network, config)
    # 序列化生成engine文件
    with open(engine_path, "wb") as f:
       f.write(serialized_engine)
       print("generate file success!")

    推理部署阶段

    该阶段是 反序列化 最优执行计划,然后进行推理;

    在 推理阶段,tensorrt 只关注 网络定义和权重参数,对于 输入和输出 需 另外导入;

    核心代码

    #导入必用依赖
    import tensorrt as trt
    import pycuda.autoinit  #负责数据初始化,内存管理,销毁等
    import pycuda.driver as cuda  #GPU CPU之间的数据传输
    #创建logger:日志记录器
    logger = trt.Logger(trt.Logger.WARNING)
    #创建runtime并反序列化生成engine
    with open(“sample.engine”, “rb”) as f, trt.Runtime(logger) as runtime:
        engine = runtime.deserialize_cuda_engine(f.read())
    #分配CPU锁页内存和GPU显存
    h_input = cuda.pagelocked_empty(trt.volume(context.get_binding_shape(0)), dtype=np.float32)
    h_output = cuda.pagelocked_empty(trt.volume(context.get_binding_shape(1)), dtype=np.float32)
    d_input = cuda.mem_alloc(h_input.nbytes)
    d_output = cuda.mem_alloc(h_output.nbytes)
    #创建cuda流
    stream = cuda.Stream()
    #创建context并进行推理
    with engine.create_execution_context() as context:
        # Transfer input data to the GPU.
        cuda.memcpy_htod_async(d_input, h_input, stream)
        # Run inference.
        context.execute_async_v2(bindings=[int(d_input), int(d_output)], stream_handle=stream.handle)
        # Transfer predictions back from the GPU.
        cuda.memcpy_dtoh_async(h_output, d_output, stream)
        # Synchronize the stream
        stream.synchronize()
        # Return the host output. 该数据等同于原始模型的输出数据
        return h_output

    官方示例

    TensorRT-8.4.1.5\samples\python 

    小结

    本文只是 基本教程,TensorRT 还有很多高级用法,比如 不仅可以载入模型,也可以自定义模型,比如支持动态 batch 等

    参考资料:

    https://docs.nvidia.com/deeplearning/tensorrt/install-guide/index.html    官网 安装

    https://blog.csdn.net/hjxu2016/article/details/122868139    TensorRT(10):python版本安装

    https://blog.csdn.net/Yang_4881002/article/details/124292512  NVIDIA TensorRT (python win10)安装成功分享   

    https://www.eet-china.com/mp/a125060.html   TensorRT8.4.xPythonAPI安装配置与测试      安装与 应用案例

    https://zhuanlan.zhihu.com/p/165359425           tensorRT 的安装与使用

    https://github.com/zhaogangthu/keras-yolo3-ocr-tensorrt    上篇文章的代码

    https://blog.csdn.net/JianguoChow/article/details/122684310  TensorRT(二)TensorRT使用教程(Python版)    【使用方法 主要参考】

    https://zhuanlan.zhihu.com/p/371239130  TensorRT详细入门指北,如果你还不了解TensorRT,过来看看吧!     【很全,有点多了,慢慢消化吧】

    https://blog.csdn.net/JianguoChow/article/details/122684310    使用教程 Python 版

  • 相关阅读:
    Cognos11第三方权限认证之OpenDJ
    Sqlserver 2008 R2安装的盘符空间不够用的解决办法
    Cognos11中通过URL访问report的设置
    Cognos11中关于CJAP第三方认证的相关配置
    Cognos11中报XQE-JDB-0004查找驱动程序类错误
    项目管理半开源工具备份和恢复
    CentOS7.4 安装rabbitmq-3.7.x
    Spring Cloud Zuul的一个坑
    题五:10行杨辉三角
    题四:一对兔子生兔子,给个月份算有几只兔子
  • 原文地址:https://www.cnblogs.com/yanshw/p/16461169.html
Copyright © 2020-2023  润新知