O PyTorch é um framework de machine learning amplamente utilizado que auxilia desenvolvedores de modelos a executar treinamentos distribuídos com múltiplos nós e GPUs. No Kubernetes, os jobs do PyTorch são enviados como PyTorchJobs. Utilize o ACK Kube Queue para gerenciar jobs em uma instância de fleet e declare requisitos de Gang scheduling para garantir que todos os pods sejam executados em um único cluster associado.
Arquitetura
Em treinamentos distribuídos com múltiplos nós e GPUs, a carga de trabalho geralmente precisa atender à semântica de Gang scheduling no momento do agendamento para assegurar a execução correta dos pods. A semântica de Gang scheduling exige que todas as cargas de trabalho de um job sejam executadas simultaneamente ou nenhuma delas seja iniciada. A fleet utiliza o ACK Kube Queue e o ACK Scheduler para agendar PyTorchJobs em vários clusters, respeitando a semântica de Gang declarada nas cargas de trabalho do PyTorchJob durante o agendamento.
Pré-requisitos
As operações descritas em Deploy the cloud-native AI suite foram concluídas nos clusters associados (implante apenas o add-on Arena).
A permissão AliyunAdcpFullAccess foi concedida ao usuário do Resource Access Management (RAM). Para mais informações, consulte Manage RAM user permissions.
A ferramenta de linha de comando AMC está instalada. Para mais informações, consulte AMC command-line help.
-
(Opcional) Quando a reserva de recursos está ativada em um cluster, a fleet utiliza essa reserva para alinhar seu resultado de agendamento com o resultado no cluster associado. Caso a reserva de recursos não esteja ativada, a fleet avalia os recursos e agenda jobs comparando dois totais: o total de recursos restantes de todos os nós nos clusters associados e o total de recursos solicitados pelo job. Ative a reserva de recursos conforme descrito abaixo.
NotaA ativação da reserva de recursos requer versão 1.28 ou superior do cluster e versão 6.8.0 ou superior do ACK Scheduler.
Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Components and Add-ons .
Na página Add-ons, localize o add-on Kube Scheduler e clique em Configuration para acessar a página Parameters. Defina enableReservation como true e clique em OK.
Etapa 1: Use o Kube Queue para enfileiramento de jobs e gerenciamento de cotas (opcional)
Em uma fleet de múltiplos clusters, o ElasticQuotaTree gerencia cotas e configura filas, resolvendo o problema de enfileiramento de muitos jobs em ambientes multiusuário. O gerenciamento de filas é opcional. Se você pular esta etapa, utilize a aba Gang scheduling policy only na Etapa 2. A aba ElasticQuotaTree and Gang scheduling policies na Etapa 2 requer o ElasticQuotaTree enviado nesta etapa.
-
Utilize o conteúdo de exemplo a seguir para enviar um ElasticQuotaTree.
ImportanteOs valores
maxeminno exemplo são espaços reservados. Configure-os com os recursos que seus clusters associados podem realmente fornecer. O parâmetromaxespecifica o limite superior de recursos que um nó de cota pode utilizar. O parâmetromindefine os recursos mínimos garantidos a um nó de cota.Para o nó raiz, os valores
maxemindevem ser iguais, e o valormaxnão pode ser menor que a soma dos valoresmaxde seus filhos. Se uma cota exceder a capacidade dos clusters associados, os jobs sairão da fila, mas seus pods permanecerão no status Pending.Um administrador de cluster pode enviar um ElasticQuotaTree na instância de fleet para configurar filas de jobs. Este exemplo define uma cota no namespace
defaultcom um total de 10.000 CPUs, 10.000 GiB de memória, 10.000 GPUs e um job simultâneo.apiVersion: scheduling.sigs.k8s.io/v1beta1 kind: ElasticQuotaTree metadata: name: elasticquotatree # Only one ElasticQuotaTree is supported. namespace: kube-system # Takes effect only in the kube-system namespace. spec: root: name: root # Root node: Max must equal Min. 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: # Only one job can be dequeued at a time. kube-queue/max-jobs: 1 cpu: 10000 nvidia.com/gpu: 10000 memory: 10000Gi namespaces: # Configure the namespaces. - default -
Execute o seguinte comando kubectl na instância de fleet para visualizar as filas criadas pelo ElasticQuotaTree e pelo Kube Queue.
kubectl get queue -n kube-queueSaída esperada:
NAME AGE root-child-2-v5zxz 15d root-kdzw7 15d
Etapa 2: Envie um PyTorchJob para agendamento em múltiplos clusters
-
Envie uma PropagationPolicy na instância de fleet e especifique Gang como a política de agendamento personalizada.
ImportanteO parâmetro
tolerationSecondsdefine por quanto tempo a fleet tolera um job não saudável antes de reagendá-lo. Valor padrão: 300 segundos. Defina este valor com uma duração maior que o tempo necessário para o job reiniciar. Caso contrário, o job poderá ser reagendado antes que todos os seus pods tenham reiniciado.O parâmetro
purgeModeespecifica como os pods de um job com falha são tratados. Valores válidos:Immediately(os pods são excluídos e o job é recriado),Graciously(os pods são excluídos de forma graceful e o reagendamento termina se o job voltar a ficar saudável dentro do período definido emgracePeriodSeconds) eNever(os pods não saudáveis não são excluídos). Se você definirpurgeModecomoImmediately, o progresso de treinamento não salvo em um checkpoint será perdido quando o job falhar. Para jobs de treinamento de longa duração, configure checkpoints periódicos.Apenas política de Gang scheduling
Ao utilizar o Gang scheduling, a
PropagationPolicyenviada deve usar a política de agendamento personalizadacustomSchedulingType=Gang.apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: PropagationPolicy metadata: name: example-policy # The default namespace is `default`. spec: propagateDeps: true # Reschedule the job when it fails to run. failover: application: decisionConditions: tolerationSeconds: 30 purgeMode: Immediately placement: replicaScheduling: replicaSchedulingType: Divided # Declare the use of Gang scheduling. customSchedulingType: Gang resourceSelectors: - apiVersion: kubeflow.org/v1 kind: PyTorchJobPolíticas de ElasticQuotaTree e Gang scheduling
A
PropagationPolicyenviada deve utilizar a política de agendamento personalizadacustomSchedulingType=Gang. Além disso, defina.spec.suspension.schedulingcomotruepara indicar que o job deve entrar na fila.apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: PropagationPolicy metadata: name: example-policy # The default namespace is `default`. spec: suspension: scheduling: true propagateDeps: true # Reschedule the job when it fails to run. failover: application: decisionConditions: tolerationSeconds: 30 purgeMode: Immediately placement: replicaScheduling: replicaSchedulingType: Divided # Declare the use of Gang scheduling. customSchedulingType: Gang resourceSelectors: - apiVersion: kubeflow.org/v1 kind: PyTorchJob -
Utilize o conteúdo de exemplo a seguir para enviar um PyTorchJob na instância de fleet.
O exemplo envia uma carga de trabalho de espaço reservado que não solicita recursos de GPU. Ele verifica apenas se o pod Master e os dois pods Worker são agendados simultaneamente em um único cluster associado. Para executar um treinamento distribuído real, substitua a imagem por uma imagem de treinamento PyTorch e solicite recursos
nvidia.com/gpunos modelos Master e Worker.
Etapa 3: Visualize o status do job
-
Execute o seguinte comando kubectl na instância de fleet para verificar o status do PyTorchJob.
kubectl get pytorchjobSaída esperada:
NAME STATE AGE pytorch-test Created 3m44s -
Execute o comando kubectl abaixo na instância de fleet para visualizar os eventos e identificar o cluster associado onde o PyTorchJob foi agendado.
kubectl describe pytorchjob pytorch-testSaída esperada:
Normal ScheduleBindingSucceed 4m59s default-scheduler Binding has been scheduled successfully. Result: {cfxxxxxx:0,[{master 1} {worker 2}]} -
Utilize o seguinte comando kubectl na instância de fleet para consultar o status do PyTorchJob no cluster associado.
kubectl amc get pytorchjob -MSaída esperada:
NAME CLUSTER STATE AGE ADOPTION pytorch-test cfxxxxxx Running 6m23s Y -
Verifique o status dos pods executando o comando kubectl a seguir na instância de fleet.
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 7m16s -
Consulte os detalhes do PyTorchJob no cluster associado executando o seguinte comando kubectl na instância de fleet. Substitua ${member_cluster_id} pelo ID do cluster associado, conforme exibido na coluna CLUSTER da saída anterior.
kubectl amc get pytorchjob pytorch-test -m ${member_cluster_id} -o yaml