O Arena é uma ferramenta CLI para gerenciar cargas de trabalho de machine learning no Kubernetes. Este guia mostra como enviar um job de treinamento PyTorch autônomo em um cluster Container Service for Kubernetes (ACK) — com uma ou mais GPUs em um único nó — e visualizar o progresso do treinamento com o TensorBoard.
Ao final deste guia, você terá:
Verificado a disponibilidade de GPUs no cluster
Enviado um job de treinamento PyTorch com
arena submit pytorchMonitorado o status do job e o uso da GPU
Acessado o TensorBoard para visualizar os resultados do treinamento
Visualizado os logs de treinamento
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster ACK com nós acelerados por GPU. Para instruções de configuração, consulte Criar um cluster ACK que contém nós acelerados por GPU
Acesso à internet habilitado para os nós do cluster. Consulte Habilitar um cluster ACK existente a acessar a internet
O componente Arena instalado e configurado. Consulte Configurar o cliente Arena
Uma persistent volume claim (PVC) chamada
training-datacom o conjunto de dados MNIST armazenado em/pytorch_data. Consulte Configurar um volume NAS compartilhado
Como torchrun e git-sync funcionam neste guia
Este guia usa o torchrun, launcher nativo do PyTorch para treinamento em nó único. Ele gerencia a criação de processos e a inicialização distribuída, mantendo o mesmo fluxo de trabalho para execução em uma ou várias GPUs no mesmo nó.
O código de treinamento vem de um repositório Git remoto via git-sync. Os dados de treinamento são lidos de um volume compartilhado File Storage NAS (NAS), montado por meio de um persistent volume (PV) e uma PVC. O exemplo usa o arquivo main.py do repositório do Arena.
GPU única vs. múltiplas GPUs: Use uma única GPU para modelos de tamanho padrão que caibam na memória de uma GPU. Utilize múltiplas GPUs em um único nó quando o modelo ou o tamanho do batch exceder a memória de uma única GPU, ou para acelerar o treinamento com paralelismo de dados. Alterne entre as opções ajustando os parâmetros --gpus e --nproc-per-node.
Etapa 1: Verificar a disponibilidade de GPUs
Execute o comando abaixo para verificar quantas GPUs estão disponíveis no cluster:
arena top node
Saída esperada:
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated)
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 0 0
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 0 0
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 2 0
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 2 0
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
0/4 (0.0%)
A saída indica dois nós acelerados por GPU, cada um com duas GPUs ociosas, totalizando quatro GPUs disponíveis para treinamento.
Etapa 2: Enviar um job de treinamento PyTorch
Job com GPU única
Execute o comando abaixo para enviar um job de treinamento PyTorch autônomo usando uma GPU:
arena submit pytorch \
--name=pytorch-mnist \
--namespace=default \
--workers=1 \
--gpus=1 \
--working-dir=/root \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch-with-tensorboard:2.5.1-cuda12.4-cudnn9-runtime \
--sync-mode=git \
--sync-source=https://github.com/kubeflow/arena.git \
--env=GIT_SYNC_BRANCH=v0.13.1 \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/pytorch_data/logs \
"torchrun /root/code/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data --dir /mnt/pytorch_data/logs"
Saída esperada:
service/pytorch-mnist-tensorboard created
deployment.apps/pytorch-mnist-tensorboard created
pytorchjob.kubeflow.org/pytorch-mnist created
INFO[0002] The Job pytorch-mnist has been submitted successfully
INFO[0002] You can run `arena get pytorch-mnist --type pytorchjob -n default` to check the job status
Job com múltiplas GPUs
Para usar duas GPUs no mesmo nó, defina --gpus=2 e --nproc-per-node=2. O torchrun iniciará dois processos de treinamento, um por GPU:
arena submit pytorch \
--name=pytorch-mnist \
--namespace=default \
--workers=1 \
--gpus=2 \
--nproc-per-node=2 \
--working-dir=/root \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch-with-tensorboard:2.5.1-cuda12.4-cudnn9-runtime \
--sync-mode=git \
--sync-source=https://github.com/kubeflow/arena.git \
--env=GIT_SYNC_BRANCH=v0.13.1 \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/pytorch_data/logs \
"torchrun /root/code/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data --dir /mnt/pytorch_data/logs"
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
Padrão |
|
|
Sim |
Nome do job. Deve ser único no cluster. |
N/A |
|
|
Não |
Namespace do Kubernetes |
|
|
|
Não |
Número de nós workers. O nó mestre está incluído; o valor |
|
|
|
Não |
Quantidade de GPUs alocadas para cada nó worker |
|
|
|
Não |
Número de processos de treinamento por nó. Defina como igual a |
N/A |
|
|
Não |
Diretório onde o comando de treinamento é executado |
|
|
|
Sim |
Imagem de contêiner usada para executar o job de treinamento |
N/A |
|
|
Não |
Modo de sincronização do código-fonte. Valores válidos: |
N/A |
|
|
Não |
URL do repositório para sincronização do código-fonte. Usado com |
N/A |
|
|
Não |
Monta uma PVC no contêiner de treinamento. Formato: |
N/A |
|
|
Não |
Habilita o TensorBoard para visualização dos resultados de treinamento. Requer |
N/A |
|
|
Não |
Caminho onde o TensorBoard lê os arquivos de eventos. |
|
Uso de repositório Git privado
Se o repositório exigir autenticação, passe as credenciais por variáveis de ambiente do git-sync:
arena submit pytorch \
...
--sync-mode=git \
--sync-source=https://github.com/kubeflow/arena.git \
--env=GIT_SYNC_BRANCH=v0.13.1 \
--env=GIT_SYNC_USERNAME=<username> \
--env=GIT_SYNC_PASSWORD=<password> \
"torchrun /root/code/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data --dir /mnt/pytorch_data/logs"
Todas as variáveis de ambiente suportadas pelo git-sync podem ser passadas dessa forma. Consulte a documentação do git-sync para obter a lista completa.
Se o repositório GitHub estiver inacessível
Caso não seja possível obter o código do GitHub devido a problemas de rede, baixe-o manualmente para o volume NAS em /code/github.com/kubeflow/arena. Em seguida, envie o job sem o parâmetro --sync-mode:
arena submit pytorch \
--name=pytorch-mnist \
--namespace=default \
--workers=1 \
--gpus=1 \
--working-dir=/root \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch-with-tensorboard:2.5.1-cuda12.4-cudnn9-runtime \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/pytorch_data/logs \
"torchrun /mnt/code/github.com/kubeflow/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data --dir /mnt/pytorch_data/logs"
Etapa 3: Monitorar o job de treinamento
Listar jobs
Execute o comando abaixo para listar todos os jobs do Arena no namespace:
arena list -n default
Saída esperada:
NAME STATUS TRAINER DURATION GPU(Requested) GPU(Allocated) NODE
pytorch-mnist RUNNING PYTORCHJOB 11s 1 1 192.168.xxx.xxx
Verificar o uso de GPU
Execute o comando abaixo para ver a alocação de GPU dos jobs em execução:
arena top job -n default
Saída esperada:
NAME STATUS TRAINER AGE GPU(Requested) GPU(Allocated) NODE
pytorch-mnist RUNNING PYTORCHJOB 18s 1 1 192.168.xxx.xxx
Total Allocated/Requested GPUs of Training Jobs: 1/1
Para ver o uso de GPU em todos os nós do cluster, execute:
arena top node
Saída esperada:
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated)
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 0 0
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 0 0
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 2 1
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 2 0
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
1/4 (25.0%)
Uma GPU agora está alocada.
Visualizar detalhes do job
Execute o comando abaixo para ver os detalhes completos do job, incluindo a URL do TensorBoard:
arena get pytorch-mnist -n default
Saída esperada:
Name: pytorch-mnist
Status: RUNNING
Namespace: default
Priority: N/A
Trainer: PYTORCHJOB
Duration: 45s
CreateTime: 2025-02-12 11:20:10
EndTime:
Instances:
NAME STATUS AGE IS_CHIEF GPU(Requested) NODE
---- ------ --- -------- -------------- ----
pytorch-mnist-master-0 Running 45s true 1 cn-beijing.192.168.xxx.xxx
Tensorboard:
Your tensorboard will be available on:
http://192.168.xxx.xxx:31949
A URL do TensorBoard aparece nos detalhes do job apenas se --tensorboard tiver sido especificado ao enviar o job.
Etapa 4: Acessar o TensorBoard
-
Na máquina local, encaminhe a porta 6006 do serviço TensorBoard para a porta local 9090:
ImportanteO comando
kubectl port-forwarddestina-se apenas a desenvolvimento e depuração. Ele não é confiável, seguro ou escalável para uso em produção. Para soluções de rede de produção em clusters ACK, consulte Gerenciamento de Ingress.kubectl port-forward -n default svc/pytorch-mnist-tensorboard 9090:6006 -
Abra <http://127.0.0.1:9090> em um navegador web para acessar o TensorBoard.
NotaO código de treinamento grava resultados em arquivos de eventos a cada 10 épocas. Se alterar
--epochs, defina um múltiplo de 10; caso contrário, o TensorBoard não exibirá nenhum resultado de treinamento.
Etapa 5: Visualizar logs de treinamento
Execute o comando abaixo para visualizar os logs de treinamento:
arena logs pytorch-mnist -n default
Saída esperada:
Train Epoch: 10 [55680/60000 (93%)] Loss: 0.025778
Train Epoch: 10 [56320/60000 (94%)] Loss: 0.086488
Train Epoch: 10 [56960/60000 (95%)] Loss: 0.003240
Train Epoch: 10 [57600/60000 (96%)] Loss: 0.046731
Train Epoch: 10 [58240/60000 (97%)] Loss: 0.010752
Train Epoch: 10 [58880/60000 (98%)] Loss: 0.010934
Train Epoch: 10 [59520/60000 (99%)] Loss: 0.065813
Accuracy: 9921/10000 (99.21%)
Para transmitir logs em tempo real, adicione -f. Para visualizar apenas as últimas N linhas, adicione -t N ou --tail N. Para todas as opções, execute arena logs --help.
(Opcional) Etapa 6: Limpar recursos
Para excluir o job de treinamento e liberar recursos de GPU:
arena delete pytorch-mnist -n default
Saída esperada:
INFO[0001] The training job pytorch-mnist has been deleted successfully