O PyTorch é um framework de machine learning amplamente utilizado para treinamento distribuído em múltiplas máquinas e GPUs. No Kubernetes, envie cargas de trabalho do PyTorch por meio do PyTorchJob. Este tópico explica como usar o ACK Kube Queue para gerenciar filas e cotas em uma instância do ACK Fleet e como declarar requisitos de gang scheduling ao distribuir recursos entre os member clusters.
Configure o Kube Queue em uma instância do ACK Fleet para enfileirar PyTorchJobs e aplicar gang scheduling. Isso garante a alocação atômica de todos os pods no mesmo member cluster.
Como funciona
Uma instância do Fleet agenda PyTorchJobs nos member clusters utilizando dois componentes:
Kube Queue: gerencia as filas de jobs, aplica limites elásticos de cota e retém os jobs até que um member cluster tenha recursos suficientes.
ACK Scheduler: aplica gang scheduling quando a instância do Fleet distribui pods para um member cluster e aloca todas as réplicas (Master e Workers) atomicamente.
Fluxo de agendamento:
Envie um PyTorchJob para a instância do Fleet com uma PropagationPolicy que defina
customSchedulingType: Gang.Se o gerenciamento de filas estiver ativado (
suspension.scheduling: true), o Kube Queue reterá o job até haver um slot de cota disponível.A instância do Fleet avalia os recursos dos member clusters e seleciona um cluster de destino.
O ACK Scheduler aloca todos os pods atomicamente no cluster selecionado.
A instância do Fleet monitora o job e sincroniza o status.
Pré-requisitos
Verifique se você tem:
Conjunto de IA nativa da cloud instalado nos member clusters (apenas o componente Arena)
Política AliyunAdcpFullAccess do RAM (Resource Access Management) anexada ao seu usuário RAM. Consulte Grant permissions to RAM users.
Ferramenta de linha de comando AMC instalada. Consulte Use AMC.
(Opcional) Reserva de recursos ativada para alinhar o agendamento do Fleet aos member clusters. Requer Kubernetes 1.28 ou posterior e ACK Scheduler 6.8.0 ou posterior.
(Opcional) Ativar reserva de recursos
Sem a reserva de recursos, a instância do Fleet estima a capacidade somando os recursos restantes nos nós dos member clusters. Com a reserva ativada, ela retém a capacidade real no cluster de destino antes de confirmar a alocação. Assim, o agendamento do Fleet corresponde ao resultado do member cluster.
Faça login no ACK console e clique em Clusters no painel de navegação à esquerda.
Clique no nome do cluster. No painel de navegação à esquerda, clique em Add-ons.
Na página Add-ons, localize Kube Scheduler e clique em Configuration.
Na caixa de diálogo Kube Scheduler Parameters, defina enableReservation como true e clique em OK.
Escolha um modo de agendamento
Dois modos de agendamento estão disponíveis:
|
Modo |
Quando usar |
Configuração principal |
|
Apenas gang scheduling |
Alocação atômica de pods sem gerenciamento de filas |
Defina |
|
Gang scheduling + gerenciamento de filas |
Enfileiramento ordenado com aplicação de cotas quando muitos jobs competem por recursos limitados |
Defina |
Siga a Etapa 1 para configurar o gerenciamento de filas ou pule para a Etapa 2 caso deseje apenas o gang scheduling.
Etapa 1 (Opcional): Configurar filas de jobs com Kube Queue
Use ElasticQuotaTree para definir limites de cota e restringir jobs simultâneos entre namespaces.
-
Envie uma
ElasticQuotaTreepara a instância do Fleet. Este exemplo limita o namespacedefaulta um job simultâneo, com até 10.000 CPUs, 10.000 GiB de memória e 10.000 GPUs.apiVersion: scheduling.sigs.k8s.io/v1beta1 kind: ElasticQuotaTree metadata: name: elasticquotatree # Only a single ElasticQuotaTree is supported. namespace: kube-system # Must be created in the kube-system namespace. spec: root: name: root max: cpu: 999900 memory: 400000Gi kube-queue/max-jobs: 10000000000 nvidia.com/gpu: 100000 min: cpu: 999900 memory: 400000Gi kube-queue/max-jobs: 10000000000 nvidia.com/gpu: 100000 children: - name: child-2 max: kube-queue/max-jobs: 1 # Only one job can be dequeued at a time. cpu: 10000 nvidia.com/gpu: 10000 memory: 10000Gi namespaces: - default -
Verifique se o Kube Queue criou as filas:
kubectl get queue -n kube-queueSaída esperada:
NAME AGE root-child-2-v5zxz 15d root-kdzw7 15d
Etapa 2: Enviar um PyTorchJob para agendamento em múltiplos clusters
Enviar uma PropagationPolicy
Uma PropagationPolicy instrui a instância do Fleet sobre como distribuir o PyTorchJob entre os member clusters e qual modo de agendamento aplicar.
Apenas gang scheduling
Defina customSchedulingType: Gang para alocação atômica de pods sem enfileiramento.
apiVersion: policy.one.alibabacloud.com/v1alpha1
kind: PropagationPolicy
metadata:
name: example-policy
namespace: default
spec:
propagateDeps: true
failover:
application:
decisionConditions:
tolerationSeconds: 30
purgeMode: Immediately
placement:
replicaScheduling:
replicaSchedulingType: Divided
customSchedulingType: Gang
resourceSelectors:
- apiVersion: kubeflow.org/v1
kind: PyTorchJob
Gang scheduling com gerenciamento de filas
Adicione suspension.scheduling: true para reter o job no Kube Queue até haver um slot de cota disponível e, em seguida, alocar todos os pods atomicamente.
apiVersion: policy.one.alibabacloud.com/v1alpha1
kind: PropagationPolicy
metadata:
name: example-policy
namespace: default
spec:
suspension:
scheduling: true
propagateDeps: true
failover:
application:
decisionConditions:
tolerationSeconds: 30
purgeMode: Immediately
placement:
replicaScheduling:
replicaSchedulingType: Divided
customSchedulingType: Gang
resourceSelectors:
- apiVersion: kubeflow.org/v1
kind: PyTorchJob
Etapa 3: Verificar o status do job
Na instância do Fleet, execute os comandos abaixo para confirmar o agendamento do job e a execução de todos os pods.
-
Verifique o estado do PyTorchJob:
kubectl get pytorchjobSaída esperada:
NAME STATE AGE pytorch-test Created 3m44s -
Identifique o member cluster que recebeu o job:
kubectl describe pytorchjob pytorch-testNos eventos, procure por
ScheduleBindingSucceed. O campo de resultado exibe o cluster de destino e a contagem de réplicas:Normal ScheduleBindingSucceed 4m59s default-scheduler Binding has been scheduled successfully. Result: {cfxxxxxx:0,[{master 1} {worker 2}]}cfxxxxxxé o ID do member cluster onde todos os pods estão em execução. -
Confirme a execução do job no member cluster:
kubectl amc get pytorchjob -MSaída esperada:
NAME CLUSTER STATE AGE ADOPTION pytorch-test cfxxxxxx Running 6m23s YADOPTION: Yindica que a instância do Fleet assumiu o agendamento deste job. -
Valide se todos os pods estão ativos:
kubectl amc get pod -MSaída esperada:
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 7m16sOs três pods (um Master e dois Workers) executam no mesmo cluster, o que confirma o gang scheduling atômico.
-
Para inspecionar o YAML completo do PyTorchJob no member cluster:
kubectl amc get pytorchjob pytorch-test -m ${member clusterid} -oyaml