CUDA与TensorRT(7)之TensorRT INT8加速

1. TensorRT FP16优化加速

FP32数据切割成FP16,会损失一定精度

加速方式:
config->setFlag(BuilderFlag::kFP16);
builder->platformHasFastFp16() builder->platformHasFastInt8()
在这里插入图片描述


2. INT8量化算法

(1)什么是INT8量化?

将基于浮点的模型转换成低精度的int8(char or uchar)数值进行运算,以加快推理速度。
主要是针对的矩阵相乘和卷积操作

(2)为什么INT8量化会快?

(a)对于计算能力大于等于SM_61的显卡,如Tesla P4/P40 GPU,NVIDIA提供了新的INT8点乘运算
的指令支持-DP4A。该计算过程可以获得理论上最大4倍的性能提升。
(b)Volta架构中引入了Tensor Core也能加速INT8运算

FP16 和 INT8能加速的本质
通过指令 或者 硬件技术,在单位时钟周期内,
FP16 和 INT8 类型的运算次数 大于 FP32 类型的运算次数。

(3)为什么INT8量化不会大幅损失精度?

(a)神经网络的特性:具有一定的鲁棒性。
原因:训练数据一般都是有噪声的,神经网络的训练过程就是从噪声中识别出有效的信息。
思路:可以将低精度计算造成的损失理解为另一种噪声
(b)神经网络权值,大部分是正态分布,值域小且对称
在这里插入图片描述

(4)INT8量化算法

动态对称量化算法 使用于:

(1)PyTorch dynamic quantization
(2)ONNX quantization

主要使用在server端模型大的。

动态非对称量化算法 使用于

(1)Google Gemmlowp

主要使用在ARM的嵌入式端

静态对称量化算法 使用于

(1)PyTorch static quantization
(2)TensorRT
(3)NCNN


3. 三种INT8量化算法介绍

(1)动态对称量化算法

在这里插入图片描述

优点:算法简单,量化步骤耗时时间短;
缺点:会造成位宽浪费,影响精度

(2)动态非对称量化算法

在这里插入图片描述

优点:不会造成bit位宽浪费,精度有保证;
缺点:算法较复杂,量化步骤耗时时间长

具体的量化步骤(图中可以看出过程相当复杂):
在这里插入图片描述

(3)静态对称量化算法

 动态量化,推理时实时统计数值|max|
 静态量化,推理时使用预先统计的缩放阈值,截断部分阈值外的数据

优点:算法最简单,量化耗时时间最短,精度也有所保证;
缺点:构建量化网络比较麻烦

INT8就一定快吗?
 Float 运算时间 Tfloat

 低精度运算时间Tint8

 输入量化运算时间 Tquant

 输出反量化时间 Tdequant

INT8 性能收益 = Tfloat – Tint8 – Tquant – Tdequant
经验:

权值越大,输入越小,加速比越大。
输入越大,收益越小,甚至负收益


4. TRT使用

(1)对于深度神经网络的推理,TRT可以充分发挥GPU计算潜力,以及节省GPU存储单元空间。
(2)对于初学者,建议先从Sample入手,尝试替换掉已有模型,再深入利用网络定义API尝试搭建
网络。
(3)如果需要使用自定义组件,建议至少先了解CUDA基本架构以及常用属性。
(4)推荐使用FP16/INT8计算模式
  • FP16只需定义很少变量,明显能提高速度,精度影响不大;
  • Int8有更多的潜力,但是可能会导致精度下降。
(5)如果不是非常了解TRT,也可以尝试使用集成了TRT的框架,但是如果不支持的网络层太多,
会导致速度下降明显。
(6)在不同架构的GPU或者不同的软件版本的设备上,引擎不能通用,要重新生成一个。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorRT是NVIDIA深度学习推理库,可以用于加速神经网络模型的推理,包括 ONNX 模型。下面是使用 TensorRT 加速 ONNX 模型的一些步骤: 1. 安装 TensorRT:可以从 NVIDIA 官网下载并安装 TensorRT 的相应版本。 2. 将 ONNX 模型转换为 TensorRT 引擎:使用 TensorRT 的 ONNX Parser 将 ONNX 模型转换为 TensorRT 引擎。这可以通过以下代码实现: ```python import tensorrt as trt import onnx # Load the ONNX model as a graph and prepare the TensorRT inference engine onnx_model = onnx.load('model.onnx') onnx.checker.check_model(onnx_model) trt_engine = trt.utils.\ onnx_to_trt_engine(onnx_model, max_batch_size=1, max_workspace_size=1 << 28, precision_mode="FP16", minimum_segment_size=2) ``` 3. 创建 TensorRT 推理引擎:创建 TensorRT 推理引擎实例,并为其分配输入和输出张量的内存。这可以通过以下代码实现: ```python # Create a TensorRT inference engine trt_logger = trt.Logger(trt.Logger.WARNING) trt_runtime = trt.Runtime(trt_logger) trt_context = trt_engine.create_execution_context() # Allocate memory for inputs and outputs input_shape = trt_engine.get_binding_shape(0) output_shape = trt_engine.get_binding_shape(1) input_size = trt.volume(input_shape) * trt_engine.max_batch_size * np.dtype(np.float32).itemsize output_size = trt.volume(output_shape) * trt_engine.max_batch_size * np.dtype(np.float32).itemsize # Allocate device memory d_input = cuda.mem_alloc(input_size) d_output = cuda.mem_alloc(output_size) ``` 4. 执行推理:将输入数据复制到设备内存,执行推理,然后将输出数据从设备内存复制回主机内存。这可以通过以下代码实现: ```python # Copy input data to device memory cuda.memcpy_htod(d_input, input_data) # Execute the inference trt_context.execute_v2(bindings=[int(d_input), int(d_output)]) # Copy output data from device memory output_data = np.empty(output_shape, dtype=np.float32) cuda.memcpy_dtoh(output_data, d_output) ``` 这些步骤可以帮助你使用 TensorRT 加速 ONNX 模型的推理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值