基于 Lyft 的 Flyte Kubernetes 调度器,FlyteInteractive 连接到 Kubernetes pod 内的 VSCode Server,以访问集群上的资源和大规模数据。
译自 LinkedIn Open Sources Interactive Debugger for K8s AI Pipelines,作者 Mary Branscombe 在1990年获得智能知识系统硕士学位后s确信,尽管她所学习的人工智能技术很有前景,但它们还远远没有准备好。
Kubernetes 在构建机器学习项目的平台上越来越受欢迎,但是在 Kubernetes 上的开发体验仍然具有挑战性,通常需要比许多编程人员感兴趣的基础设施专业知识更多的技能。
尽管容器承载应用程序及其依赖关系的承诺意味着在开发周期内具有可移植和一致的环境,但对于像生成式人工智能中使用的大型模型来说,这对于本地工作的开发人员来说是不切实际的,因为数据集和 GPU 硬件都不可用。
为了改善开发者的体验,LinkedIn 创建了 FlyteInteractive,该工具提供了一个“交互式开发环境,允许用户直接运行代码,在 Kubernetes pod 内连接到 Microsoft VSCode Server,并访问网格上的资源和大规模数据。这就像直接通过 SSH 连接到 GPU 端口并直接进行开发。一切都完全一样,”LinkedIn 机器学习工程师 Jason Zhu 解释道,他是帮助创建这款软件的人之一。
开发人员不再需要编写用于模型的模拟数据集,而是可以利用 VSCode 的远程开发支持访问集群上的真实数据集,这避免了在无法处理全尺寸数据集的模型上浪费时间。“随着我们不断迈向更大更复杂的架构。在本地开发并进行测试几乎是不可能的,”他解释道。
"本地开发可用的资源并不包括与生产环境中使用的高端、昂贵的 GPU、相同数量的内存,或分布式系统的复杂性。你可以牺牲模型的大小和复杂性(在本地运行),但这也会牺牲上传模型到真实的生产数据后成功的可能性。"
正如其名称所示,FlyteInteractive 是一个插件,用于为 LinkedIn 已经在使用的另一个开源项目 Flyte 添加更多功能。
Flyte 最初由 Lyft 开发并开源,是一个专为 Kubernetes 编写的工作流编排器,专为数据和机器学习流水线设计,具有允许开发人员使用最流行的机器学习开发语言 Python 构建其工作流的接口,具有强大的类型检查,可以在编译时捕获更多错误(这不仅可以节省金钱,还可以节省时间,鉴于机器学习所需的昂贵基础设施)。
Flyte 在 2022 年初从 LF AI & Data Foundation 毕业,并已在 HBO、Intel、Spotify 等公司中使用,以及 LinkedIn,后者广泛使用 AI,并已迁移其所有 LLM 工作负载以及一些传统机器学习工作负载。Flyte 涵盖的场景比 Kubeflow 更多,并且不要求开发人员具有太多的 Kubernetes 专业知识(但它也为流行的软件包如 PyTorch 和 TensorFlow 提供了 Kubeflow 集成)。
大型组织吸引人的一个重要因素是其提供的可扩展性,LinkedIn 的机器学习基础设施扩展工程师、Flyte 项目的一名提交者 Byron Hsu 表示:“我们每天有超过一千个工作流,我们需要确保每个工作流都可以快速启动。”
Flyte 还有助于进行机器学习中非常重要的快速实验,数据集经常变化,新算法不断涌现。Hsu 在接受 New Stack 采访时表示:“调度时间非常非常快,因此用户可以快速进行实验。”
Python 接口也使得 Flyte 对于机器学习开发人员来说易于上手:“如果你想要在你的工作流中添加一个自定义的 Python 任务,在 Flyte 中做到直观而简单。这绝对使得机器学习开发人员更快。”
Zhu 也解释道,Flyte 还带来了一些熟悉的 DevOps 功能,加速了机器学习的开发过程。他在 LinkedIn 主页信息流中使用了类似于 Flyte 的大型模型:“以前,每次我们构建流水线时,我们都必须在本地拉取依赖项,我们必须等待这一过程完成。但由于 Flyte 是基于镜像的,我们可以提前将所有这些依赖项打包到镜像中,因此用户只需几秒钟就可以上传其作业,而将所有这些依赖项放入运行时的过程则会在运行时发生。” 这节省了大量时间,包括每次更新工作流并重新运行机器学习作业的时间。
为了鼓励代码重用,并避免每个团队为每个新项目重新构建相同的组件和流程,LinkedIn 在 Flyte 之上创建了一个组件中心,其中已经有超过 20 个可重用组件,可以节省大量重复工作。"这些是用于常见工具,如数据预处理、训练或推断,"Hsu 解释道。"训练团队可以构建类似于 TensorFlow 训练器的训练组件,所有的 ML 工程师都可以使用它,而不需要重新实现它。"
这也使得像 Zhu 最近一直在研究的模型量化等更强大和复杂的技术变得更加普遍,方法是将其转换为一个函数或 API 调用。有多种算法可以将模型的表示从高到低精度转换,因此您可以压缩模型并使用尽可能少的资源进行服务,通常机器学习开发人员需要研究最新的进展,选择一个算法,然后为自己的项目实现它。
"我们将其构建为一个组件,因为 Flyte 具有可重用组件的概念,对于其他每个用户的流水线,他们都可以选择将其作为接口或外部 API 调用。因此,他们可以在模型训练完成后对其进行量化,无论它是用于摘要的模型,还是用于推理的模型,还是用于实体提取的模型," Zhu 说。
开发人员可以快速探索多种算法,因为他们可以将它们简单地插入到他们的工作流中,以测试它们对资源使用情况以及模型准确性的影响。
“如果你不确定量化对于你特定的用例是否有效,我们可以建立一个集中式的中心,包含所有不同的量化算法,这样你就可以测试它们,并查看结果矩阵和延迟,以了解权衡,并找出正确的方法。随着领域的发展,会出现更多的量化算法,因此我们必须有一个非常灵活的平台,可以测试所有这些算法,并将它们添加到所有下游流水线都可以受益的集中式的中心中。” Zhu 表示。
能够更快地编写流水线并重用组件加快了机器学习的开发速度,以至于 LinkedIn 的软件工程师开始注意到其他减慢工作流程的因素:从必须使用与生产数据集不够匹配的较小的模拟数据集,到本地开发和测试环境缺乏生产环境的硬件和资源,这意味着模型大小受到人为限制,再到长时间的调试周期,以及必须等待代码部署,才能确定是否真正修复了错误。
由于本地和生产环境之间的差异,大约有五分之一的错误第一次就被修复了:每次代码推送至少需要 15 分钟才能进入生产环境。追踪甚至是一个微小的错误可能需要数十次尝试:在某些情况下,查找并修复问题几乎花费了一个星期的时间。
这些问题并不局限于机器学习开发,但它们不仅受到机器学习模型和它们处理的数据集的规模之大、以及在生产环境中运行模型所需的昂贵基础设施的影响,而且还受到生态系统的影响,该生态系统并不总是提供其他领域开发人员视为理所当然的工具,如代码检查和远程调试。
Zhu 指出,即使是最小的生成式人工智能模型,只要具有合理的体量,就不能在 CPU 上运行。他说:“当你达到那个阶段时,我们自然会将编码和调试过程转移到 Kubernetes Pod 或 GPU 集群中,并使用真实数据和与生产环境中相同的资源。”
FlyteInteractive 可以从 HDFS 或 S3 存储加载数据,并支持单节点作业以及更复杂的多节点和多 GPU 设置。
开发人员只需将 VSCode 装饰器添加到他们的代码中,连接到 VSCode 服务器,并像往常一样使用“运行和调试”命令,即可获取一个交互式调试会话,在其中在 VSCode 中运行他们的 Flyte 任务。Flyte 缓存工作流输出以避免重新运行昂贵的任务,因此 VSCode 可以从上一个任务中加载数据。
您将获得所有常见的选项,如设置断点(甚至是在分布式训练过程中设置断点)或运行本地脚本,以及代码导航和检查工具,这些工具可以帮助您理解具有多个模块的大型模型的复杂代码结构,并查看数据如何流入模型。
你还可以设置插件在 Flyte 任务失败时自动运行,这会阻止任务终止,并为你提供检查和调试失败点的机会。当你找出问题所在并重写了代码后,你可以关闭 VSCode 服务器,让 Flyte 继续运行工作流。"你可以使用修改后的代码恢复工作流:你只需点击一个按钮,然后任务将使用新的修改后的代码运行,并且整个工作流程将继续运行," Hsu 解释道。
他建议,FlyteInteractive 中的 Jupyter 笔记本支持也会很有帮助:"它是一个快速的编排器,具有 Jupyter 笔记本和交互式调试的功能,因此你可以用它来快速实验,也可以用于定期作业或批处理作业。"
虽然目前它是一个插件,但现在它是开源的,他希望有了社区的输入,它将成为 Flyte 的内置功能。
FlyteInteractive 已经在 LinkedIn 节省了数千小时的编码和调试时间;它还可能通过其资源监控选项帮助控制成本。"如果一个 Pod 在一段时间内处于空闲状态,我们将清理它,并发送邮件通知用户‘嘿,您的 Pod 已经空闲一段时间了。考虑释放资源或采取一些行动。" 未来,Hsu 告诉我们,这将更细粒度。"例如,我们想要检测 GPU 利用率。如果它们占用了 GPU,但实际上没有使用它,我们可能希望在十分钟后将其终止,这样我们就可以更好地控制 GPU 系统的预算。”
这依赖于 Flyte 中的检查点支持,因为生成检查点是昂贵的,通常不适用于机器学习中使用的迭代训练循环。"我们必须提供良好的检查点支持,以便在用户的作业被抢占时,它也能保存模型。”
但对于开发人员来说,最吸引人的特性甚至不是快速调试,Zhu 表示。"我喜欢代码检查功能,因为它让我能够快速理解算法的内部工作机制,也帮助我提出一些新的方法。"
他指出,这不仅对你自己的代码有用。"工程师不仅可以将这种方法应用于他们的内部仓库,还可以将其应用于开源仓库。作为一个领域,机器学习发展非常迅速:每周都会出现新的算法,我们这样的工程师不得不进行测试。我们可以将这个工具指向一个开源仓库,快速了解它是否是我们想采用的技术。"