Criar perfil de cargas de trabalho do PyTorch XLA

A criação de perfil é uma forma de analisar e melhorar o desempenho dos modelos. Embora haja muito mais a ser abordado, às vezes é útil pensar na criação de perfil como operações de tempo e partes do código que são executadas em ambos os dispositivos (TPUs) e hosts (CPUs). Neste guia, você terá uma visão geral de como criar o perfil do código para treinamento ou inferência. Para mais informações sobre como analisar perfis gerados, consulte os guias a seguir.

Comece já

Criar uma TPU

  1. Exporte as variáveis de ambiente:

    $ export TPU_NAME=your_tpu_name
    $ export ZONE=us-central2-b
    $ export PROJECT_ID=project-id
    $ export ACCELERATOR_TYPE=v4-8
    $ export RUNTIME_VERSION=tpu-vm-v4-pt-2.0
    

    Exportar descrições de variáveis

    TPU name
    O nome que você quer usar para o Cloud TPU.
    zone
    A zona em que você planeja criar o Cloud TPU.
    project ID
    O ID do projeto que você está usando para treinar e criar o perfil do modelo.
    accelerator-type
    O tipo de acelerador especifica a versão e o tamanho do Cloud TPU que você quer criar. Para mais informações sobre os tipos de aceleradores compatíveis com cada versão de TPU, acesse Versões de TPU.
    version
    A versão do ambiente de execução do Cloud TPU. Um padrão é mostrado na variável exportada, mas você também pode usar um da lista de configurações compatíveis.
  2. Iniciar os recursos da TPU

    $ gcloud compute tpus tpu-vm create ${TPU_NAME} \
    --zone us-central2-b \
    --accelerator-type ${ACCELERATOR_TYPE} \
    --version ${RUNTIME_VERSION} \
    --project $PROJECT_ID \
    --subnetwork=tpusubnet
    
  3. Mova o código para o diretório principal na VM da TPU usando o comando gcloud scp. Exemplo:

    $ gcloud compute tpus tpu-vm scp my-code-file ${TPU_NAME}: --zone ${ZONE}
    

Criação de perfil

Um perfil pode ser capturado manualmente por meio de capture_profile.py ou de forma programática no script de treinamento usando as APIs torch_xla.debug.profiler.

Como iniciar o servidor de perfil

Para capturar um perfil, um servidor de perfis precisa estar em execução no script de treinamento. Inicie um servidor com um número de porta de sua escolha, por exemplo, 9012, conforme mostrado no comando a seguir.

import torch_xla.debug.profiler as xp
server = xp.start_server(9012)

O servidor pode ser iniciado no início da função main.

Agora é possível capturar perfis conforme descrito na seção a seguir. O script cria perfis de tudo o que acontece em um dispositivo TPU.

Como adicionar traces

Se você também quiser criar o perfil de operações na máquina host, adicione xp.StepTrace ou xp.Trace ao código. Essas funções rastreiam o código Python na máquina host. Pense nisso como a medição de quanto tempo leva para executar o código Python no host (CPU) antes de passar o "gráfico" para o dispositivo TPU. Por isso, ele é mais útil para analisar a sobrecarga de rastreamento. É possível adicioná-lo ao loop de treinamento em que o código processa lotes de dados, por exemplo,

for step, batch in enumerate(train_dataloader):
    with xp.StepTrace('Training_step', step_num=step): 
       ...

ou envolver partes individuais do código

 with xp.Trace('loss'): 
    loss = ...

Se você estiver usando o Lighting, poderá pular a adição de rastros, já que isso é feito automaticamente em algumas partes do código. No entanto, se quiser adicionar outros traces, insira-os dentro do loop de treinamento.

Você poderá capturar a atividade do dispositivo após a compilação inicial. Aguarde até que o modelo inicie as etapas de treinamento ou inferência.

Captura manual

O script capture_profile.py do repositório Pytorch XLA permite a captura rápida de um perfil. Para fazer isso, copie o arquivo de perfil de captura diretamente para a VM da TPU. O comando a seguir o copia para o diretório principal.

$ gcloud compute tpus tpu-vm ssh ${TPU_NAME} \
--zone us-central2-b \
--worker=all \
--command="wget https://raw.githubusercontent.com/pytorch/xla/master/scripts/capture_profile.py"

Durante o treinamento, execute o seguinte comando para capturar um perfil:

$ gcloud compute tpus tpu-vm ssh ${TPU_NAME} \
--zone us-central2-b \
--worker=all \
--command="python3 capture_profile.py --service_addr "localhost:9012" --logdir ~/profiles/ --duration_ms 2000"

Esse comando salva arquivos .xplane.pb no logdir. É possível alterar o diretório de geração de registros ~/profiles/ para seu local e nome preferidos. Também é possível salvar diretamente no bucket do Cloud Storage. Para isso, defina logdir como gs://your_bucket_name/.

Captura programática

Em vez de capturar o perfil manualmente acionando um script, é possível configurá-lo para acionar automaticamente um perfil usando a API torch_xla.debug.profiler.trace_detached no seu script de treinamento.

Por exemplo, para capturar automaticamente um perfil em uma época e etapa específicas, configure seu script de treinamento para consumir as variáveis de ambiente PROFILE_STEP, PROFILE_EPOCH e PROFILE_LOGDIR:

import os
import torch_xla.debug.profiler as xp

# Within the training script, read the step and epoch to profile from the
# environment.
profile_step = int(os.environ.get('PROFILE_STEP', -1))
profile_epoch = int(os.environ.get('PROFILE_EPOCH', -1))
...

for epoch in range(num_epoch):
   ...
   for step, data in enumerate(epoch_dataloader):
      if epoch == profile_epoch and step == profile_step:
         profile_logdir = os.environ['PROFILE_LOGDIR']
         # Use trace_detached to capture the profile from a background thread
         xp.trace_detached('localhost:9012', profile_logdir)
      ...

Isso salvará os arquivos .xplane.pb no diretório especificado pela variável de ambiente PROFILE_LOGDIR.

Análise no TensorBoard

Para analisar melhor os perfis, use o TensorBoard com o plug-in do TensorBoard da TPU
, na mesma máquina ou em outra máquina (recomendado).

Para executar o TensorBoard em uma máquina remota, conecte-se a ela usando SSH e ative o encaminhamento de portas. Por exemplo:

$ ssh -L 6006:localhost:6006 remote server address

ou

$ gcloud compute tpus tpu-vm ssh $TPU_NAME --zone=$ZONE --ssh-flag="-4 -L 6006:localhost:6006"

Na máquina remota, instale os pacotes necessários e inicie o TensorBoard (supondo que você tenha perfis nessa máquina em ~/profiles/). Se você armazenou os perfis em outro diretório ou bucket do Cloud Storage, especifique os caminhos corretamente, por exemplo, gs://your_bucket_name/profiles.

(vm)$ pip install tensorflow-cpu tensorboard-plugin-profile 
(vm)$ tensorboard --logdir ~/profiles/ --port 6006
(vm)$ pip uninstall tensorflow tf-nightly tensorboard tb-nightly tbp-nightly

Como executar o TensorBoard

No navegador local, acesse: http://localhost:6006/ e escolha PROFILE no menu suspenso para carregar seus perfis.

Consulte Ferramentas de TPU para ver mais informações sobre as ferramentas do TensorBoard e como interpretar a saída.

imagem

imagem