Como usar GPUs para treinar modelos na nuvem

As unidades de processamento de gráfico (GPUs, na sigla em inglês) aceleram significativamente o processo de treinamento para muitos modelos de aprendizado profundo. Modelos de treinamento para tarefas como classificação de imagem, análise de vídeo e processamento de linguagem natural envolvem multiplicação de matriz com uso intensivo de computação e outras operações que podem aproveitar a arquitetura massivamente paralela de uma GPU.

Leva dias para executar um treinamento de modelo de aprendizado profundo que envolve tarefas de computação intensivas em conjuntos de dados extremamente grandes em um único processador. No entanto, projetar o programa para descarregar essas tarefas em uma ou mais GPUs reduz o tempo de treinamento para horas, em vez de dias.

Antes de começar

O AI Platform permite que você execute qualquer aplicativo de treinamento do TensorFlow em uma máquina ativada para GPU. Para garantir que seu aplicativo faça uso das GPUs disponíveis, leia o guia do TensorFlow para usar as GPUs (em inglês) e a seção abaixo sobre como atribuir operações a GPUs.

Alguns modelos não são beneficiados com a execução em GPUs. Recomendamos GPUs para modelos grandes e complexos com muitas operações matemáticas. Mesmo assim, é aconselhável testar o benefício da compatibilidade de GPU executando uma pequena amostra dos dados por meio de treinamento.

Como solicitar máquinas ativadas para GPU

Para utilizar GPUs na nuvem, configure seu job de treinamento para acessar máquinas ativadas para GPU de uma destas três maneiras: usando o nível de escalonamento BASIC_GPU, usando tipos de máquina do AI Platform ativados para GPU ou usando tipos de máquina do Compute Engine e anexando as GPUs.

Máquina ativada para GPU básica

Se você estiver aprendendo como usar o AI Platform ou testando máquinas ativadas para GPU, poderá definir o nível de escalonamento como BASIC_GPU para ter uma única instância de worker com uma única GPU NVIDIA Tesla K80.

Tipos de máquina com GPUs incluídas

Para personalizar o uso da sua GPU, configure o job de treinamento com os tipos de máquina habilitados para GPU:

  • Defina o nível de escala como CUSTOM.
  • Configure cada tipo de worker (mestre, worker ou servidor de parâmetros) para usar um dos tipos de máquina habilitados para GPU abaixo, com base no número de GPUs e no tipo de acelerador necessário para sua tarefa:
    • standard_gpu: uma única GPU NVIDIA Tesla K80
    • complex_model_m_gpu: quatro GPUs NVIDIA Tesla K80
    • complex_model_l_gpu: oito GPUs NVIDIA Tesla K80
    • standard_p100: uma única GPU NVIDIA Tesla P100
    • complex_model_m_p100: quatro GPUs NVIDIA Tesla P100
    • standard_v100: uma única GPU NVIDIA Tesla V100
    • large_model_v100: uma única GPU NVIDIA Tesla V100
    • complex_model_m_v100: quatro GPUs NVIDIA Tesla V100
    • complex_model_l_v100: oito GPUs NVIDIA Tesla V100

Veja abaixo um exemplo de envio de job com tipos de máquina ativados para GPU usando o comando gcloud.

Veja mais informações sobre Como comparar tipos de máquinas.

Tipos de máquina do Compute Engine com anexos de GPU

Como alternativa, se você configurar seu job de treinamento com os tipos de máquina do Compute Engine, que não incluem GPUs por padrão, poderá anexar um número personalizado de GPUs para acelerar seu job:

  • Defina o nível de escala como CUSTOM.
  • Configure cada tipo de worker (mestre, worker ou servidor de parâmetros) para usar um tipo de máquina do Compute Engine que seja válido.
  • Adicione um campo acceleratorConfig com o tipo e o número de GPUs escolhido (masterConfig, workerConfig ou parameterServerConfig), dependendo de quais máquinas virtuais você quer acelerar. Também é possível usar os seguintes tipos de GPU:
    • NVIDIA_TESLA_K80
    • NVIDIA_TESLA_P4 (Beta)
    • NVIDIA_TESLA_P100
    • NVIDIA_TESLA_T4 (Beta)
    • NVIDIA_TESLA_V100

Para criar um acceleratorConfig válido, é preciso considerar várias restrições:

  1. Só é possível usar determinados números de GPUs na configuração. Por exemplo, é possível anexar 2 ou 4 NVIDIA Tesla K80s, mas não 3. Para ver quais contagens são válidas para cada tipo de GPU, consulte a tabela de compatibilidade abaixo.

  2. É preciso garantir que cada uma das configurações de GPU forneça CPUs virtuais e memória suficientes para o tipo de máquina ao qual você as anexa. Por exemplo, se você usar n1-standard-32 para seus workers, cada worker terá 32 CPUs virtuais e 120 GB de memória. Como cada NVIDIA Tesla V100 pode fornecer até 8 CPUs virtuais e 52 GB de memória, é preciso anexar pelo menos 4 a cada worker n1-standard-32 para atender aos seus requisitos.

    Analise a tabela de especificações do tipo de máquina e a comparação entre GPUs para cargas de trabalho de computação para determinar essas compatibilidades ou consulte a tabela de compatibilidade abaixo.

    Observe as seguintes limitações extras nos recursos de GPU para o AI Platform em casos específicos:

    • Uma configuração com 8 GPUs NVIDIA Tesla K80 fornece até 208 GB de memória em todas as regiões e zonas.
    • Uma configuração com 4 GPUs NVIDIA Tesla P100 permite até 64 CPUs virtuais e até 208 GB de memória em todas as regiões e zonas.
  3. É preciso enviar seu trabalho de treinamento para uma região compatível com sua configuração de GPU. Leia sobre a compatibilidade com regiões abaixo.

A tabela a seguir apresenta uma referência rápida de quantos tipos de acelerador é possível anexar a cada tipo de máquina do Compute Engine:

Números válidos de GPUs para cada tipo de máquina
Tipo de máquina NVIDIA Tesla K80 NVIDIA Tesla P4 (Beta) NVIDIA Tesla P100 NVIDIA Telsa T4 (Beta) NVIDIA Tesla V100
n1-standard-4 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-standard-8 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-standard-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-standard-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-standard-64 4 4 8
n1-standard-96 4 4 8
n1-highmem-2 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-4 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-8 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-highmem-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-highmem-64 4 4 8
n1-highmem-96 4 4 8
n1-highcpu-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-highcpu-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-highcpu-64 8 4 4 4 8
n1-highcpu-96 4 4 8

Veja abaixo um exemplo de envio de job usando os tipos de máquina do Compute Engine com as GPUs anexadas.

Regiões compatíveis com GPUs

É necessário executar seu trabalho em uma região compatível com GPUs. No momento, as regiões que permitem acesso são:

  • us-east1
  • us-central1
  • us-west1
  • asia-east1
  • europe-west1
  • europe-west4

Além disso, algumas dessas regiões oferecem acesso somente a determinados tipos de GPUs. Para entender completamente as regiões disponíveis para serviços do AI Platform, incluindo treinamento de modelos e predição on-line/em lote, leia o guia para regiões.

Caso seu job de treinamento use vários tipos de GPU, todos eles precisam estar disponíveis em uma única zona na região. Por exemplo, não é possível executar um job em us-central1 com um worker mestre usando GPUs NVIDIA Tesla V100, servidores de parâmetros usando GPUs NVIDIA Tesla K80 e workers usando GPUs NVIDIA Tesla P100. Todas essas GPUs estão disponíveis para jobs de treinamento em us-central1, mas nenhuma zona única nessa região fornece todos os três tipos de GPU. Para saber mais sobre a disponibilidade de zonas de GPUs, confira a comparação entre GPUs para cargas de trabalho de computação.

Enviar o job de treinamento

É possível enviar o job de treinamento usando o comando gcloud ai-platform jobs submit training.

  1. Defina um arquivo config.yaml que descreve as opções de GPU desejadas. A estrutura do arquivo YAML representa o recurso Job. Veja abaixo dois exemplos de arquivo config.yaml.

    O primeiro exemplo mostra um arquivo de configuração para um job de treinamento que usa tipos de máquina do AI Platform, sendo que alguns deles incluem GPUs:

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: complex_model_m_gpu
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: complex_model_m_gpu
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: large_model
    

    O próximo exemplo mostra um arquivo de configuração para um job com uma configuração semelhante à mostrada acima. No entanto, essa configuração usa tipos de máquina do Compute Engine com GPUs anexadas. Esse tipo de configuração está em Beta:

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: n1-highcpu-16
      masterConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: n1-highcpu-16
      workerConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: n1-highmem-8
    
  2. Use o comando gcloud para enviar o job, incluindo um argumento --config que indica o arquivo config.yaml. No exemplo a seguir, você precisa configurar as variáveis de ambiente para os valores de alguns argumentos. Elas são indicadas pelo sinal $ seguido de letras maiúsculas:

    gcloud ai-platform jobs submit training $JOB_NAME \
            --package-path $APP_PACKAGE_PATH \
            --module-name $MAIN_APP_MODULE \
            --job-dir $JOB_DIR \
            --region us-central1 \
            --config config.yaml \
            -- \
            --user_arg_1 value_1 \
             ...
            --user_arg_n value_n
    

Como alternativa, se você instalar o componente gcloud beta, poderá especificar detalhes de configuração de cluster com sinalizadores de linha de comando em vez de em um arquivo de configuração. Saiba mais sobre como usar esses sinalizadores (em inglês). Para instalar ou atualizar o componente gcloud beta, execute o gcloud components install beta.

O exemplo a seguir mostra como enviar um job com a mesma configuração do exemplo anterior (usando tipos de máquina do Compute Engine com GPUs anexadas), mas sem usar um arquivo config.yaml:

gcloud beta ai-platform jobs submit training $JOB_NAME \
        --package-path $APP_PACKAGE_PATH \
        --module-name $MAIN_APP_MODULE \
        --job-dir $JOB_DIR \
        --region us-central1 \
        --scale-tier custom \
        --master-machine-type n1-highcpu-16 \
        --master-accelerator count=4,type=nvidia-tesla-k80 \
        --worker-server-count 9 \
        --worker-machine-type n1-highcpu-16 \
        --worker-accelerator count=4,type=nvidia-tesla-k80 \
        --parameter-server-count 3 \
        --parameter-server-machine-type n1-highmem-8 \
        -- \
        --user_arg_1 value_1 \
         ...
        --user_arg_n value_n

Observações:

  • Se você especificar uma opção no arquivo de configuração (config.yaml) e como uma sinalização de linha de comando, o valor na linha de comando modificará o valor no arquivo de configuração.
  • A sinalização -- vazia marca o fim das sinalizações específicas gcloud e o início dos USER_ARGS que você quer passar para o aplicativo.
  • Sinalizações específicas do AI Platform, como --module-name, --runtime-version e --job-dir, precisam vir antes da sinalização -- vazia. O serviço do AI Platform interpreta essas sinalizações.
  • A sinalização --job-dir, se especificada, precisa vir antes da sinalização -- vazia, porque o AI Platform usa o --job-dir para validar o caminho.
  • Seu aplicativo também precisa gerenciar a sinalização --job-dir, se especificada. Mesmo que a sinalização venha antes da -- vazia, a --job-dir também é transmitida para o aplicativo como uma sinalização de linha de comando.
  • É possível definir quantos USER_ARGS forem necessários. O AI Platform passa --user_first_arg, --user_second_arg e assim por diante para o aplicativo.

Para mais detalhes sobre as opções de envio de jobs, consulte o guia sobre como iniciar um job de treinamento.

Como atribuir operações a GPUs

Para usar as GPUs em uma máquina, faça as alterações apropriadas no aplicativo de treinador do TensorFlow:

  • API Estimator de alto nível: não é necessário fazer alterações no código, desde que o ClusterSpec esteja configurado corretamente. Quando um cluster for uma mistura de CPUs e GPUs, mapeie o nome do job ps para as CPUs e o nome do job do worker para as GPUs.

  • API Core Tensorflow: você precisa atribuir operações para executar em máquinas ativadas para GPU. Este processo é o mesmo que usar GPUs localmente com o TensorFlow. Use tf.train.replica_device_setter para atribuir operações aos dispositivos.

Quando você atribui uma máquina ativada para GPU a um processo do AI Platform, esse processo tem acesso exclusivo às GPUs dessa máquina. Não é possível compartilhar as GPUs de uma única máquina no cluster entre vários processos. O processo corresponde à tarefa do TensorFlow distribuída na especificação do cluster. As especificações e tarefas do cluster são descritas na documentação do TensorFlow distribuída.

Strings do dispositivo da GPU

A única GPU da máquina standard_gpu é identificada como "/gpu:0". As máquinas com várias GPUs usam identificadores que começam em "/gpu:0", depois "/gpu:1" e assim por diante. Por exemplo, as máquinas complex_model_m_gpu contam com quatro GPUs identificadas como "/gpu:0" até "/gpu:3".

Pacotes Python em máquinas ativadas para GPU

As máquinas habilitadas para GPU vêm com o pacote Tensorflow Python compatível, tensorflow-gpu, pré instalado. Consulte a Lista de versões de tempo de execução do Cloud ML para ver todos os pacotes pré-instalados.

Eventos de manutenção

Se você usar GPUs nos seus jobs de treinamento, lembre-se de que as máquinas virtuais subjacentes estarão, ocasionalmente, sujeitas à manutenção do host do Compute Engine. As máquinas virtuais ativadas para GPU usadas no seus jobs de treinamento são configuradas para reiniciar automaticamente após esses eventos de manutenção. No entanto, você pode tomar medidas para garantir que sua tarefa seja resiliente aos desligamentos. Configure seu aplicativo de treinamento para salvar regularmente checkpoints de modelo (geralmente no caminho do Cloud Storage especificado por meio do argumento --job-dir para gcloud ai-platform jobs submit training) e restaurar o checkpoint mais recente.

Para implementar essa funcionalidade, use a API TensorFlow Estimator. Assim, caso seu modelo já esteja incorporado a um Estimator, você não precisa se preocupar com os eventos de manutenção nos trabalhos da GPU.

Se não for viável incorporar o modelo a um TensorFlow Estimator, e se quiser que os jobs de treinamento ativados para GPU sejam resilientes a eventos de manutenção, você mesmo precisa escrever manualmente a funcionalidade de restauração e salvamento do ponto de verificação no modelo. O TensorFlow fornece alguns recursos úteis para essa implementação no módulo tf.train, mais especificamente em tf.train.checkpoint_exists e tf.train.latest_checkpoint.

Próximas etapas

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

AI Platform para TensorFlow