本手册将围绕着深度学习的性能优化进行讨论,优化的前提是测量(有句名言If you can not measure it, you can not improve it),我们将在章节1.2介绍深度学习的性能评价指标与测量方法。在此之前,我们首先介绍深度学习的自顶向下优化思路,即从神经网络结构设计开始,经过训练,模型剪枝与量化,最后到模型部署这整个过程中各个环节的优化。
首先需要设计可以训练到高精度,且尽可能紧凑的神经网络结构。本手册会在第2章节中集中讨论这部分的内容,包括经典的神经网络结构设计(例如ResNet[1]等),紧凑的神经网络结构设计(例如MobileNet[2]等),以及基于神经网络结构搜索的方法。
在设计好了网络结构之后,还需要将该网络结构在对应数据集上训练到尽可能高的精度,这需要非常细心的调节网络训练的各种超参数,以及采取各种方法来避免过拟合。在第3章节中本手册将讨论训练神经网络的各种技巧,包括如何调节训练的超参数,自动的超参数调节方法与工具;以及如何解决数据类别不均衡;除此之外还会讨论各种数据增强的方法并以此避免过拟合;另外还会讨论一些其他的训练技巧,比如在训练时对权重参数做EMA(Exponential Moving Average),更细粒度的权重衰减(weight decay)策略,以及知识蒸馏(knowledge distillation)等等;最后还会讨论一些加速训练的技巧与工具,例如通过profile来分析训练过程中速度瓶颈,以及通过混合精度训练,分布式训练来进行加速等等。
在已经训练好了模型或者已有预训练模型之后,如果我们要进一步进行优化,通常还需要对模型进行剪枝(pruning),在第4章节中我们将介绍多种对卷积神经网络进行剪枝的方法。其中包括如何确定整体的剪枝方案,以及如何对具体每一层进行剪枝(包括结构化与非结构化的方法),除此之外还会介绍一些在训练过程中进行剪枝的方法。
经过剪枝之后的模型结构已经变得非常紧凑,因此不再对模型结构做修剪,为了进一步加速模型以及减小峰值内存开销,还可以对模型和数据进行量化(quantization),用更低比特的格式(例如用int8来替代fp32)来存储模型权重以及运行时的特征图,并在更低比特的格式下对其进行运算等。在第5章节中我们将介绍神经网络量化的各种方法,大致可以分为无需数据的方法(Data-free Methods),基于标定数据的方法(Calibration-based Methods)以及量化感知训练(Quantization-aware Training),这三类方法从使用上依次变得复杂,但量化后的精度损失依次变得更小。
经过量化之后的神经网络结构和权重都已经确定下来,接下来的事情就是将其部署到各种平台上(例如云端,手机端,无人机等等)。由于前面的步骤都涉及到神经网络的训练(剪枝,量化之后通常也都会进行finetune),我们通常使用成熟且完备的训练框架(例如PyTorch[3],TensorFlow[4]等)在高性能的GPU平台上来完成这些工作,但是在将这些训练好的模型从训练平台部署到其他平台的时候涉及到很多问题:例如如何转换网络结构和权重参数的格式,如何针对不同平台的特性来实现高性能的算子,如何对计算图做优化,如何减小运行时的内存开销等等。我们将在第6章节中对以上内容进行详细的介绍。