Skip to content

Latest commit

 

History

History
183 lines (92 loc) · 8.37 KB

README.md

File metadata and controls

183 lines (92 loc) · 8.37 KB

Deep Learning

模型设计

激活函数和损失函数

模型设计时, 输出层的激活函数与损失函数需要配套, 否则可能导致训练失败.

输出层激活函数 损失函数 注释
logSoftmax NLLLoss 等价于 CrossEntropyLoss
valid CrossEntropyLoss

数据加载

PyTorch提速

原始文档:https://www.yuque.com/lart/ugkv9f/ugysgn

声明:大部分内容来自知乎和其他博客的分享,这里只作为一个收集罗列。欢迎给出更多建议。

预处理提速

changelog

  • 2019年11月29日:更新一些模型设计技巧和推理加速的内容,补充了下apex的一个介绍链接, 另外删了tfrecord,pytorch能用么?这个我记得是不能,所以删掉了(表示删掉:<)。
  • 2019年11月30日:补充MAC的含义,补充ShuffleNetV2的论文链接
  • 2019年12月02日:之前说的pytorch不能用tfrecord,今天看到https://www.zhihu.com/question/358632497下的一个回答,涨姿势了。
  • 2019年12月23日:补充几篇关于模型压缩量化的科普性文章

预处理提速

  • 尽量减少每次读取数据时的预处理操作,可以考虑把一些固定的操作,例如 resize ,事先处理好保存下来,训练的时候直接拿来用

  • Linux上将预处理搬到GPU上加速:

IO提速

训练策略

代码层面

  • torch.backends.cudnn.benchmark = True
  • Do numpy-like operations on the GPU wherever you can
  • Free up memory using del
  • Avoid unnecessary transfer of data from the GPU
  • Use pinned memory, and use non_blocking=False to parallelize data transfer and GPU number crunching

模型设计

  1. 来自 ShuffleNetV2 的结论:(内存访问消耗时间,memory access cost 缩写为 MAC
    • 卷积层输入输出通道一致:卷积层的输入和输出特征通道数相等时 MAC 最小,此时模型速度最快
    • 减少卷积分组:过多的 group 操作会增大 MAC ,从而使模型速度变慢
    • 减少模型分支:模型中的分支数量越少,模型速度越快
    • 减少 element-wise 操作:element-wise 操作所带来的时间消耗远比在 FLOPs 上的体现的数值要多,因此要尽可能减少 element-wise 操作(depthwise convolution也具有低 FLOPs 、高 MAC 的特点)
  1. 其他:
    • 降低复杂度:例如模型裁剪和剪枝,减少模型层数和参数规模
    • 改模型结构:例如模型蒸馏,通过知识蒸馏方法来获取小模型

推理加速

  1. 半精度与权重量化:在推理中使用低精度(FP16 甚至 INT8 、二值网络、三值网络)表示取代原有精度(FP32)表示:
    • TensorRT是 NVIDIA 提出的神经网络推理(Inference)引擎,支持训练后 8BIT 量化,它使用基于交叉熵的模型量化算法,通过最小化两个分布的差异程度来实现
    • Pytorch1.3 开始已经支持量化功能,基于 QNNPACK 实现,支持训练后量化,动态量化和量化感知训练等技术
    • 另外 Distiller 是 Intel 基于 Pytorch 开源的模型优化工具,自然也支持 Pytorch 中的量化技术
    • 微软的 NNI 集成了多种量化感知的训练算法,并支持 PyTorch/TensorFlow/MXNet/Caffe2 等多个开源框架
  1. 网络 inference 阶段 Conv 层和 BN 层进行融合

时间分析

  • Python 的 cProfile 可以用来分析。(Python 自带了几个性能分析的模块: profilecProfilehotshot,使用方法基本都差不多,无非模块是纯 Python 还是用 C 写的)

项目推荐

  • 基于 Pytorch 实现模型压缩(1、量化:8/4/2 bits(dorefa)、三值/二值(twn/bnn/xnor-net);2、剪枝:正常、规整、针对分组卷积结构的通道剪枝;3、分组卷积结构;4、针对特征A二值的BN融合):https://github.com/666DZY666/model-compression

参考链接

上一篇

PyTorch使用LMDB数据库加速文件读取

下一篇

Pytorch有什么节省内存(显存)的小技巧?

训练模型