4.3 KiB
机器学习系统的需求
:width:
600px
🏷️framework_position
为了支持日益增长的机器学习应用,开发者普遍需要一个新型的系统软件:机器学习框架(如 :numref:framework_position所示)。这种框架一方面可以帮助用户进行高效的开发,另一方面使得机器学习模型的训练和部署可以高效使用通用处理器和计算加速器。在设计机器学习框架的过程,人们总结出了以下几个设计需求:
-
支持多种神经网络: 深度学习的崛起使得神经网络成为了大量机器学习应用的核心。不同的应用具有多种数据形态和机器学习的目标,因此人们设计出了大量不同的神经网络,例如,卷积神经网络(Convolutional Neural Networks),图神经网络(Graph Neural Networks),自注意力神经网络(Self-attention Neural Networks)等等。人们需要一个统一的框架来开发各种各种的神经网络。
-
支持自动微分: 神经网络模型的的一个核心优点是:其可以利用数据、标注(Label)和目标损失函数(Loss Function)来自动计算梯度(Gradients),以实现机器学习模型的参数更新。一套神经网络模型可以应用在不同的数据场景中。为了实现这个目标,人们希望机器学习框架可以对任意神经网络自动化地计算出梯度。
-
支持数据管理和处理: 机器学习的核心是数据,这其中不仅包括训练、评估和测试数据集,还包括训练后产生的模型参数(Checkpoint),以及训练过程中产生的调试数据(Debugging Data)。为了方便这些数据快速导入机器学习框架,我们需要框架本身支持不同类型的数据,以及进行高效的数据处理(如:数据增强和数据清洗)。
-
支持模型的训练和部署: 为了让机器学习模型达到最佳的性能,人们需要使用各种优化方法(例如Mini-Batch SGD和其变种)来迭代计算梯度,最终模型的性能达到令开发者满意的状态(该过程称为训练)。同时,根据应用的要求,训练好的模型也需要部署到各种计算设备中,以提供模型推理服务(Inference)。
-
高效使用计算加速器: 神经网络的相关计算可以被表达成矩阵计算,而这一类计算可以被计算加速器(如GPU)极大地加速。因此,机器学习框架需要具备高效利用加速器的能力。
-
分布式计算: 随着数据量的增大和应用的复杂度上升,人们正设计出与之相对应的大型深度神经网络。这一类神经网络往往需要大量的内存来存储参数。同时它们也需要大量的加速器从而实现计算的加速。因此,机器学习框架需要具备分布式执行的能力。
在设计机器学习系统之初,开发者曾尝试通过传统的神经网络开发库(如Theano和Caffe)、以及大数据计算框架(如Apache
Spark和Google
Pregel)等方式来达到以上设计目标。可是他们发现(如 :numref:comparison_of_ml_frameworks所示),
神经网络库虽然提供了神经网络开发、自动微分和加速器的支持,但是其缺乏管理和处理大型数据集、模型部署和分布式执行的能力,使得其无法满足产品级机器学习应用的开发。
此外,虽然大数据计算框架具有成熟的分布式执行和数据管理能力,但是其缺乏对神经网络、自动微分和加速器的支持,使得其并不适合开发以神经网络为核心的机器学习应用。因此,业界从头设计出了包括MindSpore、PaddlePaddle、TensorFlow,PyTorch等一系列机器学习框架。
:机器学习框架和相关系统的比较
| 神经网络 | 自动微分 | 数据管理 | 训练和部署 | 加速器 | 分布式 | |
|---|---|---|---|---|---|---|
| 神经网络库 | 是 | 是 | 否 | 否 | 是 | 否 |
| 大数据框架 | 否 | 否 | 是 | 否 | 否 | 是 |
| 机器学习框架 | 是 | 是 | 是 | 是 | 是 | 是 |
🏷️comparison_of_ml_frameworks |