机器学习算法中的并行处理

(不管老板明天怎么说,反正这水我是一定要吐的,作为一个非技术人员,您知道翻译这篇文章对发际线有多大的损害吗?伤心ing,幸好有数据科学家团队把关,鸣谢!)

正文分割线

作者: Prateek Khushalani 和 Victor Robin博士(邓韩贝数据科学家 )

机器学习(ML)是人工智能(AI)的一个分支,指的是通过一系列算法使计算机系统有能力自主学习,在不需要持续编程支持的情况下,根据计算机历史记录与经验自行对算法加以改进。通过从一个数据模型中提取更多信息,并最大化准确度,机器学习可以使线性及非线性关系的差异无限减小。

Python是机器学习的参考语言,且许多程序库都提供现成的机器学习算法,如scikit-learn, XGBoost, LightGBM 或 TensorFlow。因为这些原因,邓韩贝数据科学专家使用Python进行编程。

图片来源于网络

然而, 机器学习并不完美。

你无法预知哪种算法将会得出最佳结果,因此你不得不尝试多次

模型学习过程通过超参数控制,而用户必须调整这些超参数。因为没有公式可以计算超参数,所以,在找到满意的超参数前,数据科学家需要“人工”迭代数百次以达到“智能”的状态

当模型受数据中的噪音影响的时候,它们灵活的框架将它们置于过拟合的风险中。用交叉验证可以防止这一点。在交叉验证期间,各模型均可在不同的子系统中排序并评价数次

大部分模型对计算机的硬件,比如CPU,RAM,甚至GPU的要求都非常高。

长话短说,由于可用算法以及超参数的数量及交叉验证的因素,在达到令人满意的结果前,科学家可能不得不创建成千上万个模型。邓韩贝拥有400名分析师和数据科学家,我们需要一个稳定的、能够有效管理资源的平台,使团队能讯速地在工作中有效使用机器学习。

并行处理

并行处理与顺序处理相对。通过将不同任务中的工作任务分割及同时并行执行这些工作任务,就可大大提升性能。

Kubeflow项目指的是在简单、轻便、可升级的Kubernetes上利用机器学习工作流。然而,在撰写此文时,它(该项目)仍然处在早期阶段,且并不是所有像我们在邓韩贝中所用的scikit-learn那样的开源库都已经被使用很久。

为了实现我们的目标,我们需要一个平台 ,这个平台需要:

可以同时运行任何我们指定的机器学习算法

处理大型数据集

允许多个用户同时使用

能成为一个用于集群的有效资源管理体系

为了并行运行所有机器学习模型,我们从创建docker镜像开始。docker镜像含有邓韩贝使用的所有机器学习库。这一docker容器的作用明确:在所用数据的位置、模型的名称以及超参数已知的情况下,docker容器拟合数据模型,并返回预测值。

下文是可用来创建相似镜像的Dockerfile的一个非常简单的例子。

Kubernete集群

我们选择了Kubernetes来设置我们的集群。这个集群是一个用于自动执行部署、定标(升级)和容器化应用管理的“开源容器编排系统。”

容器化是完全虚拟化的另一个选择。在容器化过程中,一项应用可在容器中以其自己的操作系统运行。这使开发者可以在任何一个环境下运行应用(软件)而无须担心从属性。 因为容器间的相互独立性,通过将每个模型的拟合容器化,人们可以在Kubernetes上并行运行整个机器学习的网格搜索(gridsearch)

与顺序法相比,并行运行模型的能力会对性能有很大的促进,同时使我们能更加有效地管理资源。Kubernetes允许资源管理团队为每个容器分配不同量的内存和CPU。这意味着,我们可以对像XGBoost这样的复杂算法分配更多的资源。与像来自sklearn的LogisticRegression(逻辑回归)单线程算法相比,XGBoost这类算法依赖多线程。 这使我们可以最大限度地利用我们的资源,降低成本,并同时运行更多的工作流。

多用户

由于有大量的用户,我们的平台需要成为多用户平台。当用户需要运行很多机器学习模型时,工作任务即被发送给一个代理程序,由其对工作任务进行排队。这一代理程序将负责维护相关请求,并将工作流的结果返回给用户。

数据管道

邓韩贝处理的通常是大型数据集,所以我们需要一个高效的方式来允许容器访问数据。 我们也对数据加密与数据安全几位正式,所以数据处理过程的安全性是我们的重中之重。

当一项工作任务被创建,数据集会被串行化,并作为pickle文件通过RPC(远程过程调用)被传递到一个共享位置。只有为某一特殊工作任务创建的容器可以访问(进入)这一位置。这种模式不仅高效也即为安全,因为数据是按二进制格式加密的。

资源管理

为了控制和管理在Kubernetes集群上创建docker 容器的工作,并控制和管理每一模型资源的分配,我们创建了一个调度器组件。该调度器的工作任务是确保所有的模型均合适地创建,并监控这一集群的正常状态。如果出现错误,调度器负责将错误和运行记录返回给用户,并负责改正。

最终结果

我们将我们的平台与此前由数据科学家创建的机器学习工作流对标。她(数据科学家)想用5倍的交叉验证来试一试5 XGBoosts, 5 RandomForests 和5 L1调节的逻辑回归。这等于创建75个模型,并在序贯运行的情况下总共花费了差不多8个小时。利用我们的新平台,同样的工作流用时不足1小时 ;也就是说快了8倍!

我们已经部署了这一平台并将其提供给我们所有的分析师和数据科学家使用,且可以进行本地部署运行或云端运行。

下一步工作

仍然存在的一个问题是适当提供分配用于每个容器的资源。一些模型为单线程且只要求1个CPU,但一些为多线程且会要求多个CPU(如果你想要一个在短的时间框架内完成的过程)。此外,所要求的RAM的量是数据集规模的一个函数。

不管数据集和模型的规模如何,最简单的办法是始终分配同样的资源。然而,这会导致对我们资源的不当利用,因为一些要求很少资源的工作任务将会被提供给多于它们所需要的资源,而一些要求大量CPU和RAM的工作任务却不会被提供足够的资源。

基于机器学习算法和数据集规模来设计用于每个容器的CPU和RAM的数量并不是无足轻重,但我们目前正在分析研究用于我们的堆栈的一个新组件。该组件依赖机器学习来预测对于每项工作任务应分配的资源量,但也预测得到错误结果的概率和预计完成任务所需的运行时间。 到目前为止,只有后者已经得到实施,意味着我们可以用±30秒的精度成功预测工作流的运行时间。

#机器学习##数据科学##Kubernetes##Python#

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181101G1USUX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券