模型部署量化
文章平均质量分 77
模型部署量化
令狐少侠、
**
展开
-
基于3d稀疏卷积的centerpoint部署
backbone前面部分全部用tensorRT实现定义算子并调用TensoRT API搭建推理引擎。原创 2023-03-11 19:31:09 · 1128 阅读 · 13 评论 -
cuda Sgemm矩阵乘法优化
一个线程的计算过程如下图所示,每次从Shared memory中取矩阵A的长度为TM的向量和矩阵B的长度为TN的向量,这两个向量做外积并累加到部分和中,一次外积共TM * TN次乘累加,一共需要循环BK次取数和外积。计算一次 FMA(乘累加)之前需要读一次 A 和读一次 B,众所周知,读取 Global Memory 的代价很大,通常都需要几百个 cycle(时钟周期),而计算一次 FMA 通常只需要几个 cycle,大量的时间被花费在了访存上。注意M、N要为4的倍数,M可以为任意数。,同时考虑边缘情况,原创 2023-01-18 09:32:17 · 408 阅读 · 0 评论 -
TensorRT量化工具pytorch_quantization代码解析(四)
补充下相关的公式理论基础,再写!!!继续看其作用:收集校准数据的统计信息:将校准数据馈送到模型,并以直方图的形式收集每个层的激活分布统计信息以进行量化。收集直方图数据后,使用一个或多个校准算法( compute_amax)校准刻度( calibrate_model )。在标定过程中,尽量确定每一层的量化尺度,以达到优化模型精度等目标。原创 2023-03-02 17:33:07 · 1522 阅读 · 4 评论 -
TensorRT量化工具pytorch_quantization代码解析(二)
为了处理量化梯度,除了未定义的点之外,几乎所有地方都是零,可以使用 直通估计器 ( STE ),它通过伪量化操作符传递梯度。希望存储为float,pytorch函数接受float量化值,它可能不接受整数输入。例如,对于num_bits=8,[0,255]。输入将在[-amax,amax]范围内量化,amax将广播到inputs tensor。例如,对于num_bits=8,用[-127,127]代替[-128,127]。在前向过程中,对浮点权重和激活进行伪量化,并使用这些伪量化的权重和激活来执行层的操作。原创 2023-02-28 19:51:47 · 1600 阅读 · 1 评论 -
TensorRT量化工具pytorch_quantization代码解析(一)
API 的核心是 TensorQuantizer 模块,它可以量化、伪量化或收集张量的统计信息。在 TensorQuantizer 之上的是量化模块,这些模块被设计为 PyTorch 全精度模块的替代品。这些是使用 TensorQuantizer 对模块的权重和输入进行伪量化或收集统计信息的方便模块。转换也可以使用 API 手动完成,这允许在不想量化所有模块的情况下进行部分量化。会动态地修改 PyTorch 代码,以便将 torch.nn.module 的一些子类替换为对应的量化版本。原创 2023-02-28 16:29:18 · 3144 阅读 · 1 评论 -
基于pointpillars的点云目标检测、测试评估、TensorRT后量化及ROS可视化
参考:https://github.com/traveller59/kitti-object-eval-python,把相应的的依赖函数提取出来了,不需要单独安装second-1.5.1,spconv-1.0。也可以混合精度测试,通过修改config里的yaml参数,测试评估时要保证路径一一对应。可以看出int8精度损失比较严重,需要进一步做感知训练量化,接下来会利用英伟达提供的。编译代码,会得到两个可执行文件,一个用于获取数据的推理结果,一个用于可视化。进一步做感知训练量化。原创 2023-02-09 20:44:10 · 1573 阅读 · 7 评论 -
一文读懂TensorRT整数量化
模型量化是一种流行的深度学习优化方法,其中模型数据(包括网络参数和激活)从浮点表示转换为较低精度表示,通常使用 8 位整数。在处理 8 位整数数据时, NVIDIA GPU 使用更快更低成本的 8 位张量核来计算卷积和矩阵乘法运算。这会产生更多的计算吞吐量,这在计算受限的层上尤其有效。将数据从内存移动到计算单元(在 NVIDIA GPU s 中的流式多处理器)需要时间和能量,而且还会产生热量。将激活和参数数据的精度从 32 位浮点值降低到 8 位整数可导致 4 倍的数据缩减,从而省电并减少产生的热量。原创 2023-02-07 22:44:27 · 1102 阅读 · 0 评论 -
TensoRT—— buffers管理(samplesCommon::BufferManager)
BufferManager类处理主机和设备缓冲区分配和释放。这个RAII类处理主机和设备缓冲区的分配和释放、主机和设备缓冲器之间的memcpy以帮助推断,以及调试转储以验证推断。BufferManager类用于简化缓冲区管理以及缓冲区和引擎之间的任何交互。原创 2022-12-13 13:45:46 · 1161 阅读 · 4 评论 -
生成voxel——spconv源码剖析(六)
是一个只包含头文件的轻量级库,可以通过它实现。的优点是API比较简单且对。直接看代码,有详细的注释。调用时,将调用该函数。原创 2022-11-24 20:52:28 · 2046 阅读 · 1 评论 -
TensoRT API自定义trt网络结构
若使用tensorrt加载wts格式,需将模型训练的pt、pth、ckpt等格式权重转换为wts。原创 2022-11-24 09:24:20 · 576 阅读 · 2 评论 -
3d稀疏卷积——spconv源码剖析(五)
下面介绍了根据构建的Rulebook执行具体稀疏卷积计算,继续看类。PyTorch` 会自动调度该函数,合适地执行前向和反向计算。SubMConvFunction的前向传播forward调用。在前向推理或者反向传播时的调度,使用。类有一个很好的性质:如果它定义了。把这个调用方法取了一个更简短的别名。的一个方法,这个方法完成了。函数不太“美观”,这里用。算子时,我们可以忽略。对象辗转还是会继续调用。来封装算子的底层调用。扩充:对模型部署来说,的实现细节,而只通过。这个接口来访问算子。原创 2022-11-22 14:39:27 · 763 阅读 · 0 评论 -
3d稀疏卷积——spconv源码剖析(四)
对于counter变量含义可以参考注释代码,如哪些些地方理解有误,也麻烦大家指出来。作用根据输入点计算输出哈希表和输出所用到的卷积核权重的位置,同时返回有效输出个数。我们继续看普通稀疏卷积RuleBook的建立过程,返回。卷积为例:给定输入点的输出点取决于内核大小。直接看下列代码,注释比较详细了。函数的普通3D稀疏卷积部分。普通3d稀疏卷积调用。原创 2022-11-21 20:10:14 · 433 阅读 · 0 评论 -
3d稀疏卷积——spconv源码剖析(三)
注册的算子可以通过torch.xxx或者tensor.xxx的方式进行调用,该方式同样与pytorch源码解耦,增加和修改算子不需要重新编译pytorch源码。用该方式注册一个新的算子,流程非常简单:先编写C++相关的算子实现,然后通过pytorch底层的注册接口(torch::RegisterOperators),将该算子注册即可。逻辑部分,并且子流行3d稀疏卷积和正常3d稀疏卷积分开讨论,优先子流行3d稀疏卷积。用于保存卷积核每一个位置上的总的计算的次数,这里分配理论最大的内存,它的。原创 2022-11-19 16:35:21 · 1805 阅读 · 1 评论 -
3d稀疏卷积——spconv源码剖析(二)
本文基于OpenPCDet框架中算法,对spconv库中稀疏卷积源码进行剖析:首先看OpenPCDet下的。package`目录下有__init__.py 文件,在导入spconv时__init__.py中的可执行代码会被执行在导入完spconv后,可以直接使用等子模块__init__.py是Python中package的标识,定义了包的属性和方法__在__init__.py中定义了3d稀疏卷积的核心数据结构,但是本身并不是一个,只是对稀疏Tensor的一个抽象。原创 2022-11-19 16:27:04 · 2335 阅读 · 2 评论 -
3d稀疏卷积——spconv源码剖析(一)
和对应上图的Hash_in,和Hash_out。对于是下标,key_ in表示value在中的位置。现在的input一共两个元素P1和P2,P1在的(2, 1)位置,P2在的(3,2)的位置,并且是YX顺序。这里只记录一下p1的位置 ,先不管p1代表的数字把这个命名为。input hash tabel的构建完成了,接下来构建 output hash table。用一个kernel去进行卷积操作:但是,并不是每次卷积kernel都可以刚好碰到P1。所以,从第7次开始,输出的这个矩阵就不再变化了。原创 2022-11-14 10:33:38 · 3401 阅读 · 1 评论 -
模型部署——CenterPoint转ONNX(自定义onnx算子)
4.torch stack算子 onnx不支持,导出onnx计算图很,将stack和后续PointPillarScatter转换一起定义为ScatterBevPlugin算子,自定义onnx节点和自定义TensorRT算子来实现。2.torch_scatter的scatter_mean和scatter_max onnx不支持,人为自定义onnx节点,后续并自定义tensorRT的scatter_mean和scatter_max算子。原创 2022-10-27 09:17:55 · 3086 阅读 · 15 评论 -
onnx_graphsurgeon修改onnx计算图
shape (Sequence[Union[int, str]]) :张量的形状,如果模型使用尺寸参数,则可能包含字符串。方便函数,用于获取此张量的输入节点之一的输入张量。producer_idx(int):如果张量有多个生产者,则输入张量的生产者节点的索引,默认为0。注:此处的“空”是指张量的名称,对于可选张量,省略了该名称,而不是张量的形状。tensor_idx(int):输入节点的输入张量的索引,默认为0。方便函数,用于获取此张量的输出节点之一的输出张量。制作此张量的浅拷贝,省略输入和输出信息。原创 2022-10-21 22:47:36 · 3229 阅读 · 1 评论 -
模型部署——pointpillars转一个onnx
在torch和onnx精度对齐过程中发现,scatterND reshape输出值,有部分为nan,影响后续计算,决定认为将值为nan替换为0,可以在onnx图中看出多了isnan和where节点。本文转的onnx是静态的,也可以将voxel个数改为动态输入。原创 2022-10-07 21:26:53 · 1792 阅读 · 13 评论 -
KL散度理解
相对熵(relative entropy),又被称为Kullback-Leibler散度(Kullback-Leibler divergence)或信息散度(information divergence),是两个概率分布(probability distribution)间差异的非对称性度量。在信息理论中,相对熵等价于两个概率分布的信息熵(Shannon entropy)的差值。KL散度的定义:一个随机变量X的可能值为Xx1x2...xn,对应的概率为pipXx。原创 2022-09-20 13:31:29 · 252 阅读 · 0 评论 -
模型部署——onnx定义、读写和调试
尝试完全用 ONNX 的 Python API 构造一个描述线性函数 output=a*x+b 的 ONNX 模型。我们将根据上面的结构,自底向上地构造这个模型。首先,我们可以用 helper.make_tensor_value_info 构造出一个描述张量信息的 ValueInfoProto 对象。如前面的类图所示,我们要传入张量名、张量的基本数据类型、张量形状这三个信息。在 ONNX 中,不管是输入张量还是输出张量,它们的表示方式都是一样的。原创 2022-09-18 14:03:30 · 2558 阅读 · 1 评论 -
模型部署——初识TorchScript
TorchScript是PyTorch模型(nn.Module的子类)的中间表示,可以在高性能环境(例如C ++)中运行。原创 2022-03-26 23:14:17 · 353 阅读 · 0 评论 -
模型部署——融合BN和Conv层
今天我们将尝试了解如何使我们的模型在推理上更快一点。使用 Batch Normalization 作为提高泛化能力的一种方式浪费了大量的网络。但是在推理过程中,批量归一化被关闭,而是使用近似的每通道均值和方差。很酷的是,我们可以通过 1x1 卷积实现相同的行为。更好的是,我们可以将它与前面的卷积合并。原创 2022-09-14 15:23:45 · 1175 阅读 · 0 评论