tensorRT 模型部署

news2024/11/24 17:33:58

 

讲解: 模型经过训练之后终端部署之前都会有一个模型转换的过程,英伟达也不例外, 模型转换的过程其实是一个模型优化与加速的过程,里面包含着引擎对模型的一系列操作, 比如说layer 级的融合,权重的量化、图层的切割,子图硬件层面的自适应、内存的分配等等

讲解: 这里说的就是layer级的融合,左边是训练出来的模型,右边是将卷积、偏置、激活层进行了一个融合之后的模型, 对比一下少了三分之二的layer,这样的做的目的是为了实现推理时减少内存的来回拷贝,提高线程数学计算量

 讲解: 这里罗列了模型量化的一些方法,每个计算平台都大同小异,绿色是NV平台支持的

 讲解: NV 平台量化原理:首先将模型量化成定点数(指定位数的数,包括整型和浮点型)去做模型推理, 以节省数据计算量,之后将推理结果反量化为浮点型数据得到推理结果。浮点数=量化缩放scale 因子 *量化定点数, 量化的过程就是得到一个最优的scale(实数和整数的对应关系)和zero point (表示实数中的0经过量化后的对应整数)去取代浮点数, 这个任务就落到了怎么去选最优的量化阈,量化阈就是上面说的阈值 当S取大时,可以扩大量化域,但同时,单个INT8数值可表示的FP32范围也变广了,因此INT8数值与FP32数值的误差(量化误差)会增大; 而当S取小时,量化误差虽然减小了,但是量化域也缩小了,被舍弃的参数会增多。

讲解: 阈值选择原理,基于相对熵,来衡量消除两个概率分部之间的差异所需要付出的努力值的大小

讲解: 量化的本质,激活值与权重量化 权重量化: 即仅仅需要对网络中的权重执行量化操作。由于网络的权重一般都保存下来了,因而我们可以提前根据权重获得相应的量化参数S和Z,而不需要额外的校准数据集。 一般来说,推理过程中,权重值的数量远小于激活值,仅仅对权重执行量化的方法能带来的压缩力度和加速效果都一般。 权重激活量化,即不仅对网络中的权重进行量化,还对激活值进行量化。 由于激活层的范围通常不容易提前获得,因而需要在网络推理的过程中进行计算或者根据模型进行大致的预测。 激活值的量化: 分在线和离线 在线量化,即指激活值的S和Z在实际推断过程中根据实际的激活值动态计算; 离线量化,即指提前确定好激活值的S和Z,需要小批量的一些校准数据集支持。 由于不需要动态计算量化参数,通常离线量化的推断速度更快些。 

 

 讲解: 如果模型量化之后是int8 模型校准,为甚么? 为什么对于不同模型都可行?如果有些模型缩小量化域导致的精度下降更明显,那INT8量化后的精度是不是必然有大幅下降了呢? 量化属于浮点数向定点数转换的过程,由于浮点数的可表示数值间隙密度不同, 导致零点附近的浮点数可表示数值很多,大约2^31个,约等于可表示数值量的一半。 因此,越是靠近零点的浮点数表示越准确,越是远离原点的位置越有可能是噪声, 并且网络的权重和激活大多分布在零点附近,因此适当的缩小量化域能提升量化精度几乎是必然的。

 讲解: 模型加速优化的过程:优先PTQ 不满足精度之后再QAT

 讲解: 模型校准精度对比:int8 与FP32,精度下降不会高于0.5%,推理速度以yolov5为例,推理时间下降为fp32 时的1/4左右

讲解: cpu-only 与trt 模型吞吐量与延时对比

 

 讲解:pytorch自定义算子的流程,继承torch.autograd.Function,重写forward和backward 方法,定义symbolic()来导出onnx

 讲解: pytorch 端自定义算子的举例,这里自定义了一个名字为Plugin 的节点,该节点实现的算子名称为HSwish

讲解: tensorRT 自定义算子流程,

1、重写creator 和nvinfer1::IPluginV2DynamicExt 类,实现类中的虚机函数

2、实现enqueue 中GPU 的核函数

 讲解: tensorRT 自定义插件类的实现具体op的creator 和 Plugin 类

讲解: 添加onnx parser支持新增Plugin 支持 引入开源项目 onnx-tensorRT ONNX  https://github.com/onnx/onnx-tensorrt 修改 onnx-parser 部分,在builtin_op_importers.cpp 部分新增名字为Plugin 的onnx 节点,在onnx模型转trt中该节点才会得以通过 

 

讲解: 实现具体的kernel 在enqueue 中调用

讲解: tensorRT 支持的算子轮子,在不断更新中

 讲解: 模型部署的流程

 讲解:CUDA编程模型 ,一些术语线程、线程束、 线程块 、网格、SM

 

讲解:流式多处理器SM 一个SM 相当于CPU的一核 线程(块)在SM中执行,每个SM 的执行相互独立,他们共享着二级缓存

讲解: 通常GPU 执行的最小线程基本单元为线程束,若干个线程束构成线程块, 多个线程块在一起组成了线程网格,可能的应用场景为多个线程块一起完成一项任务,比如执行某个CUDA 核 

讲解:GPU 内存模型 __global__ :修饰函数,可以从主机上调用并在设备上运行。 __device__ :表示以设备函数的形式编写,设备函数即只能被GPU内核调用的函数,只能从其他__device__函数或者从___global___函数中调用它们。相当于c语言函数声明之前添加一个static 或C++中的private __share__ :将该关键字添加到变量声明中,这将使这个变量驻留在共享内存中。 __constant__: 常量内存、声明一块常量内存 __syncthreads() : 线程同步

 讲解: 内存申请与拷贝, 由host 来主导 

 讲解:CUDA 核的加载方式

 讲解:GPU线程索引,可123D

yolo_pose decode 后处理并行计算举例分析

 优化原则、等级 1、选择好的算法(运输复杂度、是否适合并行化) 2、代码层面的优化,充分利用缓存 3、指令集的优化

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PMP考试中多少分算通过?

PMP考试成绩一般是在考完后 6-8 周开始出成绩,像之前318的PMP考试,5月8号晚上已经开始出成绩了,还没出来的也会陆续出来。 【如何查询成绩】 1、输入网址(PMI官网,不知道网址的私戳),点击 Log …

消息中间件中常见问题

如何保证消息不丢失 MQ的用途 异步发送(验证码,短信,邮件)MySQL,ES,Redis之间的数据同步分布式事务削峰填谷 消息可能丢失的环境 消息在产生端时候生产端挂掉,消息未到达交换机&#xff0c…

【新车评分】降价三万,排名第一的蔚来ES7更能打了?

去年6月,蔚来上市了该品牌第四款SUV车型——ES7,共分为两个版本标准版和首发版,发售价分别为46.8万和54.8万元。 不过近期蔚来以砍掉部分车主权益,换来了全系车型3万元的降价,ES7的起售价也来到了43.8万元和51.8万元。…

【Python 随练】利用递归方法求 5!

题目 利用递归方法求 5!。 简介 在本篇博客中,我们将使用递归方法解决一个数学问题:计算一个数的阶乘。阶乘是指将从1到某个正整数n的所有整数相乘,通常表示为n!。我们将介绍递归的概念,并给出一个完整的代码示例来计算给定数的…

P-Tuning v2: 与微调性能相等的提示性优化

原文:P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks 作者: Xiao Liu1,2 , Kaixuan Ji1 代码: https://github.com/THUDM/P-tuning-v2 一、简介 二、准备工作 ---- 2.1 NLU的任务 ---- 2.2 提示优化 三、P-Tu…

什么是云原生?

目录 1.简介2.云元素的四要素 1.简介 云原生:是一种构建和运行应用程序的方法,是一套技术体系和方法论。云原生(CloudNative)是一个组合词,Cloud Native: Cloud 表示应用程序位于云中,而不是…

基于OpenMV 循迹小车 + WIFI无线图传

文章目录 一、工程环境二、OpenMV1. 色块选定2. 色块识别3. 串口通信4. WiFi无线图传5. 代码汇总 三、MSP430四、视频演示 一、工程环境 1. 软件 OpenMV IDECode Composer StudioMicrosoft Edge 2. 硬件 MSP430F5529OpenMV4 H7及其 WiFi拓展板视觉云台旋转编码器、oled显示…

国际原油期货怎么开户?国际原油期货开户流程是什么?

随着国际原油期货交易的大众化,国际原油期货交易的入市门槛也在逐渐降低,使越来越多的国际原油期货交易爱好者能够参与到这个交易市场中。很多朋友可能对国际原油期货开户有很多的疑问,是不是很繁琐?需不需要很多的证明文件&#…

论文解读 | 皮质电图系统与软机器人致动器的完美结合

原创 | 文 BFT机器人 01 研究内容 主要研究内容是关于一种电皮层图谱系统的部署,该系统使用软体机器人致动器。论文详细介绍了该系统的制造和实验方法,并提供了相关的图表和参考文献。该系统的设计旨在提高电皮层图谱系统的灵活性和可植入性&#xff0c…

vite+vue3+cesium环境搭建

1.创建一个Vite项目 npm create vitelatest 2.安装cesium插件:vite-plugin-cesium npm i cesium vite-plugin-cesium vite -D 3、配置vite.config.js import cesium from vite-plugin-cesium; export default defineConfig({ plugins: [vue(),cesium()] }) 4、清空…

软件测试技能,JMeter压力测试教程(二)

目录 前言 一、案例场景 二、登录请求 三、Json 提取器 四、关联请求 五、遇到的坑 前言 现在很多接口的登录是返回一个json数据,token值在返回的json里面,在jmeter里面也可以直接提取json里面的值 上一个接口返回的token作为下个接口的入参 一、…

Python基础(12)——Python字符串详解

Python基础(12)——Python字符串详解 文章目录 Python基础(12)——Python字符串详解课程:字符串目标一. 认识字符串1.1 字符串特征1.2 字符串输出1.3 字符串输入 二、下标2.1 快速体验 三、切片3.1 语法3.2 体验 四、常…

Generative Adversarial Network(生成对抗网络)

目录 Generative Adversarial Network(生成对抗网络) Basic Idea of GAN GAN as structured learning Can Generator learn by itself Can Discriminator generate Theory behind GAN Conditional GAN Generative Adversarial Network(…

SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计

文章目录 环境配置开发工具下载Vue前端模板前端项目启动前端说明及修改修改导航栏自定义菜单与子菜单增加导航标签功能 前端数据格式 B站视频讲解:2023全网最简单但实用的SpringBootVue前后端分离项目实战 不想看视频可浏览此文章笔记,比较详细 环境配置…

民族工业领军企业:大族激光全流程数字化增长路径揭秘

1.关于大族激光 大族激光科技产业集团(简称“大族激光”,股票代码 002008)于 1996 年创立、2004 年上市,是亚洲最大、世界排名前三的工业激光加工及自动化整体解决方案服务商,专业从事工业激光加工设备与自动化等配套…

Python面向对象编程2-面向过程的银行账号模拟程序 项目2.2 取款与查看余额

项目总目标:用面向过程思想设计一个简单的银行账号模拟程序。本次将迭代多个程序版本,每个版本都将添加更多功能。虽然这些程序没有达到发布的质量标准,但整个项目的目的是关注于代码如何与一个或多个银行账户的数据进行交互。 分析项目的必要…

MySQL8漏洞处理之小版本升级至8.0.33

MySQL低版本经常会出现一些漏洞,有些高危漏洞就得处理,以防未知风险。 一、漏洞描述 MySQL 安全漏洞(CVE-2023-21912)(CVE-2023-21980): Oracle MySQL 5.7.41 版本及之前版本和 8.0.32 版本及之前版本的 Client programs 组件存在安全漏洞。低权限攻击…

使用Channel的一些业务场景

使用Channel的一些业务场景 首先需要明确的就是,发送方才知道什么时候关闭 channel ,这个是比较符合逻辑的。 我们需要知道哪些情况会使 channel 发生 panic 关闭一个 nil 值会引发关闭一个已经关闭的 channel 会引发向一个已经关闭的 channel 发送数据…

职场人的AI私塾,帮你打造得力的AI助手

你有没有想过,为什么有一些周围的小伙伴,工作量看着也不少,但事务处理速度特别快,质量也不差;一些看起来难度比较大或者生疏的工作,也能轻松应付得来,难道他们都是天生的工作能力出众&#xff1…

小白速看!带你轻松解决Java的空指针异常

关注“Java架构栈”微信公众号,回复暗号【Java面试题】即可获取大厂面试题 异常案例 对很多Java初学者来说,在学习的初期是很容易遇到各种异常的,就比如咱们今天要讲的这个空指针异常。所谓“授之以鱼,不如授之以渔”,…