Treinar um modelo de ML com o PyTorch

Neste tutorial, descrevemos como executar um job de treinamento que usa o framework de machine learning PyTorch. O tutorial que a configuração do job para usar o PyTorch é um pouco diferente do uso de outros frameworks de ML compatíveis com o AI Platform Training. Em seguida, ele mostra como executar um job de treinamento usando o código de amostra do PyTorch que treina um modelo com base nos dados do conjunto de dados de corridas de táxi de Chicago (em inglês).

O tutorial também mostra como usar o PyTorch com GPUs e com ajuste de hiperparâmetro.

Contêineres do PyTorch

As versões de ambiente de execução do AI Platform Training não incluem o PyTorch como dependência. Em vez disso, para executar um job de treinamento que usa o PyTorch, especifique um contêiner pré-criado do PyTorch para o AI Platform Training usar.

A configuração de um contêiner pré-criado para treinamento usa algumas das mesmas sintaxes que a configuração de um contêiner personalizado. No entanto, você não precisa criar seu próprio contêiner do Docker. Em vez disso, especifique o URI de uma imagem de contêiner fornecida pelo AI Platform e forneça um pacote de treinamento em Python criado.

O AI Platform fornece os seguintes contêineres PyTorch pré-criados:

URI da imagem do contêiner Versão PyTorch Processadores compatíveis
gcr.io/cloud-ml-public/training/pytorch-xla.1-11 1.11 CPU e TPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-11 1.11 GPU
gcr.io/cloud-ml-public/training/pytorch-xla.1-10 1.10 CPU e TPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-10 1.10 GPU
gcr.io/cloud-ml-public/training/pytorch-xla.1-9 1.9 CPU e TPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-9 1.9 GPU
gcr.io/cloud-ml-public/training/pytorch-xla.1-7 1,7 CPU e TPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-7 1,7 GPU
gcr.io/cloud-ml-public/training/pytorch-xla.1-6 1.6 CPU e TPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-6 1.6 GPU
gcr.io/cloud-ml-public/training/pytorch-cpu.1-4 1.4 CPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-4 1.4 GPU

Essas imagens de contêiner são derivadas dos Deep Learning Containers e incluem as dependências fornecidas pelos Deep Learning Containers.

Se você quiser usar uma versão do PyTorch não disponível em um dos contêineres pré-criados, siga o guia para usar um contêiner personalizado.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the AI Platform Training & Prediction API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

Como fazer o download da amostra codificada

Execute os comandos a seguir para fazer o download do aplicativo de treinamento de amostra PyTorch e acessar o diretório com o aplicativo de treinamento:

git clone --depth=1 \
  https://github.com/GoogleCloudPlatform/ai-platform-samples.git

cd ai-platform-samples/training/pytorch/structured/python_package

Como opção, inspecione a estrutura do código de treinamento:

ls -pR

O diretório trainer/ contém o aplicativo de treinamento PyTorch, e setup.py fornece detalhes de configuração para empacotar o aplicativo de treinamento.

Crie um bucket do Cloud Storage

Crie um bucket do Cloud Storage para armazenar o código de treinamento empacotado e os artefatos de modelo criados pelo job de treinamento. Execute este comando:

gcloud storage buckets create gs://BUCKET_NAME --location=us-central1

Substitua BUCKET_NAME por um nome exclusivo escolhido para o bucket. Saiba mais sobre os requisitos para nomes de bucket.

Como alternativa, use um bucket atual do Cloud Storage no seu projeto do Google Cloud. Para este tutorial, use um bucket na região us-central1.

Como treinar um modelo do PyTorch

Neste tutorial, mostramos várias maneiras de treinar um modelo do PyTorch no AI Platform Training:

  • Em uma instância de máquina virtual (VM) com um processador de CPU
  • Em uma VM com um processador GPU
  • Como usar o ajuste de hiperparâmetros (em uma VM com um processador de CPU)

Escolha uma destas opções agora e siga as instruções nas guias correspondentes para o restante deste tutorial. Repita essa seção se quiser tentar treinar com uma das outras configurações.

Como se preparar para criar um job de treinamento

Antes de criar um job de treinamento, verifique se o código de treinamento está pronto e especifique algumas opções de configuração no ambiente local.

CPU

Defina diversas variáveis do Bash a serem usadas ao criar o job de treinamento:

BUCKET_NAME=BUCKET_NAME
JOB_NAME=getting_started_pytorch_cpu
JOB_DIR=gs://${BUCKET_NAME}/${JOB_NAME}/models

Substitua BUCKET_NAME pelo nome do bucket do Cloud Storage criado em uma seção anterior.

GPU

  1. Verifique se o código de treinamento do PyTorch reconhece a GPU na VM que o job de treinamento usa, para que o PyTorch mova corretamente os tensores e módulos para a GPU.

    Se você usar a amostra codificada fornecida, não precisará fazer nada, porque ela contém lógica para detectar se a máquina que executa o código tem uma GPU:

    cuda_availability = torch.cuda.is_available()
    if cuda_availability:
      device = torch.device('cuda:{}'.format(torch.cuda.current_device()))
    else:
      device = 'cpu'

    Se você alterar o código de treinamento, leia o guia do PyTorch sobre semânticas CUDA para garantir que a GPU seja usada.

  2. Defina diversas variáveis do Bash a serem usadas ao criar o job de treinamento:

    BUCKET_NAME=BUCKET_NAME
    JOB_NAME=getting_started_pytorch_gpu
    JOB_DIR=gs://${BUCKET_NAME}/${JOB_NAME}/models
    

    Substitua BUCKET_NAME pelo nome do bucket do Cloud Storage criado em uma seção anterior.

Ajuste de hiperparâmetros

A amostra codificada deste tutorial ajusta a taxa de aprendizado e os parâmetros de tamanho do lote para minimizar a perda de teste.

  1. Verifique se o código de treinamento está pronto para o ajuste de hiperparâmetro no AI Platform Training:

  2. Execute o comando a seguir para criar um arquivo config.yaml que especifica opções de ajuste de hiperparâmetro:

    cat > config.yaml <<END
    trainingInput:
      hyperparameters:
        goal: MINIMIZE
        hyperparameterMetricTag: test_loss
        maxTrials: 2
        maxParallelTrials: 2
        enableTrialEarlyStopping: True
        params:
        - parameterName: learning-rate
          type: DOUBLE
          minValue: 0.0001
          maxValue: 1
          scaleType: UNIT_LOG_SCALE
        - parameterName: batch-size
          type: INTEGER
          minValue: 1
          maxValue: 256
          scaleType: UNIT_LINEAR_SCALE
    END
    

    Essas opções ajustam os hiperparâmetros --learning-rate e --batch-size para minimizar a perda do modelo.

  3. Defina diversas variáveis do Bash a serem usadas ao criar o job de treinamento:

    BUCKET_NAME=BUCKET_NAME
    JOB_NAME=getting_started_pytorch_hptuning
    JOB_DIR=gs://${BUCKET_NAME}/${JOB_NAME}/models
    

    Substitua BUCKET_NAME pelo nome do bucket do Cloud Storage criado em uma seção anterior.

Essas variáveis do Bash têm as seguintes finalidades:

  • JOB_NAME é um identificador do job do AI Platform Training. Ele precisa ser exclusivo entre os jobs do AI Platform Training no projeto do Google Cloud.
  • JOB_DIR é usado pelo AI Platform Training para determinar exatamente onde fazer o upload do aplicativo de treinamento. O aplicativo de treinamento também usa o JOB_DIR para determinar onde exportar artefatos de modelo quando terminar o treinamento.

Como criar um job de treinamento

Execute o seguinte comando para criar um job de treinamento:

CPU

gcloud ai-platform jobs submit training ${JOB_NAME} \
  --region=us-central1 \
  --master-image-uri=gcr.io/cloud-ml-public/training/pytorch-xla.1-10 \
  --scale-tier=BASIC \
  --job-dir=${JOB_DIR} \
  --package-path=./trainer \
  --module-name=trainer.task \
  -- \
  --train-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_train.csv \
  --eval-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_eval.csv \
  --num-epochs=10 \
  --batch-size=100 \
  --learning-rate=0.001

GPU

gcloud ai-platform jobs submit training ${JOB_NAME} \
  --region=us-central1 \
  --master-image-uri=gcr.io/cloud-ml-public/training/pytorch-gpu.1-10 \
  --scale-tier=CUSTOM \
  --master-machine-type=n1-standard-8 \
  --master-accelerator=type=nvidia-tesla-p100,count=1 \
  --job-dir=${JOB_DIR} \
  --package-path=./trainer \
  --module-name=trainer.task \
  -- \
  --train-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_train.csv \
  --eval-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_eval.csv \
  --num-epochs=10 \
  --batch-size=100 \
  --learning-rate=0.001

Ajuste de hiperparâmetros

gcloud ai-platform jobs submit training ${JOB_NAME} \
  --region=us-central1 \
  --master-image-uri=gcr.io/cloud-ml-public/training/pytorch-xla.1-10 \
  --scale-tier=BASIC \
  --job-dir=${JOB_DIR} \
  --package-path=./trainer \
  --module-name=trainer.task \
  --config=config.yaml \
  -- \
  --train-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_train.csv \
  --eval-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_eval.csv \
  --num-epochs=10

Leia o guia sobre jobs de treinamento para saber mais sobre as sinalizações de configuração e como usá-las para personalizar o treinamento.

O comando retorna uma mensagem semelhante à seguinte:

Job [JOB_NAME] submitted successfully.
Your job is still active. You may view the status of your job with the command

  $ gcloud ai-platform jobs describe JOB_NAME

or continue streaming the logs with the command

  $ gcloud ai-platform jobs stream-logs JOB_NAME
jobId: JOB_NAME
state: QUEUED

Use o comando a seguir para monitorar o status do job:

gcloud ai-platform jobs describe ${JOB_NAME}

É possível transmitir os registros de treinamento do job usando o seguinte comando:

gcloud ai-platform jobs stream-logs ${JOB_NAME}

Quando o job de treinamento é concluído, ele salva o modelo de ML treinado em um arquivo chamado model.pth em um diretório com carimbo de data/hora no diretório JOB_DIR especificado do Cloud Storage.

A seguir