让我们从一个没有争议的观点开始:软件开发人员和系统运维人员喜欢 Kubernetes,因为它是一种在 Linux 容器中部署和管理应用程序的方式。Linux 容器为可重现的构建和部署提供了基础,但 Kubernetes 及其生态系统提供了基本功能,使容器非常适合运行真正的应用程序,例如:
-
持续集成和部署,因此您可以从 Git 提交到通过测试套件,再到在生产环境中运行新代码
-
无处不在的监控,可以轻松跟踪系统中任何组件的性能和其他指标,并以有意义的方式将其可视化
-
声明式部署,允许您依靠 Kubernetes 在暂存环境中重新创建您的生产环境
-
灵活的服务路由,这意味着您可以扩展服务或逐步将更新推出到生产环境(并在必要时回滚它们)
您可能不知道的是,Kubernetes 还为数据科学家提供了无与伦比的功能组合。简化软件开发流程的相同功能也支持数据科学流程!为了了解原因,让我们首先看看数据科学家的工作是什么样的。
一个数据科学项目:预测客户流失
有些人广泛地定义数据科学,包括机器学习 (ML)、软件工程、分布式计算、数据管理和统计学。另一些人则将该领域更狭隘地定义为通过将某些领域专业知识与机器学习或高级统计相结合来寻找现实世界问题的解决方案。我们不会在本文中对数据科学家做出明确的定义,但我们会告诉您数据科学家在一个典型的项目中可能想要做什么以及他们可能如何工作。

考虑一下任何拥有订阅客户的企业所面临的问题:有些人可能不会续订。客户流失检测旨在主动识别可能不会续订合同的客户。一旦确定了这些客户,企业可以选择针对他们的帐户进行特定干预(例如,销售电话或折扣),以降低他们离开的可能性。整体的流失预防问题有几个部分:预测哪些客户可能离开,确定可能留住客户的干预措施,以及在干预预算有限的情况下确定优先针对哪些客户。数据科学家可以处理其中的任何一个或所有这些问题,但我们将使用第一个问题作为我们的运行示例。
要解决的第一个问题是确定一个合适的“流失”定义,以便纳入预测模型。我们可能对失去客户的含义有一个直观的定义,但数据科学家需要形式化这个定义,例如,通过将流失预测问题定义为:“给定客户在过去 18 个月内的活动,他们在未来六个月内取消合同的可能性有多大?”

然后,数据科学家需要确定模型应该考虑哪些关于客户活动的数据——实际上,充实并形式化流失定义的第一个部分。具体而言,数据科学家可能会考虑任何可用的关于客户在历史窗口期内实际使用公司产品的信息、他们帐户的大小、他们与客户服务的互动次数,甚至他们在提交的支持单上的评论语气。我们的模型考虑的度量或数据称为特征。

有了流失的定义和一组要考虑的特征,数据科学家就可以开始对历史数据进行探索性分析(包括特征集和给定客户在给定期间的最终结果)。探索性分析可以包括可视化特征的组合,并查看它们与客户是否会流失的相关性。更一般地说,这个过程的目的是识别历史数据中的结构,以及是否有可能根据表征它们的数据找到保留客户和流失客户之间的清晰分离。

对于某些问题,数据中是否存在结构并不明显——在这些情况下,数据科学家将不得不回到绘图板并识别一些要收集的新数据,或者可能是一种新颖的方式来编码或转换可用数据。然而,探索性分析通常会帮助数据科学家识别在训练预测模型时要考虑的特征,并提出一些转换这些数据的方法。数据科学家的下一个工作是特征工程:找到一种转换和编码特征数据的方法——这些数据可能在数据库表中、在事件流中或在通用编程语言的数据结构中——以便它适合输入到训练模型的算法。这通常意味着将这些特征编码为浮点数向量。仅仅是任何编码都行不通;数据科学家需要找到一种保留特征结构的编码,以便相似的客户映射到相似的向量——否则算法将表现不佳。

现在数据科学家才准备好训练预测模型。对于预测客户是否会流失的问题,模型训练流水线从关于客户的标记历史数据开始。然后,它使用在特征工程过程中开发的技术从原始数据中提取特征,从而生成标记为“真”或“假”的浮点数向量,对应于在感兴趣的窗口期内将要或不会流失的客户。模型训练算法将此特征向量集合作为输入,并优化一个过程,以最小化误差的方式在真假向量之间进行分离。预测模型最终将是一个函数,它接受一个特征向量并返回真或假,表明与该向量对应的客户是否可能流失。
在这个过程中的任何时候,数据科学家都可能需要重新审视之前的阶段——可能是为了改进特征工程方法,收集不同的数据,甚至改变他们试图预测的指标。通过这种方式,数据科学工作流程很像传统的软件开发生命周期:在实现过程中发现的问题可能会迫使工程师更改接口的设计或数据结构的选择。这些问题甚至可以一直追溯到需求分析,迫使人们对项目的基本原理进行更广泛的重新思考。幸运的是,Kubernetes 可以像支持软件开发生命周期一样支持数据科学家的工作流程。
Kubernetes 用于数据科学
数据科学家有很多与软件工程师相同的关注点:可重复的实验(如可重复的构建);可移植和可重现的环境(如在开发、暂存和生产中具有相同的设置);凭据管理;跟踪和监控生产中的指标;灵活的路由;以及轻松的横向扩展。不难看到应用程序开发人员使用 Kubernetes 所做的事情与数据科学家可能想要做的事情之间的一些相似之处:
-
可重复的批处理作业,如 CI/CD 流水线,类似于机器学习流水线,因为多个协调的阶段需要以可重现的方式协同工作,以处理数据;提取特征;以及训练、测试和部署模型。
-
描述服务之间连接的声明式配置有助于跨平台创建可重现的学习流水线和模型。
-
微服务架构使机器学习模型在流水线中进行简单调试,并有助于数据科学家和团队其他成员之间的协作。
数据科学家面临着与应用程序开发人员相同的许多挑战,但他们也有一些与数据科学家如何工作相关的独特挑战,并且机器学习模型可能比传统服务更难测试和监控。我们将重点关注与工作流程相关的一个问题。
大多数数据科学家在交互式笔记本中进行探索性工作。笔记本环境,例如由 Project Jupyter 开发的那些环境,提供了一个交互式的 文学编程环境,用户可以在其中混合解释性文本和代码;运行和更改代码;并检查其输出。
这些特性使笔记本环境对于探索性分析来说非常灵活。然而,它们不是用于协作或发布的理想软件工件——想象一下,如果软件开发人员发布其工作的主要方式是通过将交互式 REPL 中的记录发布到 pastebin 服务。
与同事共享交互式笔记本类似于共享物理笔记本——其中有一些好的信息,但他们必须进行一些挖掘才能找到它。并且由于笔记本对其环境的脆弱性和依赖性,当您的同事运行您的笔记本时,他们可能会看到不同的输出——或者更糟糕:它可能会崩溃。
数据科学家的 Kubernetes
数据科学家可能不想成为 Kubernetes 专家——这没关系!Kubernetes 的优势之一是它是一个用于构建更高级别工具的强大框架。
其中一个工具是 Binder 服务,它接受 Jupyter 笔记本的 Git 仓库,构建一个容器镜像来提供它们,然后在 Kubernetes 集群中启动该镜像,并公开一条路由,以便您可以从公共互联网访问它。由于笔记本的主要缺点之一是它们的正确性和功能可能依赖于它们的环境,因此拥有一个可以构建不可变环境以在 Kubernetes 上提供笔记本的高级工具可以消除一个巨大的头痛来源。
可以使用托管的 Binder 服务或 运行您自己的 Binder 实例,但如果您希望在该过程中获得更大的灵活性,您也可以使用 源到镜像 (S2I) 工作流和工具 以及 Graham Dumpleton 的 Jupyter S2I 镜像 来推出您自己的笔记本服务。事实上,源到镜像工作流是基础设施或打包专家构建主题专家可以使用的更高级别工具的绝佳起点。例如,Seldon 项目使用 S2I 来简化发布模型服务——只需向构建器提供一个模型对象,它就会构建一个容器,将其作为服务公开。
源到镜像 (source-to-image) 工作流的一个优点是,它可以在构建镜像之前对源存储库执行任意操作和转换。 例如,为了展示这种工作流的强大之处,我们创建了一个 S2I 构建器镜像,它将展示如何训练模型的 Jupyter notebook 作为输入。 然后,它处理这个 notebook 以识别其依赖项,并提取一个 Python 脚本来训练和序列化模型。 之后,构建器安装必要的依赖项并运行脚本以训练模型。 构建器的最终输出是一个 REST Web 服务,用于提供由 notebook 构建的模型。 您可以观看一个视频,了解这种 notebook 到模型服务的 S2I 的实际效果。 同样,这并非是数据科学家一定会开发的工具,但创建这样的工具为 Kubernetes 和打包专家与数据科学家协作提供了一个绝佳的机会。
Kubernetes 用于生产环境中的机器学习
Kubernetes 可以为数据科学家提供很多帮助,他们正在开发使用机器学习解决业务问题的技术;它还可以为那些将这些技术投入生产的团队提供很多帮助。 有时,机器学习代表着一个单独的生产工作负载——一个批处理或流式作业,用于训练模型并提供见解——但机器学习越来越多地作为智能应用程序的重要组成部分投入生产。
Kubeflow 项目面向那些需要在 Kubernetes 上启动和维护机器学习工作负载和管道的机器学习工程师。 Kubeflow 也是一个面向精通基础设施的数据科学家的出色发行版。 它提供了模板和自定义资源,以便在 Kubernetes 上部署各种机器学习库和工具。
Kubeflow 是在 Kubernetes 下运行 TensorFlow、JupyterHub、Seldon 和 PyTorch 等框架的出色方式,因此代表了一条实现真正可移植工作负载的路径:数据科学家或机器学习工程师可以在笔记本电脑上开发管道,并将其部署到任何地方。 这是一个发展迅速的社区,正在开发一些很棒的技术,您应该去了解一下!
Radanalytics.io 是一个面向应用程序开发人员的社区项目,它专注于开发依赖于容器中横向扩展计算的智能应用程序的独特需求。 radanalytics.io 项目包括一个容器化的 Apache Spark 发行版,用于支持可扩展的数据转换和机器学习模型训练,以及一个 Spark 操作员和 Spark 管理界面。 该社区还通过为 Jupyter notebook、TensorFlow 训练和服务以及 S2I 构建器提供模板和镜像来支持整个智能应用程序生命周期,这些构建器可以部署应用程序以及它所需的横向扩展计算资源。 如果您想开始在 OpenShift 或 Kubernetes 上构建智能应用程序,一个很好的起点是 radanalytics.io 上的众多示例应用程序或会议演讲。
Sophie Watson 和 William Benton 在 12 月 10 日至 13 日在西雅图举行的 KubeCon + CloudNativeCon North America 上发表了 为什么数据科学家喜欢 Kubernetes 的演讲。
1 条评论