深度学习中训练和推断的区别

深度学习中涉及到训练(Training)推断(Inference),训练也就是搜索和求解模型最优参数的阶段。当模型参数已经求解出来,使用和部署模型,则称为推断阶段。二者的特点不同。

深度学习训练

我们可以把深度学习的训练看成学习过程。人工神经网络是分层的、是在层与层之间互相连接的、网络中数据的传播是有向的。训练神经网络的时候,训练数据被输入到网络的第一层。然后所有的神经元,都会根据任务执行的情况,根据其正确或者错误的程度如何,分配一个权重参数(权值)。

如图是一个深层神经网络,信息从下到上流动。我们给这个网络大量的输入数据,网络的低层就会提取出不同类别数据的特征信息,通过激活函数、损失函数以后而到了最高层,网络提取到整个数据特征。所以,神经网络从低到高刚好能够提取图片数据中从低到高(从局部到整体)的多层次信息,最终的输出由网络中所有的权值共同决定。对多尺度层级结构的提取才使得深度学习神经网络可以得到很好的效果。

训练需要分batch多次迭代,inference只需要分batch执行一次计算流图。训练是计算密集型的,以GPU资源为主,CPU主要用于通信,参数更新等低消耗的任务。单次训练任务计算量大,需要用分布式系统才能较快得到结果。训练过程主要关心分布式集群的资源利用率。

深度学习推断

推断过程关注的指标为:

  • 访问延迟
  • 吞吐量
  • 模型版本管理
  • DevOps

推断过程常用的工具:TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库。它可以将训练好的机器学习模型部署到线上,使用 gRPC和Restful 作为接口接受外部调用。它支持模型热更新与自动模型版本管理。这意味着一旦部署 TensorFlow Serving 后,你再也不需要为线上服务操心,只需要关心你的线下模型训练。

  1. 推断的网络权值已经固定下来,无后向传播过程,模型固定,可以对计算图进行优化。还可以输入输出大小固定,做memory优化(fine-tuning只是在已有的训练好的模型上做小的改动和调优,本质上仍然是训练过程,TensorRT没有fine-tuning)

  2. 推断的batch size要小很多,如果batch size很大,吞吐可以很大。比如每秒可以处理1024个batch,500毫秒处理完,吞吐可以达到2048,可以很好地利用GPU;但是推断关心延迟latency,不能有500毫秒处理延迟。所以batch可以是8或者16,吞吐降低,没有办法很好地利用GPU。

  3. 训练的时候因为要保证前后向传播,每次梯度的更新很微小,需要相对较高的精度,一般来说需要float型,如FP32,32位的浮点型来处理数据。但是推断对精度的要求没有那么高,可以使用低精度的技术,很多研究表明可以用如半长(16)的float型,即FP16,或者8位的整型(INT8)来做推断,研究结果表明没有特别大的精度损失,尤其对CNN。对Binary(二进制)的使用也处在研究中,即权值只有0和1。低精度计算的好处是一方面可以减少计算量,原来计算32位的单元处理FP16的时候,理论上可以达到两倍的速度,处理INT8的时候理论上可以达到四倍的速度。另一方面是模型需要的空间减少,不管是权值的存储还是中间值的存储,应用更低的精度,模型大小会相应减小。用于inference的模型要进行简化、压缩、针对运行性能优化:查找神经网络中经过训练后并没有用到、尚未激活的清洗掉。把神经网络中的多个层融合为一个单独的计算步骤。(通过神经网络剪枝、训练量化和Huffman编码等压缩模型),但仍能达到几乎一样的预测、识别准确率

0%