Kubetorch 在 Kubernetes 上支持机器学习研发,涵盖训练、推理、强化学习 (RL)、评估、数据处理等各个环节,以一种简洁且不预设过多限制的方式提供服务。
对于许多团队而言,Kubernetes 因其对任意规模工作负载的支持、丰富的开源生态系统以及工作负载的可移植性,正日益成为机器学习/人工智能开发的基础设施。然而,在 Kubernetes 上进行机器学习/人工智能开发并不顺手。与常规软件不同,你无法在容器化并部署到 Kubernetes 之前测试机器学习代码,因为你的本地环境没有 32 张 H100 显卡(甚至连一张 T4 都没有)。因此,你必须通过“部署到 Kubernetes”来进行开发。在分布式 PyTorch 训练中进行迭代,意味着必须停止执行、销毁 Pod 以清除状态、重新构建 Docker 镜像、重新排队等待资源、重新加载工件,最后才能恢复训练。整个过程耗时 10-30 分钟,并且为了添加一条打印语句,你还需要与 Dockerfile 和 YAML 文件周旋。
为了解决这个问题,Kubetorch 提供了一个能够轻松部署到 Kubernetes 的框架。你可以获取任何常规的机器学习程序,并在远程集群上以任意规模运行它,调用集群资源就像调用本地进程池一样简单。后续的迭代速度极快,本地代码的更改可以在几秒钟内同步,因为所有内容都在本地进行了缓存。而且它不会引入任何强制性的预设,因此你可以使用任意的计算资源、镜像、资源类型和集群管理方案。
查看 PyTorch 生态系统,请访问 PyTorch 景观 (PyTorch Landscape)。了解更多关于项目如何加入 PyTorch 生态系统景观的信息。
工作原理
正如 PyTorch 让控制 GPU 变得简单一样,Kubetorch 也让控制 Kubernetes 变得简单。它提供了一个类似的 `.to()` API,可以将代码部署到远程并使其可调用。
import kubetorch as kt
from my_repo.training_main import train
train_compute = kt.Compute(cpus="2", gpus="1")
remote_train = kt.fn(train).to(train_compute)
result = remote_train(lr=0.05, batch_size=4)
在此示例中,我们将常规训练入口点发送到 Kubernetes 上运行,并获得了一个与原始训练函数表现一致的本地可调用对象。后续的调用会被路由到远程服务,日志和异常会像本地执行一样被传回。
你也可以轻松扩展工作负载;假设你的训练使用了 PyTorch DDP,那么扩展训练规模只需修改你提交工作负载的 Compute 对象即可。
import kubetorch as kt
from my_repo.training_main import train
train_compute = kt.Compute(gpus="8").distribute("pytorch", workers=8)
remote_train = kt.fn(train).to(train_compute)
result = remote_train(lr=0.05, batch_size=4)
你还可以通过这种远程执行方式解锁强大的新模式。例如,你可以部署一个能够在多次调用间保持状态的类。或者,你可以捕获远程异常并决定如何处理,而无需让整个应用程序崩溃。
import kubetorch as kt
from my_repo import TrainerClass
epochs = 25
batch_size = 32
train_compute = kt.Compute(gpus="8").distribute("pytorch", workers=4)
remote_train = kt.cls(TrainerClass).to(train_compute)
remote_train.load_data()
for epoch in range(epochs):
try:
remote_train.train(epoch, batch_size = batch_size)
except Exception as e:
if "CUDA out of memory" in str(e):
batch_size = batch_size / 2
remote_train.save()
核心优势
Kubetorch 通过 Python 库和 Kubernetes Operator 进行安装,所有组件都在你的云账户和 VPC 内运行。它可以逐步集成到现有的机器学习技术栈中,也可以作为全套方案使用,覆盖训练、批处理、在线推理、超参数优化和流水线构建等场景。
- 通过在代码中直接指定所需的资源、分布方式和扩展策略,可以在 Kubernetes 上按任意规模运行任何 Python 代码。
- 利用神奇的缓存和热重载功能,在 1–2 秒内即可完成代码迭代。
- 通过从任何环境(包括队友的笔记本电脑、CI、编排器或生产应用程序)向 Kubernetes 分发工作,实现可重复的代码执行。
- 从驱动程序中以编程方式处理硬件故障、抢占和内存溢出 (OOM),从而建立强大的容错能力。
- 通过可观测性、日志记录、自动关闭、排队等功能优化工作负载。
- 编排复杂的异构工作负载,例如强化学习 (RL) 后训练,这类任务需要在单个循环内协调不同的计算资源、镜像、扩展策略和分布式通信。
入门指南
安装和使用 Kubetorch (GitHub 仓库) 非常简单。如果你已经拥有一个 Kubernetes 集群,那么只需执行以下步骤即可开始:
- 使用 Helm 将 Kubetorch 安装到集群上
- 在你想要使用 Kubetorch 的任何地方(本地机器、CI、编排器节点)通过 Pip 安装 Python 客户端