抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

CodingStudio

努力进步

深度学习

TensorRT介绍

  • TensorRT采用C++开发, 能使深度学习模型在GPU上进行低延迟、高吞吐量的部署
  • Pytorch的支持需要先转换成中间模型ONNX格式
  • 工作流程
    • 首先输入一个训练好的 FP32 模型文件, 并通过 parser 等方式输入到 TensorRT 中做解析, 解析完成后 engin 会进行计算图优化
    • 得到优化好的 engine 可以序列化到内存(buffer)或文件(file), 读的时候需要反序列化, 将其变成 engine以供使用
    • 在执行的时候创建 context, 主要是分配预先的资源, enginecontext 就可以做推理(Inference)
  • 优化原理
    1. 算子融合(网络层合并)
    2. concat 层的消除; 对于 channel 维度的 concat 层, TensorRT 通过非拷贝方式将层输出定向到正确的内存地址来消除 concat 层, 从而减少内存访存次数
    3. Kernel 可以根据不同 batch size 大小和问题的复杂度, 去自动选择最合适的算法TensorRT 预先写了很多 GPU 实现, 有一个自动选择的过程; 其问题包括:怎么调用 CUDA 核心、怎么分配、每个 block 里面分配多少个线程、每个 grid 里面有多少个 block
    4. FP32->FP16,INT8,INT4:低精度量化, 模型体积更小、内存占用和延迟更低等
    5. 不同的硬件如 P4 卡还是 V100 卡甚至是嵌入式设备的卡, TensorRT 都会做对应的优化, 得到优化后的 engine

卷积网络的压缩方法

来源旷世学术分享-张祥雨:高效轻量级深度模型的研究和实践

  1. 低秩近似
    • 原理: 将权值矩阵表示为若干个低秩矩阵的组合, 其中每个低秩矩阵可以分解为小规模矩阵的乘积, 当秩取值很小时,能大幅降低总体的存储和计算开销
    • 方法:
      • 使用结构化矩阵进行低秩分解
      • 奇异值分解(SVD分解)
  2. 剪枝与稀疏约束
    • 方法1:对不重要的神经元进行剪枝随后微调网络
    • 方法2:对低于某个阈值的权重连接全部剪枝随后微调网络
    • 方法3:利用稀疏约束对网络进行剪枝(思路是在网络的优化目标中加入权重的稀疏正则项, 使得训练时网络的部分权重趋向于 0 , 而这些 0 值就是剪枝的对象)
  3. 参数量化
    • 浮点转定点, 加快运算速率同时减少内存和存储空间的占用保证模型精度损失在可接受的范围内
  4. 二值化网络
  5. 知识蒸馏
    • 先训练好一个 teacher 网络, 然后将 teacher 的网络的输出结果 qq 作为 student 网络的目标, 训练 student 网络, 使得 student 网络的结果 pp 接近 qq, 因此, student 网络的损失函数为 L=CE(y,p)+αCE(q,p)L = CE(y,p)+\alpha CE(q,p), yy 是真实标签的 onehot 编码, qqteacher 网络的输出结果, ppstudent 网络的输出结果
    • 使用softmax-T(软标签计算公式)解决teacher网络输出的softmax结果q置信度较高的问题(无法将teacher网络学到的数据的相似信息传达给student网络, 因为概率接近0)
    • softmax-T: qi=zi/Tjzj/Tq_{i} = \frac{z_{i}/T}{\sum_{j}z_{j}/T}
      • T 的取值会影响最终的结果, 一般而言, 较大的 T 能够获得较高的准确度, T(蒸馏温度参数)属于知识蒸馏模型训练超参数的一种. T 是一个可调节的超参数、T 值越大、概率分布越软(论文中的描述), 曲线便越平滑
  6. 浅层网络
    • 设计浅层网络MobilenetV2、ShuffleNetv2等作为backbone

YOLOv4论文中的相关工作

Bag of freebies(Tricks)
不改变模型大小, 主要针对输入和loss做的优化工作

  • 数据增强(data augmentation): 提升输入图像的可变性, 使模型在不同环境中会有更高的鲁棒性
    1. 逐像素调节:
    • 光度失真: 调节亮度、对比度、色调、饱和度噪声
    • 几何失真:随机缩放、裁剪、翻转、旋转
    1. 模拟对象遮挡
    • 随机擦除(random-erase)和Cutout方法:随机选择图像中的矩形区域, 并填充零的随机或互补值
    • 捉迷藏(hide-and-seek)和网格遮罩(grid-mask):随机或均匀地选择图像中的多个矩形区域, 并将它们替换为所有的 zeros(类似Dropout等在feature层面的操作)
    1. 多个图像一起执行数据增强
    • Mixup方法:使用两个图像以不同的系数比值相乘后叠加, 然后使用这些叠加的比值来调整标签
    • CutMix方法:将裁切后的图像覆盖到其他图像的矩形区域, 并根据混合区域的大小调整标签
    1. style transfer GAN方法用于数据扩充、减少 CNN 所学习的纹理偏差
  • 针对解决数据集中予以分布可能存在偏差的问题(semantic distribution in the dataset may have bias)
    1. 类别不平衡(imbalance between different classes)
      1. 两阶段对象模型: 困难负样本挖掘(hard negative example mining)或在线困难样本挖掘(online hard example mining (OHEM))
      2. 一阶段检测器(密集检测架构(prediction architecture)): Focal Loss决绝类别不平衡
    2. 很难用one-hot hard representation表达不同类别之间的关联程度, 但执行标记时通常使用这种方法
      1. 标签平滑(label smoothing)[Rethinking the inception architecture for computer vision]
      2. 知识蒸馏设置标签细化网络[Label refinement network for coarse-to-fine semantic segmentation]
  • 针对边界框(BBox)回归的目标函数
    • 传统目标检测器使用均方根误差MSE对中心点坐标以及高度和宽度直接执行回归, 或对基于锚的方法估计相应的偏移量, 没有考虑对象本身的完整性
    • IOU损失是尺度不变的表示, 所以可以解决传统方法计算 {x,y,w,h}\lbrace x, y, w, h \rbraceL1L1L2L2 损失时, 损失会随着尺度增加的问题
    • GIoU损失除了覆盖区域外还包括对象的形状和方向, 分母为同时包含了预测框和真实框的最小框的面积
    • DIoU损失还考虑了对象中心的距离
    • CIoU损失同时考虑了重叠区域, 中心点之间的距离和纵横比, 在 BBox 回归问题上可以实现更好的收敛速度和准确性.

Bag of sepcials(即插即用模块+后处理方法)
仅增加少量推理成本但可以显著提高目标检测器准确性的插件模块或后处理方法
一般而言, 插件模块用于增强模型中的某些属性, 例如扩大感受野, 引入注意力机制或增强特征集成能力等, 而后处理是用于筛选模型预测结果的方法

  • 增大感受野模块
    • 常用模块: SPP, ASPPRFB
      • SPP 起源于空间金字塔匹配(SPM),SPM 的原始方法是将特征图分割为几个d×dd\times d个相等的块, 其中dd可以为 {1,2,3,..}\lbrace 1,2,3, .. \rbrace, 从而形成空间金字塔. SPPSPM集成到CNN中, 并使用最大池化操作. 原始的SPP模块是输出一维特征向量, 在FCN网络中不可行
  • 引入注意力机制
    • 目标检测中常用的注意力模块为channel-wise注意力和point-wise注意力, 代表模型为SESAM
  • 特征融合或特征集成
    • 早期的实践是使用 skip connectionhyper-column 将低层物理特征集成到高层语义特征
    • 由于诸如 FPN 的多尺度预测方法已变得流行, 因此提出了许多集成了不同特征金字塔的轻量级模块. 这种模块包括 SFAM, ASFFBiFPN. SFAM 的主要思想是使用 SE 模块在多尺度级联特征图上执行通道级级别的加权
      • 对于 ASFF, 它使用softmax 作为逐点级别权重, 然后添加不同比例的特征图
      • BiFPN 中, 提出了多输入加权残差连接以执行按比例的级别重新加权, 然后添加不同比例的特征图
  • 激活函数
    • 良好的激活函数可以使梯度在反向传播算法中得以更有效的传播, 同时不会引入过多的额外计算成本
    • ReLU 激活函数, 实质上解决了传统的tanhsigmoid 激活函数中经常遇到的梯度消失问题
    • LReLUPReLU 的主要目的是解决当输出小于零时 ReLU 的梯度为零的问题
    • ReLU6Hard-Swish 是专门为量化网络设计的
    • SELU 激活函数来对神经网络进行自归一化
  • 后处理
    • 最开始常用 NMS 来剔除重复检测的 BBox, 但是 NMS 会不考虑上下文信息(可能会把一些相邻检测框框给过滤掉),
    • Soft NMS, 为相邻检测框设置一个衰减函数而非彻底将其分数置为零
    • DIoU NMS 则是在 soft NMS 的基础上将中心距离的信息添加到 BBox 筛选过程中
    • 值得一提的是, 因为上述后处理方法都没有直接涉及捕获的图像特征, 因此在后续的 anchor-free 方法中不再需要 NMS 后处理

评论