模型部署-AI_pred 模型

AI算法

    .  算子在 PyTorch 中有实现
    . 有把该 PyTorch 算子映射成一个或多个 ONNX 算子的方法
    . ONNX 有相应的算子
即: PyTorch 算子 映射方法  ONNX 算子 这三个方面
1.PyTorch 框架和平台
    ATen (https://pytorch.org/cppdocs/#aten) 是 PyTorch 内置的 C++ 张量计算库,PyTorch 算子在底层绝大多数计算都是用 ATen 实现的
    自定义一个 PyTorch 算子
2.映射方法
  符号函数,可以看成是 PyTorch 算子类的一个静态方法。
      在把 PyTorch 模型转换成 ONNX 模型时,各个 PyTorch 算子的符号函数会被依次调用,以完成 PyTorch 算子到 ONNX 算子的转换
   将Pytorch训练好的模型直接导出成ONNX模型

3.ONNX,即 Open Neural Network Exchange 
   ONNX算子
   自定义 ONNX 算子
      g.op() 是用来定义 ONNX 算子的函数
 建议先学会添加算子的方法,走通整个流程之后,再回来填那些坑 
      onnx 需要将板端芯片不友好或不支持算子规避掉。导出onnx修改的部分

pytorch

 dynamic_axes 参数,使得动态接受数据的数量。		  

ONNX

 ONNX 文件使用 .onnx 扩展名,并且基于 Protocol Buffers(protobuf)格式进行序列化。
   ONNX 使用的是 Protobuf 这个序列化数据结构去存储神经网络的权重信息	 
  ONNX本身其实是一种模型格式,属于文本,不是程序,因而无法直接在硬件设备上运行。
  因此,就需要ONNX Runtime、TensorRT等软件栈(推理框架(引擎))来加载ONNX模型,
  从而使得它在硬件设备上能够高效地推理。
  
  推理阶段: 模型在训练时,BN层、dropout都会起作用,而推理是不需要的

推理

ONNX 文件可以直接在支持 ONNX 的推理引擎(如 ONNX Runtime、TensorRT、OpenVINO 等)中进行高效推理
    ONNX Runtime 是一个高性能、跨平台的推理引擎,用于在多种硬件和操作系统上运行机器学习模型 微软的仓库
    TensorRT     是英伟达(NVIDIA)推出的一种高性能深度学习推理引擎,旨在加速深度学习模型的推理过程	
    OpenVINO     是英特尔(Intel)推出的一种深度学习推理引擎,它可以在英特尔的CPU、GPU、VPU等不同硬件平台上高效地运行深度学习模型		
	         Open Visual Inference and Neural Network Optimization

TensorRT

TensorRT 3版本起,它提供了C++和Python两种编程接口,进一步加速了深度学习模型的推理过程				 
在推理阶段,由于不需要进行反向传播,可以安全地降低数据精度至FP16或INT8,
    这不仅减少了内存占用和延迟,还使得模型体积更小,提高了推理速度
结构转换路线: Pytorch → ONNX → TensorRT	

安装TensorRT 
步骤-ONNX → TensorRT	
	1.构建阶段。对ONNX模型转换和优化,输出优化后模型
	     转换过程中涉及到算子融合,层的优化,量化
	2.运行阶段。加载优化后模型,执行推理。

API 
               定义在  NvInfer.h    头文件中,并且在  nvinfer1   命名空间
   onnx解析器的定义在 NvOnnxParser.h头文件中,并且在 nvonnxparser 命名空间下

   NvInfer.h 来调用C++ AP	都以I开头
     #include "NvInfer.h"
	    先必须实例化 ILogger 接口。 此示例捕获所有警告消息但忽略一般消息
		创建Builder
	    创建网络定义
		创建一个 ONNX 解析器来填充网络-接下来读取模型文件
		创建一个构建配置,指定 TensorRT 应如何优化模型-创建引擎
数据
    输入和输出传递 TensorRT 缓冲区,TensorRT 要求您通过调用 setTensorAddress 来指定,它采用张量的名称和缓冲区的地址	
		
一旦构建了引擎, 通常需要将其序列化以供以后使用。 在将模型用于推理之前,并非绝对有必要对模型进行序列化和反序列化

Cuda编程

CUDA是由NVIDIA推出的并行计算架构,可充分利用GPU的并行计算引擎
  CUDA编程模型是一种异构计算模型,涉及CPU(主机)和GPU(设备)的协同工作
     基于 CPU+GPU 的异构计算架构
	一般用Host指代 CPU 及其内存,Device 指代 GPU 及其内存。
	  CUDA 程序中既包含在 Host 上运行的程序,也包含在 Device 上运行的程序, 

CUDA提供了三种不同的API:Runtime API和Driver API、Libraries
    CUDA Library(CUDA函数库
	   (cuDNN) 是一个 GPU 加速的深度神经网络基元库 cuDNN是NVIDIA开发的深度学习计算库,基于CUDA平台		
        npp
         CUDA中的NPP函数库  主要用于图像和视频的处理  NPP(NVIDIA Performance Primitives)
            nnp.h包含了nppi.h、npps.h、nppcore.h、nppdefs.h,
           即包含了NPP的所有头文件,所以写代码的时候引入npp.h就可以了。
         #include <nppi.h>//npp用于图像处理 i:image  NPPI (NVIDIA Performance Primitives Imaging):
         #include <nppdefs.h>//npp的一些数据结构的定义 nppcore.h和nppdefs.h是NPPC的头文件 NPPC (NVIDIA Performance Primitives Core):
         #include <nppcore.h>//npp的一些核心内容,包括什么兼容性、线程数什么的 
         #include <npps.h>//npp用于信号处理 s:signa
           颜色空间转换的API在nppi_color_conversion.h中	 尺寸转换API 
    Runtime API是一组函数,用于在编写CUDA程序时执行核函数之前分配和释放设备上的内存、将数据从主机复制到设备并执行核函数等任务
        cuda_runtime.h头文件一般就是Runtime API中,运行时的API和其参数的定义。
    	Runtime API 是基于 Driver API 之上开发的一套 API  Runtime API 基本都是以 cuda 开头的。
    	函数库 libcudart.so
		nvcc 编译器等。
    Driver API允许开发人员更详细地控制GPU的行为,包括访问GPU硬件资源、配置GPU寄存器和指令流等		
     (如果使用Driver API,驱动API则头文件使用cuda.h)
       driver 安装后会提供nvidia-smi命令
       函数库 libcuda.so   Driver API 基本都是 cu 开头的

数据

 图像排列方式分为packed(打包格式)和planar(平面格式)两种模式	

参考

 使用C++部署TensorRT https://blog.csdn.net/wq_0708/article/details/121248152	   
posted @ 2024-12-18 18:06  辰令  阅读(106)  评论(0)    收藏  举报