深度学习模型太大怎么办?

仑枘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进行瘦身。


分享到:


相關文章: