Kubeflow:云计算和机器学习的桥梁
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 机器学习的主流框架

人工智能的高度发展刺激了知识领域中对机器学习研究的井喷式爆发,下面介绍机器学习的主流框架。

2.3.1 TensorFlow

TensorFlow 是目前最流行的机器学习框架之一,它是一个基于数据流编程的符号数学系统,被广泛应用于各类机器学习算法的编程实现,其前身是谷歌的神经网络算法库DistBelief。自2015 年11 月9 日起,TensorFlow 依据Apache 2.0 协议开放源代码。在开源之后,TensorFlow 背靠谷歌这座开源大山,强势崛起,借助英特尔、NVIDIA 等硬件平台,向全球开发者免费提供AI 库与工具,成为GitHub 上最受开发者欢迎的平台之一。2017 年2 月,TensorFlow 1.0 正式发布,当年的代码提交数目就已超过2.1 万,其中还有部分外部贡献者。

TensorFlow 由谷歌人工智能团队谷歌大脑(Google Brain)开发和维护,拥有包括TensorFlow Hub、TensorFlow Lite、TensorFlow Research Cloud 在内的多个项目及各类应用程序接口。据不完全统计,2018 年有4.6 万个项目是基于TensorFlow 开发的,贡献人数从2238 位直接贡献者增长到25166 位社区贡献者,开发人数、贡献人数、受欢迎程度(Star 数)、谷歌搜索量都有明显的增长。

TensorFlow 的名称源于本身的运行原理,Tensor 的意思是张量,可以简单地理解为N 维数组,Flow 的意思是流,可以简单地理解为基于数据流图的计算,TensorFlow 的意思是张量从数据流图的一端流动到另一端的计算过程,它支持CNN(卷积神经网络)、RNN(循环神经网络)和LSTM(长短期记忆网络)等深度学习算法。

TensorFlow 是跨平台的,可以运行在大部分异构的硬件上,如CPU、GPU、TPU 等。TensorFlow 的架构如图2-2 所示。在图2-2 中,TensorFlow 具有多层级结构,可部署于各类服务器、PC 终端和网页中,支持GPU 和TPU 高性能数值计算,为CPU 和GPU 提供管理设备的对象接口(对象负责分配、释放设备内存),并且执行节点上的运算。TensorFlow 支持Python Client、C Client 等多种Client,其中使用Python Client 的情况比较普遍。

img

图2-2 TensorFlow 的架构

TensorFlow 有两种模式,分别为单机模式和分布式模式。在单机模式下,Client、Master、Worker 全部在同一台计算机的同一个进程中。在分布式模式下,Client、Master、Worker 可以在不同计算机的不同进程中,但要由集群调度系统统一管理各项任务。TensorFlow 中的每个Worker 都可以管理多个设备,每个设备的Name 都包含硬件类别、编号、任务号(单机版本没有)。

2.3.2 PyTorch

PyTorch 是一个非常优秀的开源的Python 机器学习库。2017 年1 月,PyTorch 由Facebook 的人工智能研究团队推出,基于Torch,底层由C++实现,应用于人工智能领域,如自然语言处理。最近几年,PyTorch 持续大举“收割”AI 学术开发者,并且2019年在视觉、语言、通用机器学习等多个顶会的论文流行度碾压TensorFlow。许多研究人员表示,相比TensorFlow,PyTorch 的集成方式、API 设计得更好。

PyTorch 支持类似于NumPy 的张量计算,可使用GPU 加速,是基于自动微分系统的深度神经网络。除此之外,PyTorch 有以下优势。

· 简单:它类似于NumPy,非常Python 化,易于和Python 生态系统的其他部分集成。例如,只要在PyTorch 模型中的任何地方插入一个pdb 断点,它就可以工作了。在TensorFlow 中,调试模型需要一个活动会话,整个过程非常复杂。

· 动态图的良好支持:运行TensorFlow 必须提前建好静态计算图,然后通过feed 和run 重复执行建好的图。但是PyTorch 不用这么麻烦,它的程序可以在执行时动态构建或调整计算图。相对来说,PyTorch 具有更好的灵活性,这得益于PyTorch 直接基于Python C API 构建的Python 接口。

· 非常棒的API:大多数研究者更喜欢PyTorch 的API 而不是TensorFlow 的API,一部分原因是PyTorch 设计得更好,另一部分原因是TensorFlow 频繁切换API(如Layers→Slim→Estimators→tf.keras),从而导致自己的使用变得非常困难。

· Python 优先支持策略:这是PyTorch 主推的特性之一,就是支持Python(官方的说法是puts Python first)。因为是直接基于Python C API 构建的Python 接口,所以PyTorch 从细粒度上直接支持Python 的访问。与原生的Python 实现相比,PyTorch 引入的新概念很少,这不仅降低了Python 用户的理解门槛,而且能够保证代码与原生Python 实现基本一致。事实上,开发者可以直接用原生Python 代码扩展PyTorch 的Operation。

· 易于Debug:PyTorch 在运行时可以生成动态图,因此开发者可以在堆栈跟踪中看到是哪一行代码导致的错误,甚至可以在调试器中停止解释器,从而进一步定位和Debug 某一次的输出。

2.3.3 scikit-learn

和PyTorch 一样,scikit-learn 也是一个开源的Python 机器学习库,简称sklearn,它基于NumPy、SciPy 和Matplotlib 等库,可以用于数据挖掘和数据分析。scikit-learn 配备了各种ML 模型,包括线性和逻辑回归器、SVM 分类器和随机森林;可以进行多个ML任务,如分类、回归和聚类;支持Windows 和Linux 等操作系统。scikit-learn 的缺点是GPU 的效率不高。

scikit-learn 的基本功能包括分类、回归、聚类、数据降维、模型选择和数据预处理。scikit-learn 实现了很多算法,但要如何选择合适的算法呢?其实选择算法主要考虑的是需要解决的问题及数据量的大小。scikit-learn 官方提供了一个选择算法的引导图,如图2-3 所示。

img

图2-3 scikit-learn 选择算法引导图

2.3.4 XGBoost

XGBoost(eXtreme Gradient Boosting,极端梯度提升)是大规模并行Boosted Tree 的工具,是目前最快、最好的开源Boosted Tree 工具包。XGBoost 应用的算法是GBDT(Gradient Boosting Decision Tree,梯度迭代决策树)的改进版。在这一次机器学习的“冲击波”中,XGBoost 经常在机器学习模型训练的比赛中使用。

XGBoost 之所以可以成为机器学习的主流框架,并且广泛应用于数据科学竞赛和工业领域,是因为它具有以下优点。

· XGBoost 支持并行化作业。虽然XGBoost 是以添加树的模式不断分裂,从而串联运行作业的,但是在相同级别的节点上是可以并行计算的。

· 交叉验证纠错。当预测结果良好时,系统可以提前停止建树,从而有效提高训练效率。

· XGBoost 加入了许多策略,用于防止过拟合。XGBoost 每添加一棵树,都会学习一个新的函数,在拟合上次预测的残值时就容易引起过拟合的问题,因此XGBoost加入了很多策略,用于防止这种现象的发生。

在XGBoost 作业训练完成后,我们得到了n 棵树,用于预测各个叶子节点的分数,最后,我们将每棵树对应的分数加起来,就可以得到它的预测值了。

下面我们对电脑游戏的喜欢程度做个预测,首先根据人群的不同年龄,给出一个分值,然后根据是否每天用电脑给出一个分值。根据评分规则画出电脑游戏的分裂决策树,如图2-4 所示。根据图2-4 可知,儿子喜欢电脑游戏的分值是最高的(2.9),爷爷的分值是最低的(-1.9)。分裂出的决策树越多,这个预测越接近真实。

img

图2-4 电脑游戏的分裂决策树

2.3.5 ONNX

ONNX(Open Neural Network Exchange,开放神经网络交换)格式是一个用于表示深度学习模型的标准,可使模型在不同机器学习框架之间进行转移。

假设有如下场景:某组织开发主要使用以TensorFlow 为基础的机器学习框架,现在有一个深度学习算法,需要将其部署在移动设备上。按照传统做法,该组织需要用Caffe2重新将模型写好,然后训练参数,非常耗时耗力。

为了解决这个问题,ONNX 应运而生。Caffe2、PyTorch、Microsoft Cognitive Toolkit、Apache MXNet 等主流机器学习框架都对ONNX 有不同程度的支持,便于将算法及模型在不同的机器学习框架之间进行迁移。

以上主流机器学习框架均已被Kubeflow 中的KFServing 完美集成了起来,方便、快捷地实现了不同机器学习框架中的InferenceService 功能,这些将在后面的章节中详细讲解。