Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Treinamento distribuído com DeepSpeed

Última atualização: Jul 02, 2026

Execute jobs de treinamento distribuído com DeepSpeed usando o Arena e visualize os resultados no TensorBoard.

Pré-requisitos

Antes de começar, verifique se você tem:

Como funciona

Um job do DeepSpeed no ACK opera em uma topologia launcher-worker:

  • O nó Launcher coordena a execução do treinamento distribuído e não utiliza GPU.

  • Os nós Worker executam o treinamento. Cada worker recebe uma ou mais GPUs e roda o script de treinamento do DeepSpeed.

A comunicação entre os nós usa SSH; portanto, todas as imagens devem ter o OpenSSH instalado.

Importante

O acesso aos jobs de treinamento ocorre exclusivamente via SSH sem senha. Proteja os Kubernetes Secrets em ambientes de produção.

Configuração de exemplo

Este guia usa um exemplo que treina um modelo de linguagem mascarada. O código e o conjunto de dados de exemplo, disponíveis em microsoft/DeepSpeedExamples, vêm pré-empacotados na imagem registry.cn-beijing.aliyuncs.com/acs/deepspeed:hello-deepspeed. O exemplo usa uma PVC chamada training-data (baseada em um volume NAS compartilhado) para armazenar os resultados do treinamento.

Usar uma imagem personalizada

Para usar seu próprio código de treinamento, escolha uma das abordagens a seguir:

  • Compilar a partir da imagem base do DeepSpeed para ACK:

    registry.cn-beijing.aliyuncs.com/acs/deepspeed:v072_base
  • Compilar a partir da sua própria imagem base: Siga o Dockerfile e instale o OpenSSH na imagem.

Sincronizar código de um repositório Git privado

Use os parâmetros --sync-mode=git e --sync-source para baixar o código de treinamento durante a execução. O Arena usa o utilitário git-sync para sincronizar o repositório. Defina as credenciais pelas variáveis de ambiente GIT_SYNC_USERNAME e GIT_SYNC_PASSWORD.

Enviar e monitorar um job do DeepSpeed

Etapa 1: Verificar os recursos de GPU disponíveis

arena top node

Saída esperada:

NAME                       IPADDRESS      ROLE    STATUS  GPU(Total)  GPU(Allocated)
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           0
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
0/3 (0.0%)

Três nós acelerados por GPU estão disponíveis.

Etapa 2: Enviar o job do DeepSpeed

O comando a seguir envia um job chamado deepspeed-helloworld com um nó Launcher e três nós worker, cada um usando uma GPU:

arena submit deepspeedjob \
    --name=deepspeed-helloworld \
    --gpus=1 \
    --workers=3 \
    --image=registry.cn-beijing.aliyuncs.com/acs/deepspeed:hello-deepspeed \
    --data=training-data:/data \
    --tensorboard \
    --logdir=/data/deepspeed_data \
    "deepspeed /workspace/DeepSpeedExamples/HelloDeepSpeed/train_bert_ds.py --checkpoint_dir /data/deepspeed_data"

Parâmetros

Parâmetro

Obrigatório

Descrição

Padrão

--name

Sim

Nome do job globalmente único

--image

Sim

Imagem de contêiner para o runtime

--gpus

Não

GPUs alocadas para cada nó worker

0

--workers

Não

Quantidade de nós worker

1

--data

Não

Monta uma PVC no runtime. Formato: <pvc-name>:<mount-path>. Execute arena data list para listar as PVCs disponíveis.

--tensorboard

Não

Ativa um serviço do TensorBoard. Uso obrigatório com --logdir.

--logdir

Não

Caminho de onde o TensorBoard lê os arquivos de eventos. Uso obrigatório com --tensorboard.

/training_logs

Para sincronizar o código de um repositório Git privado em vez de incluí-lo na imagem, adicione estes sinalizadores:

arena submit deepspeedjob \
    ...
    --sync-mode=git \
    --sync-source=<private-git-repo-url> \
    --env=GIT_SYNC_USERNAME=<username> \
    --env=GIT_SYNC_PASSWORD=<password> \
    "deepspeed /workspace/DeepSpeedExamples/HelloDeepSpeed/train_bert_ds.py --checkpoint_dir /data/deepspeed_data"

Saída esperada após o envio:

trainingjob.kai.alibabacloud.com/deepspeed-helloworld created
INFO[0007] The Job deepspeed-helloworld has been submitted successfully
INFO[0007] You can run `arena get deepspeed-helloworld --type deepspeedjob` to check the job status

Etapa 3: Verificar se o job está em execução

Liste todos os jobs de treinamento do Arena:

arena list

Saída esperada:

NAME                  STATUS   TRAINER         DURATION  GPU(Requested)  GPU(Allocated)  NODE
deepspeed-helloworld  RUNNING  DEEPSPEEDJOB    3m        3               3               192.168.9.69

Verifique o uso de GPU por job:

arena top job

Saída esperada:

NAME                  STATUS   TRAINER         AGE  GPU(Requested)  GPU(Allocated)  NODE
deepspeed-helloworld  RUNNING  DEEPSPEEDJOB    4m   3               3               192.168.9.69

Total Allocated/Requested GPUs of Training Jobs: 3/3

Verifique o uso de GPU em todo o cluster:

arena top node

Saída esperada:

NAME                       IPADDRESS      ROLE    STATUS  GPU(Total)  GPU(Allocated)
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           1
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           1
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           1
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
3/3 (100%)

Etapa 4: Obter detalhes do job e a URL do TensorBoard

arena get deepspeed-helloworld

Saída esperada:

Name:      deepspeed-helloworld
Status:    RUNNING
Namespace: default
Priority:  N/A
Trainer:   DEEPSPEEDJOB
Duration:  6m

Instances:
  NAME                           STATUS   AGE  IS_CHIEF  GPU(Requested)  NODE
  ----                           ------   ---  --------  --------------  ----
  deepspeed-helloworld-launcher  Running  6m   true      0               cn-beijing.192.1xx.x.x
  deepspeed-helloworld-worker-0  Running  6m   false     1               cn-beijing.192.1xx.x.x
  deepspeed-helloworld-worker-1  Running  6m   false     1               cn-beijing.192.1xx.x.x
  deepspeed-helloworld-worker-2  Running  6m   false     1               cn-beijing.192.1xx.x.x

Your tensorboard will be available on:
http://192.1xx.x.xx:31870

As duas últimas linhas aparecem apenas quando o TensorBoard está ativado.

Etapa 5: Visualizar os resultados do treinamento no TensorBoard

  1. Encaminhe o serviço do TensorBoard para uma porta local:

    kubectl port-forward svc/deepspeed-helloworld-tensorboard 9090:6006
  2. Abra localhost:9090 no navegador.

    TensorBoard training results

Etapa 6: Visualizar os logs de treinamento

Exiba todos os logs do job:

arena logs deepspeed-helloworld

Saída esperada:

deepspeed-helloworld-worker-0: [2023-03-31 08:38:11,201] [INFO] [logging.py:68:log_dist] [Rank 0] step=7050, skipped=24, lr=[0.0001], mom=[(0.9, 0.999)]
deepspeed-helloworld-worker-0: [2023-03-31 08:38:11,254] [INFO] [timer.py:198:stop] 0/7050, RunningAvgSamplesPerSec=142.69733028759384, CurrSamplesPerSec=136.08094834473613, MemAllocated=0.06GB, MaxMemAllocated=1.68GB
deepspeed-helloworld-worker-0: 2023-03-31 08:38:11.255 | INFO     | __main__:log_dist:53 - [Rank 0] Loss: 6.7574
deepspeed-helloworld-worker-0: [2023-03-31 08:38:13,103] [INFO] [logging.py:68:log_dist] [Rank 0] step=7060, skipped=24, lr=[0.0001], mom=[(0.9, 0.999)]
deepspeed-helloworld-worker-0: [2023-03-31 08:38:13,134] [INFO] [timer.py:198:stop] 0/7060, RunningAvgSamplesPerSec=142.69095076844823, CurrSamplesPerSec=151.8552037291255, MemAllocated=0.06GB, MaxMemAllocated=1.68GB
deepspeed-helloworld-worker-0: 2023-03-31 08:38:13.136 | INFO     | __main__:log_dist:53 - [Rank 0] Loss: 6.7570
deepspeed-helloworld-worker-0: [2023-03-31 08:38:14,924] [INFO] [logging.py:68:log_dist] [Rank 0] step=7070, skipped=24, lr=[0.0001], mom=[(0.9, 0.999)]
deepspeed-helloworld-worker-0: [2023-03-31 08:38:14,962] [INFO] [timer.py:198:stop] 0/7070, RunningAvgSamplesPerSec=142.69048436022115, CurrSamplesPerSec=152.91029839772997, MemAllocated=0.06GB, MaxMemAllocated=1.68GB
deepspeed-helloworld-worker-0: 2023-03-31 08:38:14.963 | INFO     | __main__:log_dist:53 - [Rank 0] Loss: 6.7565

Para acompanhar os logs em tempo real, use -f. Para exibir apenas as últimas N linhas, use -t N:

# Stream logs in real time
arena logs deepspeed-helloworld -f

# Print the last 5 lines
arena logs deepspeed-helloworld -t 5

Saída esperada para -t 5:

deepspeed-helloworld-worker-0: [2023-03-31 08:47:08,694] [INFO] [launch.py:318:main] Process 80 exits successfully.
deepspeed-helloworld-worker-2: [2023-03-31 08:47:08,731] [INFO] [launch.py:318:main] Process 44 exits successfully.
deepspeed-helloworld-worker-1: [2023-03-31 08:47:08,946] [INFO] [launch.py:318:main] Process 44 exits successfully.
/opt/conda/lib/python3.8/site-packages/apex/pyprof/__init__.py:5: FutureWarning: pyprof will be removed by the end of June, 2022
  warnings.warn("pyprof will be removed by the end of June, 2022", FutureWarning)

Execute arena logs --help para ver todas as opções de log disponíveis.