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

你好。谢邀。首先模型太大的影响可以分为:训练阶段(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等更加快速的推理框架这些框架都经过高度优化,显然具备更高的运算性能,数据吞吐量成倍增加。大模型的推理速度显然能够显著提高。计算图优化任何神经网络最终都可以表示成图的形式,图优化的各种算法都能应用于神经网络的优化,通过构建更小的计算图,减少分支等来加速大模型的运算。并行及指令优化通过多进程,多线程,使用向量指令等技术充分利用单指令多数据,或者多指令多数据优势加快计算优势。