PyTorch是广泛应用的机器学习框架,能够帮助模型开发人员实现多机多卡分布式训练。在Kubernetes中,您可以通过PyTorchJob提交PyTorch框架下的机器学习任务。本文介绍如何在舰队集群中使用ACK Kube Queue进行任务管理及如何在舰队集群下发资源时声明Gang调度要求。
架构信息
在实现多机多卡分布式训练时,为确保训练负载的Pod能够正常运行,通常需要任务负载在调度时满足Gang调度语义(任务的所有工作负载必须全部运行或全部不运行)。舰队通过ACK Kube Queue以及ACK Scheduler实现了多集群中的PyTorchJob调度,并且能够在调度时保障PyTorchJob工作负载上声明的Gang语义。
前提条件
子集群已安装云原生AI套件(仅需部署Arena)。
已授予RAM用户AliyunAdcpFullAccess权限。具体操作,请参见为RAM用户授权。
已安装AMC命令行工具。具体操作,请参见AMC命令行帮助。
(可选)当集群开启了资源预留时,舰队将使用资源预留保障舰队集群的调度结果与子集群一致。当集群未开启资源预留时,舰队集群采用比较子集群所有节点剩余资源之和与任务需求资源之和的方式进行资源评估以及任务调度。开启资源预留的方式如下。
说明开启资源预留需要集群版本不低于1.28,且调度器版本不低于6.8.0。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,找到Kube Scheduler组件,单击配置进入参数配置页面,将enableReservation设置为true,然后单击确定。
步骤一:使用Kube Queue进行任务排队及配额管理(可选)
多集群舰队中通过ElasticQuotaTree进行配额管理以及队列配置,能够帮助您解决在多用户场景下大量任务的排队问题。
使用以下示例内容,提交ElasticQuotaTree。
集群管理员可以在舰队中提交ElasticQuotaTree来配置任务队列。本示例将在
default
命名空间中设置配额,总共10000CPU、10000Gi内存、10000GPU以及1个任务。apiVersion: scheduling.sigs.k8s.io/v1beta1 kind: ElasticQuotaTree metadata: name: elasticquotatree # 只支持单个ElasticQuotaTree。 namespace: kube-system # 只有kube-system下才会生效。 spec: root: name: root # Root节点的Max必须等于Min。 max: cpu: 999900 memory: 400000Gi kube-queue/max-jobs: 10000000000 nvidia.com/gpu: 100000 min: cpu: 9999 memory: 40Gi children: - name: child-2 max: # 限制同时只能出队一个任务。 kube-queue/max-jobs: 1 cpu: 10000 nvidia.com/gpu: 10000 memory: 10000Gi namespaces: # 配置对应的Namespace。 - default
在舰队实例中执行以下命令,查看ElasticQuotaTree及KubeQueue创建的队列。
kubectl get queue -n kube-queue
预期输出:
NAME AGE root-child-2-v5zxz 15d root-kdzw7 15d
步骤二:提交PyTorchJob进行多集群调度
在舰队实例中提交PropagationPolicy,并指定自定义策略为Gang。
仅使用Gang调度策略
在使用Gang调度能力时,需要在提交的
PropagationPolicy
中使用customSchedulingType=Gang
的自定义调度策略。apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: PropagationPolicy metadata: name: example-policy # The default namespace is `default`. spec: propagateDeps: true # 申明任务运行失败时重新调度。 failover: application: decisionConditions: tolerationSeconds: 30 purgeMode: Immediately placement: replicaScheduling: replicaSchedulingType: Divided # 声明使用Gang调度。 customSchedulingType: Gang resourceSelectors: - apiVersion: kubeflow.org/v1 kind: PyTorchJob
使用ElasticQuotaTree及Gang调度策略
需要在提交的
PropagationPolicy
中使用customSchedulingType=Gang
的自定义调度策略,并将.Spec.Suspension.Scheduling
设置为true
,表明需要进入Queue队列进行排队。apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: PropagationPolicy metadata: name: example-policy # The default namespace is `default`. spec: propagateDeps: true # 申明任务运行失败时重新调度。 failover: application: decisionConditions: tolerationSeconds: 30 purgeMode: Immediately placement: replicaScheduling: replicaSchedulingType: Divided # 声明使用Gang调度。 customSchedulingType: Gang resourceSelectors: - apiVersion: kubeflow.org/v1 kind: PyTorchJob
在舰队实例中使用以下示例内容,提交PyTorchJob。
步骤三:查看任务状态
在舰队实例中执行以下命令,查看PyTorchJob任务的状态。
kubectl get pytorchjob
预期输出:
NAME STATE AGE pytorch-test Created 3m44s
在舰队中执行以下命令,在事件中查看PyTorchJob任务调度至哪个关联集群。
kubectl describe pytorchjob pytorch-test
预期输出:
Normal ScheduleBindingSucceed 4m59s default-scheduler Binding has been scheduled successfully. Result: {cfxxxxxx:0,[{master 1} {worker 2}]}
在舰队中执行以下命令,查看关联集群中的PyTorchJob任务的状态。
kubectl amc get pytorchjob -M
预期输出:
NAME CLUSTER STATE AGE ADOPTION pytorch-test cfxxxxxx Running 6m23s Y
在舰队中执行以下命令,查看Pod状态。
kubectl amc get pod -M
预期输出:
NAME CLUSTER READY STATUS RESTARTS AGE pytorch-test-master-0 cfxxxxxx 1/1 Running 0 7m16s pytorch-test-worker-0 cfxxxxxx 1/1 Running 0 7m16s pytorch-test-worker-1 cfxxxxxx 1/1 Running 0 7m16s
在舰队中执行以下命令,查看关联集群中PyTorchJob任务的详情。
kubectl amc get pytorchjob pytorch-test -m ${member clusterid} -oyaml