Treinar um modelo de ML com contêineres personalizados
O AI Platform Training é compatível com treinamento em contêineres personalizados, permitindo que os usuários tragam os próprios contêineres do Docker com qualquer estrutura ou algoritmo de ML pré-instalados para serem executados no AI Platform Training. Neste tutorial, fornecemos uma explicação introdutória que mostra como treinar um modelo PyTorch no AI Platform Training com um contêiner personalizado.
Visão geral
Neste guia de primeiros passos, demonstramos o processo de treinamento com contêineres personalizados no AI Platform Training. Usamos um modelo básico que classifica dígitos por escrito com base no conjunto de dados MNIST (em inglês).
Abordamos as etapas a seguir:
- Configurar o projeto e o ambiente local
- Criar um contêiner personalizado
- Gravar um Dockerfile
- Criar e testar sua imagem do Docker localmente
- Enviar a imagem ao Container Registry
- Enviar um job de treinamento do contêiner personalizado.
- Enviar um job de ajuste de hiperparâmetro.
- Usar GPUs com um contêiner personalizado.
Antes de começar
Para este Guia explicativo, use qualquer ambiente em que a Google Cloud CLI esteja instalada.Opcional: consulte o conceito do treinamento com contêineres personalizados.
Conclua as etapas a seguir para configurar uma conta do GCP, ativar as APIs necessárias e instalar e ativar o SDK do Cloud.
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction, Compute Engine and Container Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction, Compute Engine and Container Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Instale o Docker (em inglês).
Se você estiver usando um sistema operacional baseado em Linux, como Ubuntu ou Debian, adicione seu nome de usuário ao grupo
docker
para executar o Docker sem usarsudo
:sudo usermod -a -G docker ${USER}
Talvez seja necessário reiniciar o sistema depois de adicionar você mesmo ao grupo
docker
. - Abra o Docker. Para garantir que ele esteja funcionando, execute o comando a seguir, que retorna a hora e a data atuais:
docker run busybox date
- Use o
gcloud
como auxiliar de credencial do Docker:gcloud auth configure-docker
- Opcional: se você quer executar o contêiner por meio da GPU no local, instale o
nvidia-docker
(em inglês).
Configurar o bucket do Cloud Storage
Nesta seção, você aprende a criar um novo bucket. É possível usar um bucket atual, mas ele precisa estar na mesma região em que você planeja executar os jobs do AI Platform. Além disso, se ele não fizer parte do projeto que você está usando para executar o AI Platform Training, conceda acesso explícito às contas de serviço do AI Platform Training.
-
Especifique um nome para o novo bucket. Ele precisa ser único em todos os buckets no Cloud Storage.
BUCKET_NAME="YOUR_BUCKET_NAME"
Por exemplo, use o nome do seu projeto com
-aiplatform
anexado:PROJECT_ID=$(gcloud config list project --format "value(core.project)") BUCKET_NAME=${PROJECT_ID}-aiplatform
-
Verifique o nome do bucket que você criou.
echo $BUCKET_NAME
-
Selecione a região do bucket e defina a variável de ambiente
REGION
.Use a mesma região em que você planeja executar jobs do AI Platform Training. Veja as regiões disponíveis para os serviços do AI Platform Training.
Por exemplo, o código a seguir cria
REGION
e a define comous-central1
:REGION=us-central1
-
Crie o novo bucket:
gcloud storage buckets create gs://$BUCKET_NAME --location=$REGION
Fazer o download do código para este tutorial
Digite o seguinte comando para fazer o download do arquivo zip de amostra do AI Platform Training:
wget https://github.com/GoogleCloudPlatform/cloudml-samples/archive/master.zip
Descompacte o arquivo para extrair o diretório
cloudml-samples-master
.unzip master.zip
Navegue até o diretório
cloudml-samples-master > pytorch > containers > quickstart > mnist
. Os comandos neste tutorial precisam ser executados no diretóriomnist
.cd cloudml-samples-master/pytorch/containers/quickstart/mnist
Criar um contêiner personalizado
Para criar um contêiner personalizado, a primeira etapa é definir um Dockerfile para instalar as dependências necessárias para o job de treinamento. Em seguida, você cria e testa a imagem do Docker localmente para verificá-la antes de usá-la com o AI Platform Training.
Gravar um Dockerfile
O Dockerfile de amostra neste tutorial realiza as seguintes etapas:
- Usa uma imagem de base do Python 2.7 com dependências integradas.
- Instala outras dependências, incluindo PyTorch, CLI gcloud e
cloudml-hypertune
(em inglês) para fazer ajuste de hiperparâmetro. - Copia o código do aplicativo de treinamento para o contêiner.
- Configura o ponto de entrada do AI Platform Training para executar seu código de treinamento quando o contêiner estiver sendo iniciado.
O Dockerfile pode incluir outras lógicas, dependendo das suas necessidades. Saiba mais sobre Como gravar Dockerfiles.
Criar e testar sua imagem do Docker localmente
Crie o URI de imagem correto usando variáveis de ambiente. Em seguida, crie a imagem do Docker. A sinalização
-t
nomeia e marca a imagem com suas opções paraIMAGE_REPO_NAME
eIMAGE_TAG
. É possível escolher um nome e uma tag diferentes para a imagem.export PROJECT_ID=$(gcloud config list project --format "value(core.project)") export IMAGE_REPO_NAME=mnist_pytorch_custom_container export IMAGE_TAG=mnist_pytorch_cpu export IMAGE_URI=gcr.io/$PROJECT_ID/$IMAGE_REPO_NAME:$IMAGE_TAG docker build -f Dockerfile -t $IMAGE_URI ./
Execute a imagem no local para verificá-la em um novo contêiner. A sinalização
--epochs
é transmitida para o script do treinador.docker run $IMAGE_URI --epochs 1
Enviar a imagem ao Container Registry
Se a execução local funcionar, envie a imagem do Docker para o Container Registry no projeto.
Primeiro, execute gcloud auth configure-docker
, se ainda não tiver feito isso.
docker push $IMAGE_URI
Enviar e monitorar o job
Defina variáveis de ambiente para a solicitação do job.
MODEL_DIR
nomeia um novo diretório com carimbo de data/hora dentro do bucket do Cloud Storage em que o arquivo de modelo salvo é armazenado depois do treinamento.REGION
especifica uma região válida para o treinamento do AI Platform Training.
export MODEL_DIR=pytorch_model_$(date +%Y%m%d_%H%M%S) export REGION=us-central1 export JOB_NAME=custom_container_job_$(date +%Y%m%d_%H%M%S)
Use a CLI gcloud para enviar o job de treinamento ao AI Platform Training. Transmita o URI para a imagem do Docker usando a sinalização
--master-image-uri
:gcloud ai-platform jobs submit training $JOB_NAME \ --region $REGION \ --master-image-uri $IMAGE_URI \ -- \ --model-dir=gs://$BUCKET_NAME/$MODEL_DIR \ --epochs=10
Depois de enviar o job, monitore o status dele e os registros de stream:
gcloud ai-platform jobs describe $JOB_NAME gcloud ai-platform jobs stream-logs $JOB_NAME
Enviar um job de ajuste de hiperparâmetro
Você precisa fazer algumas modificações em um job de ajuste de hiperparâmetro. Observe essas áreas no código de amostra:
- A amostra do Dockerfile inclui o pacote
cloudml-hypertune
(em inglês) para instalá-lo no contêiner personalizado. - Código de amostra (
mnist.py
):- Usa
cloudml-hypertune
para relatar os resultados de cada avaliação chamando a função auxiliarreport_hyperparameter_tuning_metric
. Isso não acontecerá se o job não for enviado como um job de ajuste de hiperparâmetro; - Inclui argumentos de linha de comando para cada hiperparâmetro e processa a análise dos argumentos com
argparse
(em inglês).
- Usa
- A solicitação de job inclui
HyperparameterSpec
no objetoTrainingInput
. Nesse caso, ajustamos--lr
e--momentum
para minimizar a perda do modelo.
Crie um arquivo
config.yaml
para definir a especificação do hiperparâmetro. RedefinaMODEL_DIR
eJOB_NAME
. DefinaREGION
caso ainda não tenha feito isso:export MODEL_DIR=pytorch_hptuning_model_$(date +%Y%m%d_%H%M%S) export REGION=us-central1 export JOB_NAME=custom_container_job_hptuning_$(date +%Y%m%d_%H%M%S) # Creates a YAML file with job request. cat > config.yaml <<EOF trainingInput: hyperparameters: goal: MINIMIZE hyperparameterMetricTag: "my_loss" maxTrials: 20 maxParallelTrials: 5 enableTrialEarlyStopping: True params: - parameterName: lr type: DOUBLE minValue: 0.0001 maxValue: 0.1 - parameterName: momentum type: DOUBLE minValue: 0.2 maxValue: 0.8 EOF
Envie o job de ajuste de hiperparâmetros para o AI Platform Training:
gcloud ai-platform jobs submit training $JOB_NAME \ --scale-tier BASIC \ --region $REGION \ --master-image-uri $IMAGE_URI \ --config config.yaml \ -- \ --epochs=5 \ --model-dir="gs://$BUCKET_NAME/$MODEL_DIR"
Como usar GPUs com contêineres personalizados
Para enviar um job de contêiner personalizado usando GPUs, você precisa criar uma imagem do Docker diferente daquela usada anteriormente. Fornecemos um exemplo de Dockerfile para usar com GPUs que atende aos seguintes requisitos:
- Pré-instale o kit de ferramentas CUDA e cuDNN no contêiner. Usar a imagem nvidia/cuda como a imagem base é a maneira recomendada de lidar com esse processo. Isso acontece porque ela inclui o kit de ferramentas CUDA e cuDNN pré-instalados e ajuda na configuração correta das variáveis de ambiente relacionadas.
- Instale outras dependências, como
wget
,curl
,pip
e outras necessárias ao aplicativo de treinamento.
Crie e teste a imagem do Docker da GPU no local
Crie uma nova imagem do job de treinamento de GPU usando o Dockerfile da GPU. Para evitar a modificação da imagem da CPU, você precisa redefinir
IMAGE_REPO_NAME
eIMAGE_TAG
com nomes diferentes dos usados anteriormente no tutorial.export PROJECT_ID=$(gcloud config list project --format "value(core.project)") export IMAGE_REPO_NAME=mnist_pytorch_gpu_container export IMAGE_TAG=mnist_pytorch_gpu export IMAGE_URI=gcr.io/$PROJECT_ID/$IMAGE_REPO_NAME:$IMAGE_TAG docker build -f Dockerfile-gpu -t $IMAGE_URI ./
Se você tiver GPUs disponíveis na máquina e instalou o
nvidia-docker
(em inglês), execute a imagem localmente para verificá-la:docker run --runtime=nvidia $IMAGE_URI --epochs 1
Envie a imagem do Docker para o Container Registry. Primeiro, execute
gcloud auth configure-docker
, se ainda não tiver feito isso.docker push $IMAGE_URI
Enviar o job
Neste exemplo, usamos o nível de escalonamento básico da GPU para enviar a solicitação do job de treinamento. Consulte outras opções de máquina para ver o treinamento com GPUs.
Redefina
MODEL_DIR
eJOB_NAME
. ConfigureREGION
se ainda não tiver feito isso:export MODEL_DIR=pytorch_model_gpu_$(date +%Y%m%d_%H%M%S) export REGION=us-central1 export JOB_NAME=custom_container_job_gpu_$(date +%Y%m%d_%H%M%S)
Use a CLI gcloud para enviar o job de treinamento ao AI Platform Training. Transmita o URI para a imagem do Docker usando a sinalização
--master-image-uri
gcloud ai-platform jobs submit training $JOB_NAME \ --scale-tier BASIC_GPU \ --region $REGION \ --master-image-uri $IMAGE_URI \ -- \ --epochs=5 \ --model-dir=gs://$BUCKET_NAME/$MODEL_DIR
A seguir
- Saiba mais sobre os conceitos envolvidos no uso de contêineres.
- Saiba mais sobre o treinamento distribuído com contêineres personalizados.