仑枘D6mu3414
首先模型太大的影响可以分为:训练阶段(training)和预测阶段(inference)。不同的阶段解决的方式不太一样。以下就从这两个方面来回答这个问题。
训练阶段
- 选择这么大的模型是否合理?是否有等价方案?
例如在语音合成方面WaveNet可以是几十层的CNN结构,而WaveRNN仅仅有一层GRU单元,但最终在合成性能上却取得了相近的结果,这就是说如果你一开始经过了充分的调研分析,并且找到一种更优的结构就能从根本上避免模型过大问题的产生。
简单感受下下面两张图,也许你就会认识到充分调研,仔细选取模型的重要性。
- 使用GPU进行训练
GPU的多核架构决定了它的计算吞吐量远超过传统CPU。在经济条件允许的条件下选用算力强大的GPU,显然能够在模型大小不变的情况下提供更强的算力支持。
- 使用集群和云资源进行训练
目前tensorflow、mxnet、paddle都支持云上训练和集群训练,只需要简单配置就能实现多机多卡训练,显然使用多台服务器能够更快的将数据处理完,极大的加速训练过程。
- 使用集合通信机制和更先进的网络互连技术
采用Nvidia ncll 或其他框架提供的All-reduce等集合算子可以极大的加快反向传播的梯度计算和损失回传,多机能够快速的实现数据同步。同时使用RDMA传输技术也显然要比采用传统TCP有更高效的数据交互能力,通过减少数据传输损耗降低计算延迟来加快深度学习的训练。
- 其他优化
这里涉及到具体的代码书写,降低内存缺页,数据读写等待等计算机常用优化方法来加快代码的运行速度,从而提高训练速度。
预测阶段
预测阶段也有很多种方法来做到减小模型大小和运算速度的方法。
- 模型量化
通过更少的比特位(bit)来表示模型权重,显然能够成比例的将模型变小。目前8bit量化已经使用的比较多了,2bit量化或者0-1量化也被一些模型所采用。
- 模型裁剪
通过将接近于0的权重值进行裁剪可以有效的减小网络规模和计算量。
- 模型蒸馏
distilling model又叫teacher student model,损失函数通过hard target和soft target ce loss共同作用,从而训练出一个比原始teacher 模型小的多的student model,从而可以部署的资源更小的端上。
- 使用tensorrt等更加快速的推理框架
这些框架都经过高度优化,显然具备更高的运算性能,数据吞吐量成倍增加。大模型的推理速度显然能够显著提高。
- 计算图优化
任何神经网络最终都可以表示成图的形式,图优化的各种算法都能应用于神经网络的优化,通过构建更小的计算图,减少分支等来加速大模型的运算。
- 并行及指令优化
通过多进程,多线程,使用向量指令等技术充分利用单指令多数据,或者多指令多数据优势加快计算优势。
- 编译优化(读写,访存等)
代码经过特别编译之后能够更有效的利用寄存器、计算单元等存储和计算资源,也能够更合理的分配读写时间片提高读写效率,从而整体提高大模型的运算速度。
还有很多优化方法,将不断补充进来,希望能够持续和各位一起探讨大模型的训练和部署技术。
深度视野
模型太大可以使用压缩、减枝、量化等进行瘦身。
比如TensorFlow的模型可以使用converter工具转为TensorFlow Lite进行瘦身。