技术专栏 | 机器学习算法中的并行处理
作者头像
  • 李清泉
  • 2018-11-02 10:26:35 2

机器学习与平台优化

机器学习(ML)是人工智能(AI)的一个分支,指计算机系统通过一系列算法,具备自主学习的能力,无需持续编程支持即可根据历史数据和经验不断优化算法。这种方法能够最大限度地缩小线性与非线性关系之间的差异,从而提升准确性。

Python是机器学习的首选语言,许多程序库提供了现成的机器学习算法,如scikit-learn、XGBoost、LightGBM和TensorFlow。因此,邓韩贝的数据科学家们通常使用Python进行开发。

然而,机器学习并非十全十美。例如,你无法预先确定哪种算法会产生最佳效果,因此需要多次尝试。模型的学习过程依赖于超参数,用户需要手动调整这些参数,因为没有公式可以直接计算出最优参数。数据科学家们通常需要经过数百次的人工迭代才能找到满意的超参数。此外,模型容易受到数据噪声的影响,从而导致过拟合。通过交叉验证,可以缓解这个问题。交叉验证过程中,模型会在不同的子集上进行多次训练和评估。

大多数模型对硬件要求较高,尤其是CPU、RAM,甚至GPU。

简而言之,由于可用算法数量庞大、超参数调整及交叉验证的复杂性,在达到满意的结果之前,科学家可能需要创建数千个模型。邓韩贝有400名分析师和数据科学家,他们需要一个稳定且高效的平台,以便快速有效地使用机器学习工具。

平台需求

并行处理

并行处理与顺序处理不同,通过将任务分割并在多个处理器上同时执行,可以显著提高性能。Kubeflow项目旨在利用Kubernetes简化机器学习工作流程,但目前它仍处于早期阶段,并非所有开源库都能很好地集成。

为了满足需求,平台必须能够: - 同时运行多种机器学习算法; - 处理大型数据集; - 支持多用户同时使用; - 提供有效的资源管理功能。

为了实现并行处理,我们首先创建了Docker镜像,其中包含了邓韩贝使用的各种机器学习库。这些镜像的主要功能是在已知数据位置、模型名称及超参数的情况下,拟合数据模型并返回预测结果。

Kubernetes集群

我们选择了Kubernetes来搭建集群。Kubernetes是一个开源容器编排系统,可以自动化部署、扩展和管理容器化应用程序。通过容器化技术,应用可以在各自的环境中运行,而无需担心依赖关系。这种独立性使得在Kubernetes上并行运行整个机器学习网格搜索变得可行。

与顺序执行相比,并行处理不仅能显著提高性能,还能更有效地管理资源。Kubernetes允许管理员为每个容器分配不同的内存和CPU资源。例如,XGBoost这类多线程算法可以分配更多资源,而单线程算法如逻辑回归则不需要那么多资源。这样不仅可以降低成本,还可以同时运行更多的工作流。

多用户支持

由于平台的用户数量较多,需要支持多用户并发操作。当用户需要运行多个机器学习模型时,任务会被发送给一个代理程序进行排队处理。代理程序负责维护请求,并将结果反馈给用户。

数据管道

邓韩贝处理的是大规模数据集,因此需要一种高效的方法来允许容器访问数据。我们同样重视数据加密和安全性。当任务创建时,数据集会被序列化为pickle文件并通过RPC传递到共享位置。只有特定任务的容器可以访问该位置,这种方式既高效又安全,因为数据是以二进制格式加密的。

资源管理

为了管理和控制Kubernetes集群上的Docker容器,我们创建了一个调度器组件。该组件的任务是确保所有模型正确创建,并监控集群的状态。如果出现问题,调度器会将错误日志返回给用户,并负责修复问题。

实施效果

我们已经将平台与先前由数据科学家创建的机器学习工作流进行了对比。她尝试了5倍交叉验证下的5个XGBoost、5个RandomForest和5个L1正则化的逻辑回归模型,共需创建75个模型,耗时约8小时。使用新平台后,同样的工作流只需不到1小时,效率提升了8倍。

目前,该平台已被部署并提供给所有分析师和数据科学家使用,支持本地和云端部署。

未来展望

一个关键问题是合理分配每个容器所需的资源。一些模型只需要单线程和少量CPU,而其他模型则需要多线程和多个CPU。此外,所需RAM的量取决于数据集的大小。

尽管简单地分配固定资源是最简便的方式,但这会导致资源利用不合理。为了更好地利用资源,我们正在分析一个新的组件,该组件基于机器学习算法和数据集规模来预测每个容器所需的CPU和RAM数量。目前,我们已经实现了运行时间的预测,精度可达±30秒。

    本文来源:图灵汇
责任编辑: : 李清泉
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
并行算法机器专栏处理学习技术
    下一篇