Kubeflow Katib:用于 AutoML 的可扩展、可移植云原生系统
Katib 0.10 博客文章
随着机器学习 (ML) 架构的复杂度不断提高,找到 ML 模型的最佳超参数和架构变得越来越重要。自动化机器学习 (AutoML) 已成为 ML 生命周期中的关键一步。Katib 以 Kubernetes 原生方式在 Kubeflow 中提供了 AutoML 功能。
Katib 是一个开源项目,对 ML 框架无特定要求。它可以调优用用户选择的任何语言编写的应用中的超参数,并原生支持许多 ML 框架,如 TensorFlow、Keras、PyTorch、MPI、MXNet、XGBoost、scikit-learn 等。Katib 通过高效地构建更准确的模型以及降低运维和基础设施成本来提高业务成果。Katib 可以部署在本地机器上,也可以作为服务托管在本地数据中心、私有云或公共云中。
Katib 提供了一组丰富的可通过 API 访问的功能。通过使用这些 API,Katib 原生集成了 Kubeflow Notebooks 和 Pipelines。Katib 支持超参数优化 (HP)、神经架构搜索 (NAS) 和提前停止。提前停止功能可以在当前 Katib Experiment 中使用,无需进行任何重大更改。
此外,Katib 是一个独特的系统,它支持所有Kubernetes 工作负载和 Kubernetes 自定义资源定义 (CRD) 来执行 Katib Experiment。由于 Katib 可以执行各种 Kubernetes 资源,用户不仅可以运行 ML 模型优化 Experiment。他们还可以增强任何软件、代码或程序,利用 Katib 提供的优化算法使其更高效。
我们正在持续开发新的 Katib UI,以提供更好的用户体验并与 Kubeflow 中心仪表板原生集成。请查看此演示,了解有关新 UI 的更多信息。
所有上述功能使用户能够轻松地将 Katib 集成到他们的 ML 基础设施管道中。
系统架构
Katib 中有 3 个主要概念,它们都是 Kubernetes CRD
-
Experiment - 一个单一的优化运行,包含目标、搜索空间和搜索算法。
-
Suggestion - 由用户选择的搜索算法生成的一组超参数。Katib 创建 Trial 来评估它们。
-
Trial - 超参数调优过程的一次迭代。Trial 运行对应于训练任务的工作任务。由于 Trial 是工作任务之上的抽象层,任何 Kubernetes 资源都可以用来执行训练任务。例如,TFJob、MPIJob,甚至 Tekton Pipeline。
使用上述资源,Katib 遵循以下步骤,这些步骤在上面的图中有所标记
-
提交 Experiment 后,Experiment 控制器创建相应的 Suggestion 对象。
-
Suggestion 控制器根据此 Suggestion 对象创建 AutoML 算法服务。当算法服务准备就绪后,Suggestion 控制器调用该服务以获取新参数,并将其添加到 Suggestion 对象中。
-
Experiment 控制器发现 Suggestion 对象已更新,并为每组参数创建一个相应的 Trial 对象。
-
Trial 控制器为每个 Trial 对象生成一个工作任务,并监视每个任务的状态。工作任务基于 Trial 模板。
-
一旦工作任务完成,指标收集器从任务中获取指标并将其存储在数据库中。
-
Experiment 控制器将指标结果发送到算法服务,并从 Suggestion 对象中获取新参数。
支持自定义 Kubernetes 资源
Katib 0.10 版本实现了一项新功能,支持将任何 Kubernetes CRD 或 Kubernetes 工作负载作为 Katib Trial 模板。因此,无需手动修改 Katib 控制器即可使用 CRD 作为 Trial。只要 CRD 创建 Kubernetes Pod,允许在这些 Pod 上注入sidecar 容器,并且具有成功和失败状态,就可以在 Katib 中使用该 CRD。
此功能背后的动机如下
-
Katib Trial 模板仅支持有限类型的 Kubernetes 资源(BatchJob、TFJob 和 PyTorchJob)。
-
许多 Katib 用户可能有他们自己的 CRD,他们希望将其用作 Trial 模板。因此,更新 Katib 控制器以支持新的 CRD 的方法是不可扩展的。
-
某些 CRD 的 Go 包版本可能与 Katib 控制器包的版本不兼容。在这种情况下,无法构建 Katib 控制器镜像。
-
如果用户想在 Katib 中实现新的 CRD,他们必须构建和维护 Katib 控制器的自定义镜像版本。
上述问题导致创建了一种可扩展、可移植的 Trial 模板解决方案。此解决方案允许用户修改 Katib 组件并添加他们的 CRD,而无需更改 Katib 控制器镜像。
Katib 现在除了支持 BatchJob、TFJob 和 PyTorchJob 外,还支持 Tekton Pipeline 和 MPIJob。对于 Tekton Pipeline,用户可以在 Trial 的工作任务内构建复杂的工作流。用户还可以使用 Tekton Pipeline 的所有功能来实现数据预处理和后处理。最终,Katib 的指标收集器解析并保存训练过程中的适当指标到数据库。
在 Katib 中支持新的 Kubernetes CRD
要在 Katib 中支持新的 Kubernetes CRD,需要在安装到 Kubernetes 集群之前修改 Katib 组件。要进行此修改,需要了解
-
Kubernetes CRD 的 API 组、版本和 Kind,以及
-
CRD 的控制器创建哪些 Kubernetes 资源。
查看Kubernetes 指南了解更多关于 CRD 的信息。
按照以下两个简单步骤将新的 CRD 集成到 Katib 中
-
使用新标志修改 Katib 控制器 Deployment 的参数
--trial-resources=<object-kind>.<object-API-version>.<object-API-group>
例如,支持 Tekton Pipeline
. . . containers: - name: katib-controller image: docker.io/kubeflowkatib/katib-controller command: ["./katib-controller"] args: - "--webhook-port=8443" - "--trial-resources=Job.v1.batch" - "--trial-resources=TFJob.v1.kubeflow.org" - "--trial-resources=PyTorchJob.v1.kubeflow.org" - "--trial-resources=MPIJob.v1.kubeflow.org" - "--trial-resources=PipelineRun.v1beta1.tekton.dev" . . .
-
修改 Katib 控制器 ClusterRole 的规则,添加新规则以授予 Katib 访问 CRD 控制器创建的所有 Kubernetes 资源的权限。要了解更多关于 ClusterRole 的信息,请查看Kubernetes 指南。
例如,对于 Tekton Pipeline,Trial 创建 Tekton PipelineRun,然后 Tekton PipelineRun 创建 Tekton TaskRun。因此,Katib 控制器 ClusterRole 应该具有访问 pipelineruns 和 taskruns 的权限
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: katib-controller rules: - apiGroups: - tekton.dev resources: - pipelineruns - taskruns verbs: - "*" - apiGroups: - kubeflow.org resources: - tfjobs - pytorchjobs - mpijobs verbs: - "*" . . .
-
按照入门指南安装 Katib。
至此,可以在 Katib Trial 模板中使用 Kubernetes CRD。查看此指南了解更多关于 Tekton 和 Katib 集成的信息。
提前停止
Katib 0.10 版本现在支持提前停止。提前停止是进行 HP 调优的关键步骤之一。它有助于在 Katib Experiment 训练模型时避免过拟合。
使用提前停止有助于节省计算资源并缩短 Experiment 执行时间,它可以在训练过程完成前停止目标指标不再改进的 Experiment Trial。
在 Katib 中使用提前停止的主要优势是训练容器包无需修改。基本上,只需通过一个新实体——earlyStopping
来扩展 Experiment 的 YAML 文件,该实体类似于algorithm
YAML 部分
apiVersion: "kubeflow.org/v1beta1"
kind: Experiment
metadata:
namespace: kubeflow
name: median-stop
spec:
algorithm:
algorithmName: random
earlyStopping:
algorithmName: medianstop
algorithmSettings:
- name: min_trials_required
value: "3"
- name: start_step
value: "5"
objective:
type: maximize
goal: 0.99
objectiveMetricName: Validation-accuracy
additionalMetricNames:
- Train-accuracy
parallelTrialCount: 2
maxTrialCount: 15
maxFailedTrialCount: 3
. . .
目前,Katib 支持中位数停止规则 (Median Stopping Rule)。中位数停止规则会在 Trial 的当前步骤 S 停止正在运行的 Trial,如果该 Trial 的最佳目标值低于该步骤 S 之前所有成功完成的 Trial 的目标值的中位数。有兴趣了解更多关于中位数停止规则的读者可以查看Google Vizier: A Service for Black-Box Optimization 这篇论文。
要了解更多关于在 Katib 中使用提前停止的信息,请遵循官方指南。
参与贡献
首先,非常感谢我们的贡献者 (Alfred Xu (Nvidia), Andrey Velichkevich (Cisco), Anton Kirillov (Mesosphere), Ce Gao (Tencent Cloud), Chenjun Zou (Alibaba), Elias Koromilas (InAccel), Hong Xu (IBM), Johnu George (Cisco), Masashi Shibata, Vaclav Pavlin (Red Hat), Yao Xiao (AWS), Yuan Tang (Ant Group)) 对 0.10 版本的发布提供了帮助。我们的社区正在壮大,我们邀请新的用户和 AutoML 爱好者为 Katib 项目贡献力量。以下链接提供了参与社区的信息
-
订阅日历参加 AutoML WG 社区会议。
-
查看Katib 采用者列表。
-
在演示和示例列表中了解更多关于 Katib 的信息。
请在 AutoML Slack 频道告诉我们活跃的使用案例、功能需求和问题,或提交新的GitHub issue。要了解有关新 Katib UI 或跟踪当前集成过程的信息,请查看GitHub 项目。我们计划尽快安排一个关于在 Kubeflow 中使用 AutoML 的网络研讨会和教程。请加入kubeflow-discuss 邮件列表了解更多信息。
特别感谢 Amit Saha (Cisco)、Ce Gao (Tencent Cloud)、Johnu George (Cisco)、Jorge Castro (Arrikto)、Josh Bottum (Arrikto) 对此博客文章的帮助。