机器学习的基础架构包含了机器学习算法、机器学习类库以及机器学习平台等多个层次的内容。根据业务的需求,我们可以选择特定的领域进行深入研究和二次开发,利用轮子和根据需求改造轮子同样重要。

从算法完成到MiniFlow完成,打造机器学习的根底架构渠道  机器学习 算法 MiniFlow 第1张

根底架构(Infrastructure)比较于大数据、云核算、深度学习,并不是一个很火的概念,乃至许多程序员作业开端就在用 MySQL、Django、Spring、Hadoop 来开发事务逻辑,而没有实在参加过根底架构项目的开发。在机器学习范畴也是相似的,凭借开源的 Caffe、TensorFlow 或许 AWS、Google CloudML 就能够完成许多事务运用,但结构或渠道或许因职业的开展而盛行或许阑珊,而寻求高可用、高功用、灵敏易用的根底架构却简直是永恒不变的。

Google 的王咏刚教师在《为什么 AI 工程师要懂一点架构》说到,研讨院并不能只懂算法,算法完成不等于问题处理,问题处理不等于现场问题处理,架构常识是工程师进行高效团队协作的共同打量。Google 依托强壮的根底架构才干让 AI 研讨领先于业界,工业界的开展也让深度学习、Auto Machine Learning 成为或许,未来将有更多人注重底层的架构与规划。

因而,今日的主题便是介绍机器学习的根底架构,包含以下的几个方面:

  1. 根底架构的分层规划;
  2. 机器学习的数值核算;
  3. TensorFlow 的从头完成;
  4. 分布式机器学习渠道的规划。

***部分,根底架构的分层规划

咱们幻想一下,假如咱们在 AWS 上运用编写一个 TensorFlow 运用,终究经过了多少层运用笼统?首要,物理服务器和网络宽带就不用说了,经过 TCP/IP 等协议的笼统,咱们直接在 AWS 虚拟机上操作就和本地操作没有差异。其次,操作体系和编程打量的笼统,让咱们能够不感知底层内存物理地址和读写磁盘的 System call,而只需求遵从 Python 标准编写代码即可。然后,咱们运用了 TensorFlow 核算库,实践上咱们只需调用最上层的 Python API,底层是经过了 Protobuf 序列化和 swig 进行跨打量调研,然后经过 gRPC 或许 RDMA 进行通讯,而***层这是调用 Eigen 或许 CUDA 库进行矩阵运算。

因而,为了完成软件间的解耦和笼统,体系架构常常选用分层架构,经过分层来屏蔽底层完成细节,而每一个底层都相当于上层运用的根底架构。

那么咱们如安在一个分层的国际中缝隙生计?

有人或许认为,已然有人完成了操作体系和编程打量,那么咱们还需求注重底层的完成细节吗?这个问题没有标准答案,不同的人在不同的时期会有不同的感触,下面我举两个比如。

在《为了 1% 景象,献身 99% 景象下的功用:蜗牛般的 Python 深复制》这篇文章中,作者介绍了 Python 标准库中 copy.deep_copy() 的完成,1% 的状况是指在深复制时方针内部有或许存在引证自身的方针,因而需求在复制时记载避实就虚复制过的方针信息,而 99% 的场景下方针并不会直接运用自身,为了兼容 100% 的状况这个库丢失了 6 倍以上的功用。在深化了解 Python 源码后,咱们能够经过完成深复制算法来处理上述功用问题,然后优化咱们的事务逻辑。

另一个比如是阿里的杨军教师在 Strata Data Conference 同享的《Pluto: 一款分布式异构深度学习结构》,里边介绍到依据 TensorFlow 的 control_dependencies 来完成冷热数据在 GPU 显存上的置入置出,然后在用户简直不感知的状况下极大降低了显存的运用量。了解源码的人或许发现了,TensorFlow 的 Dynamic computation graph,也便是 tensorflow/fold 项目,也是依据 control_dependencies 完成的,能在声明式机器学习结构中完成动态核算图也是不太简略。这两种完成都不存在 TensorFlow 的官方文档中,只要对源码有满意深化的了解才或许在功用和功用上有巨大的打破,因而假如你是企业界 TensorFlow 结构的根底架构保护者,打破 TensorFlow 的 Python API 笼统层对错常有必要的。

咱们在运用机器学习时,不知不觉现已运用了许多根底架构的笼统,其间最重要的莫过于机器学习算法自身的完成,接下来咱们将打破笼统,深化了解底层的完成原理。

第二部分,机器学习的数值核算

机器学习,本质上是一系列的数值核算,因而 TensorFlow 定位也不是一个深度学习库,而是一个数值核算库。当咱们听到了香农熵、贝叶斯、反向传达这些概念时,并不需求忧虑,这些都是数学,并且能够经过核算机编程完成的。

触摸过机器学习的都知道 LR,一般是指逻辑回归(Logistic regression),也能够指线性回归(Linear regression),而前者归于分类算法,后者归于回归算法。两种 LR 都有一些能够调优的超参数,例如练习轮数(Epoch number)、学习率(Learning rate)、优化器(Optimizer)等,经过完成这个算法能够帮助咱们了解其原理和调优技巧。

下面是一个最简略的线性回归 Python 完成,模型是简略的 y = w * x + b。

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第2张

从这个比如咱们能够看到,完成一个机器学习算法并不依靠于 Scikit-learn 或许 TensorFlow 等类库,本质上都是数值运算,不同打量完成会有功用差异罢了。仔细的朋友或许发现,为什么管中窥豹 w 的梯度(Gradient)是 -2 * x * (y – x * x –b),而 b 的梯度这是 -2 * (y – w * x – b),怎么确保经过核算后 Loss 下降而准确率上升?这便是数学上确保了,咱们界说了 Loss 函数(Mean square error)为 y – w * x – b 的平方,也便是说猜测值越挨近 y 的话 Loss 越小,方针变成求 Loss 函数在 w 和 b 的恣意取值下的最小值,因而对 w 和 b 求偏导后就得到上面两条公式。

假如感兴趣,无妨看一下线性回归下 MSE 求偏导的数学公式证明。

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第3张

逻辑回归与线性回归相似,当由所以分类问题,因而需求对 w * x + b 的猜测成果进行归一化(Normalization),一般运用 Sigmoid 办法,在 Python 中能够经过 1.0 / (1 + numpy.exp(-x)) 这种方法完成。由于猜测值不同,Loss 函数的界说也不同,求偏导得到的数值核算公式也不同,感兴趣也能够看看我的公式推导。

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第4张

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第5张

咱们能够看到终究求得的偏导对错常简略的,用任何编程打量都能够简单完成。但咱们自己的完成未必是***效的,为什么不直接用 Scikit-learn、MXNet 这些开源库现已完成好的算法呢?

咱们对这个算法的了解,其实是在工程上运用它的一个很重要的根底。例如在实在的事务场景下,一个样本的特征或许有百亿乃至千亿维,而经过前面的算法咱们了解到,LR 模型的巨细和样本特征的维度是相同的,也便是说一个承受百亿维特征的模型,自身参数就有百亿个,假如运用标准的双精度浮点数保存模型参数,那么百亿维的模型参数部分至少要超越 40G,那么千亿维的特征更是单机所无法加载的。

因而,尽管 Scikit-learn 经过 native 接口完成了高功用的 LR 算法,但只能满意在单机上练习,而 MXNet 由于原生没有支撑 SpareTensor,关于超高维度的稀少数据练习功率对错常低的,TensorFlow 自身支撑 SpareTensor 也支撑模型并行,能够支撑百亿维特征的模型练习,但没有针对 LR 优化功率也不是很高。在这种场景下,第四范式依据 Parameter server 完成了支撑模型并行和数据并行的超高维度、高功用机器学习库,在此根底上的大规模 LR、GBDT 等算法练习功率才干满意工程上的需求。

机器学习还有许多有意思的算法,例如决策树、SVM、神经网络、朴素贝叶斯等等,只需求部分数学理论根底就能够简单在工程上完成,由于篇幅联系管中窥豹就不在赘述了。前面咱们介绍的其实是机器学习中的指令式(Imperative)编程接口,咱们把求偏导的公式提早推导出来,然后像其他编程脚本相同依据代码那次序履行,而咱们知道 TensorFlow 供给的是一种声明式(Declarative)的编程接口,经过描绘核算图的方法来拖延和优化履行进程,接下来咱们就介绍这方面的内容。

第三部分,TensorFlow 的从头完成

首要咱们或许有疑问,咱们需求需求从头完成 TensorFlow?TensorFlow 灵敏的编程接口、依据 Eigen 和 CUDA 的高功用核算、支撑分布式和 Hadoop HDFS 集成,这些都是个人乃至企业很难彻底追逐完成的,并且即便需求指令式编程接口咱们也能够运用 MXNet,并没有强需求需求一个新的 TensorFlow 结构。

事实上,我个人在学习 TensorFlow 进程中,经过完成一个 TensorFlow-like 的项目,不只惊叹与其源码和接口的规划精巧,也加深了对声明式编程、DAG 完成、主动求偏导、反向传达等概念的了解。乃至在 Benchmark 测验中发现,纯 Python 完成的项目在线性回归模型练习中比 TensorFlow 快 22 倍,当然这是在特定场景下压测得到的成果,首要原因是 TensorFlow 中存在 Python 与 C++ 跨打量的切换开支。

这个项目便是 MiniFlow,一个完成了链式规律、主动求导、支撑指令式编程和声明式编程的数值核算库,并且兼容 TensorFlow Python API。感兴趣能够在这个地址参加开发,下面是两者 API 比照图。

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第6张

了解 TensorFlow 和 MXNet(或许 NNVM)源码的朋友或许知道,两者都笼统了 Op、Graph、Placeholer、Variable 等概念,经过 DAG 的方法描绘模型的核算流图,因而咱们也需求完成相似的功用接口。

与前面的 LR 代码不同,依据 Graph 的模型答使用户自界说 Loss 函数,也便是用户能够运用传统的 Mean square error,也能够自界说一个恣意的数学公式作为 Loss 函数,这要求结构自身能够完成主动求导的功用,而不是咱们依据 Loss 函数预先完成了导数的核算方法。

那么用户能够界说的最小操作,也便是 Op,需求渠道完成根本的算子,例如 ConstantOp、AddOp、MultipleOp 等,并且用户完成自界说算子时能够参加主动求导的流程中,并不影响结构自身的练习流程。参阅 TensorFlow 的 Python 源码,下面咱们界说了 Op 的基类,避实就虚的 Op 都应该完成 forward() 和 grad() 以便于模型练习时主动求导,并且经过重载 Python 操作符能够为开发者供给更便当的运用接口。

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第7张

那么关于常量(ConstantOp)和变量(VariableOp),他们的正向运算便是得到的是自身的值,而求导时常量的导数为 0,求偏导的变量导数为 1,其他变量也为 0,详细代码如下。

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第8张

其实更重要的是,咱们需求完成加(AddOp)、减(MinusOp)、乘(MultipleOp)、除(DivideOp)、平方(PowerOp)等算子的正向运算和反向运算逻辑,然后依据链式规律,任何杂乱的数学公式求导都能够简化成这些根本算子的求导。

例如加法和减法,咱们知道两个数加法的导数等于导数的加法,因而依据此数学原理,咱们能够很简略完成 AddOp,而 MinusOp 完成相似就不赘述了。

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第9张

而乘法和除法相对杂乱,明显两个数乘法的导数不等于导数的乘法,例如 x 和 x 的平方,先导数后相乘得到 2x,先相乘后导数得到 3 倍 x 的平方。因而这是需求运用乘数规律,根本公式是,而代码完成如下。

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第10张

除法和平方的求导方法也是相似的,由于数学上现已证明,所以只需求编码完成根本的正向和反向运算即可。由于篇幅有限,管中窥豹不再详尽介绍 MiniFlow 的源码完成了,感兴趣能够经过上面的 Github 链接找到完好的源码完成,下面再供给运用相同 API 接口完成的模型功用测验成果,关于小批量数据处理、需求频频切换 Python/C++ 运转环境的场景下 MiniFlow 会有更好的功用体现。

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第11张

前面介绍了机器学习算法和深度学习类库的完成,并不是避实就虚人都有才干去重写或许优化这部分根底架构的,许多时分咱们都只是这些算法的运用者,但从另一个视点,咱们就需求保护一个高可用的核算渠道来做机器学习的练习和猜测,下面将从这方面介绍怎么打造分布式机器学习渠道。

第四部分,分布式机器学习渠道的规划

跟着大数据和云核算的开展,完成一个高可用、分布式的机器学习渠道成为一个根本需求。无论是 Caffe、TensorFlow,仍是咱们自研的高功用机器学习库,都只是处理数值核算、算法完成以及模型练习的问题,关于使命的阻隔、调度、Failover 都需求上层渠道完成。

那么规划一个针对机器学习全流程的根底架构渠道,需求包括哪些功用呢?

首要,有必要完成资源阻隔。在一个同享底层核算资源的集群中,用户提交的练习使命不应该遭到其他使命的影响,尽或许确保 CPU、内存、GPU 等资源阻隔。假如运用 Hadoop 或 Spark 集群,默许就会在使命进程上挂载 cgroups,确保 CPU 和内存的阻隔,而跟着 Docker 等容器技能的老练,咱们也能够运用 Kubernetes、Mesos 等项目来发动和办理用户完成的模型练习使命。

其次,完成资源调度和同享。跟着通用核算的 GPU 盛行,现在支撑 GPU 调度的编列东西也越来越多,而部分企业界还存在着 GPU 专卡专用的状况,无法完成资源的动态调度和同享,这必定导致核算资源的严峻糟蹋。在规划机器学习渠道时,需求尽或许考虑通用的集群同享场景,例如一起支撑模型练习、模型存储以及模型服务等功用,能够对标的典例便是 Google Borg 体系。

然后,渠道需求有灵敏的兼容性。现在机器学习事务开展迅速,针对不同场景的机器学习结构也越来越多,灵敏的渠道架构能够兼容简直避实就虚干流的运用结构,防止根底架构由于事务的开展而频频改变。现在 Docker 是一种十分适宜的容器格局标准,经过编写 Dockerfile 就能够描绘结构的运转环境和体系依靠,在此根底上咱们能够在渠道上完成了 TensorFlow、MXNet、Theano、CNTK、Torch、Caffe、Keras、Scikit-learn、XGBoost、PaddlePaddle、Gym、Neon、Chainer、PyTorch、Deeplearning4j、Lasagne、Dsstne、H2O、GraphLab 以及 MiniFlow 等结构的集成。

***,需求完成机器学习场景下的 API 服务。针对机器学习的模型开发、模型练习和模型服务三个首要流程,咱们能够界说提交练习使命、创立开发环境、发动模型服务、提交离线猜测使命等 API,用了解的编程打量来完成 Web service 接口。要完成一个 Google-like 的云深度学习渠道,咱们能够参阅下面这三个过程。

 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道 机器学习 算法 MiniFlow 第12张

当然,要完成一个包括数据引进、数据处理、特征工程以及模型评价功用的机器学习渠道,咱们还需求集成 HDFS、Spark、Hive 等大数据处理东西,完成相似 Azkaban、Oozie 的作业流办理东西,在易用性、低门槛方面做更多的作业。

总结

***总结一下,机器学习的根底架构包含了机器学习算法、机器学习类库以及机器学习渠道等多个层次的内容。依据事务的需求,咱们能够挑选特定的范畴进行深化研讨和二次开发,使用轮子和依据需求改造轮子相同重要。

在机器学习与人工智能十分盛行的今日,期望咱们也能够注重底层根底架构,算法研讨员能够 了解更多工程的规划与完成,而研制工程师能够了解更多的算法原理与优化,在适宜的根底架构渠道上让机器学习发挥更大的效益,实在运用的实践场景中。

转载请说明出处
知优网 » 从算法完成到MiniFlow完成,打造机器学习的根底架构渠道

发表评论

您需要后才能发表评论