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:
Um cluster ACK com nós acelerados por GPU. Consulte Criar um cluster ACK com nós acelerados por GPU.
O conjunto de IA nativa da nuvem instalado, com a CLI
ack-arenana versão 0.9.10 ou posterior. Consulte Implantar o conjunto de IA nativa da nuvem.O cliente Arena instalado na versão 0.9.10 ou posterior. Consulte Configurar o cliente Arena.
Persistent Volume Claims (PVCs) criadas no cluster. Consulte Configurar um volume NAS compartilhado.
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.
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 |
|
|
Sim |
Nome do job globalmente único |
— |
|
|
Sim |
Imagem de contêiner para o runtime |
— |
|
|
Não |
GPUs alocadas para cada nó worker |
|
|
|
Não |
Quantidade de nós worker |
|
|
|
Não |
Monta uma PVC no runtime. Formato: |
— |
|
|
Não |
Ativa um serviço do TensorBoard. Uso obrigatório com |
— |
|
|
Não |
Caminho de onde o TensorBoard lê os arquivos de eventos. Uso obrigatório com |
|
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
-
Encaminhe o serviço do TensorBoard para uma porta local:
kubectl port-forward svc/deepspeed-helloworld-tensorboard 9090:6006 -
Abra
localhost:9090no navegador.
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.