云原生 AI 前沿:Kubeflow Training Operator 统一云上 AI 训练
张望,腾讯高级工程师,从事云上 GPU 和分布式训练加速,负责腾讯云 TKE 在 AI 场景的研发和支持工作。
单嘉鑫,字节跳动软件工程师,从事基础架构及开源工作,主要关注在Kubernetes、Serverless、ML 领域。
分布式训练与 Kubeflow
在 Kubernetes 集群上创建 Pod 以拉起各个训练进程
配置用作服务发现的信息(如
TF_CONFIG
)以及创建相关 Kubernetes 资源(如 Service)监控并更新整个任务的状态
Kubeflow Operators 的问题
大量开发者的精力耗费在针对不同训练框架的功能增强和故障修复上
难以将测试和发布的基础功能与服务在不同 operators 之间复用
第三方组件需要对接大量不同的 operators
新的训练框架需要开发完整的对应的 operator 才能使用,开发成本过高
众多的 operators 对刚刚接触 Kubeflow 的新人开发者而言学习成本过高
用户需要安装多个 operator 组件才能支持多种训练 APIs
各种 Kubeflow Jobs 的 JobSpec 看上去很类似,但是又有些许不同,并没有提供统一的使用体验
Proposal:All-in-One
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{...})
...
for _, s := range enabledSchemes {
setupFunc, supported := controller_v1.SupportedSchemeReconciler[s]
if !supported {os.Exit(1)}
if err = setupFunc(mgr, enableGangScheduling); err != nil {
setupLog.Error(err, "unable to create controller", "controller", s)
os.Exit(1)
}
}
SupportedSchemeReconciler
提前完成注册:var SupportedSchemeReconciler = map[string]ReconcilerSetupFunc{
tensorflowv1.Kind: func(mgr manager.Manager, enableGangScheduling bool) error {
return tensorflowcontroller.NewReconciler(mgr, enableGangScheduling).SetupWithManager(mgr)
},
pytorchv1.Kind: func(mgr manager.Manager, enableGangScheduling bool) error {
return pytorchcontroller.NewReconciler(mgr, enableGangScheduling).SetupWithManager(mgr)
},
...,
}
--enable-scheme
来指定需要开启支持的 API。后续有新的 Controller 接入,按照这种“先注册后启动”的方式来选择性地开启对应的 controllers。进展与近期规划
// 根据 ctrl.Request 获取对应的自定义 Job
GetJob(ctx context.Context, req ctrl.Request) (client.Object, error)
// 从自定义 Job 中以 map[commonv1.ReplicaType]*commonv1.ReplicaSpec 的格式抽取 ReplicasSpecs
ExtractReplicasSpec(job client.Object) (map[commonv1.ReplicaType]*commonv1.ReplicaSpec, error)
// 从自定义 Job 中抽取 RunPolicy
ExtractRunPolicy(job client.Object) (*commonv1.RunPolicy, error)
// 从自定义 Job 中抽取 JobStatus
ExtractJobStatus(job client.Object) (*commonv1.JobStatus, error)
DecoratePod(rtype commonv1.ReplicaType, podTemplate *corev1.PodTemplateSpec, job client.Object)
在 client 向 APIServer 提交创建请求前修改 Pod。pkg/reconciler.v1
的形态合入[1] kubeflow/common[2] 仓库。很快,我们也将在 tf-operator 上引入基于该 reconciler.v1
包的基础 API,希望可以在验证 reconciler.v1
的同时为更多通用的实用案例提供一种更为简便接入 Kubernetes 的方式。pkg/controller.v1
包可以满足这一类开发者的需求。远景展望
首先是进一步提高 Kubeflow Training Operator 适配定制化需求 Job 时的灵活性。我们计划提出与深度学习训练框架解耦的一种 Job API 以支持更广泛的任务定义,并允许用户可以借助 kubeflow/common 中的 controller.v1 和 reconciler.v1 进行定制化开发,但其学习成本和开发成本依然过高。甚至在将来,初级开发者可以不修改 operator 而仅仅添加/修改一些 webhook 或是 decorator server 来实现定制化修改。
第二个方面是进一步增强 Kubeflow Training Operator 和其他第三方组件交互时的便利性。我们希望未来利用 Kubeflow Training Operator 来构建 AI 平台的开发者可以方便地将其与其他模块对接,实现诸如任务队列、流水线、超参数搜索等功能。
最后也是最关键的,我们依然希望可以进一步提升 Kubeflow Training Operator 的稳定性。
参考资料
add reconciler.v1: 【https://github.com/kubeflow/common/pull/141】
[2]reconciler.v1 implementation: 【https://github.com/kubeflow/common/tree/master/pkg/reconciler.v1/common】
[3] All-in-one Kubeflow Training Operator: 【https://docs.google.com/document/d/1x1JPDQfDMIbnoQRftDH1IzGU0qvHGSU4W6Jl4rJLPhI/edit】
互动赢好礼
精读文章,答题赢T恤
Q1: 当前 tf-operator 仓库已经支持哪些 kubeflow 训练的API?
Q2: kubeflow/common 项目是什么时候启动的?9月10日上午11点,由作者选出回答最佳的5位读者,送定制T恤一件。
往期精选推荐