训练(Training)
打个比方,你现在想要训练一个能区分苹果还是橘子的模型,你需要搜索一些苹果和橘子的图片,这些图片放在一起称为训练数据集(training dataset),训练数据集是有标签的,苹果图片的标签就是苹果,橘子亦然。一个初始神经网络通过不断的优化自身参数,来让自己变得准确,可能开始10张苹果的照片,只有5张被网络认为是苹果,另外5张认错了,这个时候通过优化参数,让另外5张错的也变成对的。这整个过程就称之为训练(Traning)。
推理(Inference)
你训练好了一个模型,在训练数据集中表现良好,但是我们的期望是它可以对以前没看过的图片进行识别。你重新拍一张图片扔进网络让网络做判断,这种图片就叫做现场数据(live data),如果现场数据的区分准确率非常高,那么证明你的网络训练的是非常好的。我们把训练好的模型拿出来遛一遛的过程,称为推理(Inference)。
简答来说训练与推理的区别
深度学习中涉及到训练(Training)和推断(Inference),简单来说:
1、训练也就是搜索和求解模型最优参数的阶段。
2、当模型参数已经求解出来,使用和部署模型,则称为推断阶段。
我们可以把深度学习的训练看成学习过程。人工神经网络是分层的、是在层与层之间互相连接的、网络中数据的传播是有向的。训练神经网络的时候,训练数据被输入到网络的第一层。然后所有的神经元,都会根据任务执行的情况,根据其正确或者错误的程度如何,分配一个权重参数(权值)。
训练需要分 batch 多次迭代,inference 只需要分 batch 执行一次计算流图。训练是计算密集型的,以 GPU 资源为主,CPU 主要用于通信,参数更新等低消耗的任务。单次训练任务计算量大,需要用分布式系统才能较快得到结果。训练过程主要关心分布式集群的资源利用率。
推断过程关注的指标为:
- 访问延迟
- 吞吐量
- 模型版本管理
- DevOps【devops是敏捷开发的升级版】(DevOps到底是什么意思? - 知乎)
推断过程常用的工具:TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库。它可以将训练好的机器学习模型部署到线上,使用 gRPC 和 Restful 作为接口接受外部调用。它支持模型热更新与自动模型版本管理。这意味着一旦部署 TensorFlow Serving 后,你再也不需要为线上服务操心,只需要关心你的线下模型训练。
-
推断的网络权值已经固定下来,无后向传播过程,模型固定,可以对计算图进行优化。还可以输入输出大小固定,做 memory 优化(fine-tuning 只是在已有的训练好的模型上做小的改动和调优,本质上仍然是训练过程,TensorRT 没有 fine-tuning)
-
推断的 batch size 要小很多,如果 batch size 很大,吞吐可以很大。比如每秒可以处理 1024 个 batch,500 毫秒处理完,吞吐可以达到 2048,可以很好地利用 GPU;但是推断关心延迟 latency,不能有 500 毫秒处理延迟。所以 batch 可以是 8 或者 16,吞吐降低,没有办法很好地利用 GPU。
-
训练的时候因为要保证前后向传播,每次梯度的更新很微小,需要相对较高的精度,一般来说需要 float 型,如 FP32,32 位的浮点型来处理数据。但是推断对精度的要求没有那么高,可以使用低精度的技术,很多研究表明可以用如半长(16)的 float 型,即 FP16,或者 8 位的整型(INT8)来做推断,研究结果表明没有特别大的精度损失,尤其对 CNN。对 Binary(二进制)的使用也处在研究中,即权值只有 0 和 1。低精度计算的好处是一方面可以减少计算量,原来计算 32 位的单元处理 FP16 的时候,理论上可以达到两倍的速度,处理 INT8 的时候理论上可以达到四倍的速度。另一方面是模型需要的空间减少,不管是权值的存储还是中间值的存储,应用更低的精度,模型大小会相应减小。用于 inference 的模型要进行简化、压缩、针对运行性能优化:查找神经网络中经过训练后并没有用到、尚未激活的清洗掉。把神经网络中的多个层融合为一个单独的计算步骤。(通过神经网络剪枝、训练量化和 Huffman 编码等压缩模型),但仍能达到几乎一样的预测、识别准确率
另外还有结构重参数化:
请阅读:解读模型压缩6:结构重参数化技术:进可暴力提性能,退可无损做压缩 - 知乎
为了做模型压缩用的
深度学习的宏观框架——训练(training)和推理(inference)及其应用场景_木子山石的学习笔记-CSDN博客_inference