Preparar código de treinamento

Realize o treinamento personalizado na Vertex AI para executar um código de treinamento de machine learning (ML) na nuvem, em vez de usar o AutoML. Neste documento, descrevemos as práticas recomendadas a serem consideradas quando você escreve o código de treinamento.

Escolher uma estrutura de código de treinamento

Primeiro, determine a estrutura que você quer que o código de treinamento de ML use. É possível fornecer o código de treinamento para a Vertex AI de uma das seguintes formas:

  • Um script Python para usar com um contêiner pré-criado. Use o SDK da Vertex AI para criar um job personalizado. Esse método permite que você forneça seu aplicativo de treinamento como um único script Python.

  • Um aplicativo de treinamento em Python para usar com um contêiner pré-criado. Crie uma distribuição de origem do Python (em inglês) com o código que treina um modelo de ML e o exporte para o Cloud Storage. Este aplicativo de treinamento pode usar qualquer uma das dependências incluídas no contêiner pré-criado que você pretende usar.

    Use essa opção se um dos contêineres pré-criados da Vertex AI para treinamento incluir todas as dependências necessárias para o treinamento. Essa provavelmente é a melhor opção ao realizar o treinamento com PyTorch, scikit-learn, TensorFlow ou XGBoost, por exemplo.

    Para saber mais sobre as práticas recomendadas específicas dessa opção, leia o guia sobre como criar um aplicativo de treinamento em Python.

  • Uma imagem de contêiner personalizada. Crie uma imagem de contêiner do Docker com um código que treine um modelo de ML e exporte-o para o Cloud Storage. Inclua as dependências necessárias para o código na imagem do contêiner.

    Use essa opção para usar dependências não incluídas em um dos contêineres pré-criados para treinamento da Vertex AI. Por exemplo, se você quiser treinar usando um framework de ML em Python que não esteja disponível em um contêiner pré-criado ou se quiser treinar usando uma linguagem de programação que não seja Python, essa vai ser a melhor opção.

    Para saber mais sobre as práticas recomendadas específicas dessa opção, leia o guia sobre como criar uma imagem de contêiner personalizada.

O restante deste documento descreve as práticas recomendadas relevantes para as duas estruturas de código de treinamento.

Práticas recomendadas para todos os códigos de treinamento personalizados

Ao escrever um código de treinamento personalizado para a Vertex AI, tenha em mente que o código será executado em uma ou mais instâncias de máquina virtual (VM) gerenciadas pelo Google Cloud. Esta seção descreve as práticas recomendadas aplicáveis a todos os códigos de treinamento personalizados.

Acessar os serviços do Google Cloud no seu código

Várias das seções a seguir descrevem como acessar outros serviços do Google Cloud pelo código. Para acessar os serviços do Google Cloud, faça o código de treinamento usar o Application Default Credentials (ADC). Muitas bibliotecas de cliente do Google Cloud autenticam com o ADC por padrão. Não é necessário configurar variáveis de ambiente. O Vertex AI configura automaticamente o ADC para se autenticar como o Agente de serviço de código personalizado do Vertex AI no projeto (por padrão) ou como uma conta de serviço personalizada (se você tiver configurado um).

.

No entanto, quando você usa uma biblioteca de cliente do Google Cloud no seu código, a Vertex AI nem sempre se conecta ao projeto correto do Google Cloud por padrão. Se você encontrar erros de permissão, a conexão com o projeto errado pode ser o problema.

Esse problema ocorre porque a Vertex AI não executa o código diretamente no projeto do Google Cloud. Ela executa o código em um dos vários projetos separados gerenciados pelo Google. A Vertex AI usa esses projetos exclusivamente para operações relacionadas ao seu projeto. Portanto, não tente inferir um ID do projeto do ambiente no código de treinamento ou previsão. especificar IDs de projetos explicitamente.

Se você não quiser fixar um ID do projeto no código de treinamento, consulte a variável de ambiente CLOUD_ML_PROJECT_ID: o Vertex AI define essa variável de ambiente em cada contêiner de treinamento personalizado para conter o número do projeto em que você iniciou o treinamento personalizado. Muitas ferramentas do Google Cloud aceitam um número de projeto sempre que recebem um ID do projeto.

Por exemplo, se você quiser acessar uma tabela do BigQuery no mesmo projeto usando o cliente Python para o Google BigQuery, não tente inferir o projeto no código de treinamento:

Seleção de projeto implícita

from google.cloud import bigquery

client = bigquery.Client()

Em vez disso, use um código que selecione explicitamente um projeto:

Seleção explícita do projeto

import os

from google.cloud import bigquery

project_number = os.environ["CLOUD_ML_PROJECT_ID"]

client = bigquery.Client(project=project_number)

Se você encontrar erros de permissão depois de configurar o código dessa maneira, leia a seguinte seção sobre quais recursos seu código pode acessar para ajustar as permissões disponíveis para seu código de treinamento.

Quais recursos seu código pode acessar

Por padrão, seu aplicativo de treinamento pode acessar todos os recursos do Google Cloud disponíveis para o agente de serviço de código personalizado (CCSA, na sigla em inglês) da Vertex AI do projeto. É possível conceder à CCSA e, portanto, ao aplicativo de treinamento acesso a um número limitado de outros recursos seguindo as instruções em Conceder aos agentes de serviço da Vertex AI acesso a outros recursos. Se o aplicativo de treinamento precisar de mais acesso de leitura aos recursos do Google Cloud não listados nessa página, será necessário adquirir um token de acesso do OAuth 2.0 com a https://www.googleapis.com/auth/cloud-platform, o que só pode ser feito usando uma conta de serviço personalizada.

Por exemplo, considere o acesso do seu código de treinamento aos recursos do Cloud Storage:

Por padrão, a Vertex AI pode acessar qualquer bucket do Cloud Storage no projeto do Google Cloud em que você está fazendo o treinamento personalizado. Também é possível conceder à Vertex AI acesso aos buckets do Cloud Storage em outros projetos ou personalizar com precisão quais buckets um job específico pode acessar usando uma conta de serviço personalizada.

Ler e gravar arquivos do Cloud Storage com o Cloud Storage FUSE

Em todos os jobs de treinamento personalizados, o Vertex AI monta os buckets do Cloud Storage aos quais você tem acesso no diretório /gcs/ do sistema de arquivos de cada nó de treinamento. Como alternativa conveniente ao uso do cliente Python para armazenamento em nuvem ou de outra biblioteca para acessar o Cloud Storage, é possível ler e gravar diretamente no sistema de arquivos local para ler dados do Cloud Storage ou gravar dados. para o Cloud Storage. Por exemplo, para carregar dados de gs://BUCKET/data.csv, use o seguinte código Python:

file = open('/gcs/BUCKET/data.csv', 'r')

O Vertex AI usa o Cloud Storage FUSE para montar os intervalos de armazenamento. Observe que diretórios ativados pelo Cloud Storage FUSE não são compatíveis com POSIX.

As credenciais que você está usando para o treinamento personalizado determinam quais intervalos podem ser acessados dessa maneira. A seção anterior sobre quais recursos seu código pode acessar descreve exatamente quais buckets podem ser acessados por padrão e como personalizar esse acesso.

Carregar dados de entrada

O código de ML geralmente opera em dados de treinamento para treinar um modelo. Não armazene dados de treinamento junto com seu código, independentemente de você criar um aplicativo de treinamento em Python ou uma imagem de contêiner personalizada. Armazenar dados com código pode levar a um projeto mal organizado, dificultar a reutilização do código em diferentes conjuntos de dados e causar erros em grandes conjuntos de dados.

É possível carregar dados de um conjunto de dados gerenciado da Vertex AI ou escrever seu próprio código para carregar dados de uma fonte fora da Vertex AI, como o BigQuery ou o Cloud Armazenamento

Para ter o melhor desempenho ao carregar dados do Cloud Storage, use um bucket na região em que você está realizando o treinamento personalizado. Para saber como armazenar dados no Cloud Storage, leia Como criar buckets de armazenamento e Como fazer upload de objetos.

Para saber de quais intervalos do Cloud Storage você pode carregar dados, leia a seção anterior sobre quais recursos seu código pode acessar.

Para carregar dados do Cloud Storage no código de treinamento, use o recurso FUSE do Cloud Storage descrito na seção anterior ou use qualquer biblioteca compatível com o ADC. Não é necessário fornecer explicitamente as credenciais de autenticação no código.

Por exemplo, é possível usar uma das bibliotecas de cliente demonstradas no guia do Cloud Storage para Fazer o download de objetos. O cliente Python para Cloud Storage, em particular, está incluído em contêineres pré-criados. A classe tf.io.gfile.GFile do TensorFlow também é compatível com o ADC.

Carregar um conjunto de dados grande

Dependendo do tipo de máquina que você pretende usar durante o treinamento personalizado, as VMs podem não conseguir carregar a totalidade de um conjunto de dados grande na memória.

Se você precisar ler dados muito grandes para caber na memória, faça streaming dos dados ou leia-os incrementalmente. Diferentes frameworks de ML têm práticas recomendadas diferentes para fazer isso. Por exemplo, a classe tf.data.Dataset do TensorFlow pode fazer streaming de dados TFRecord ou de texto do Cloud Storage.

A realização de treinamento personalizado em várias VMs com paralelismo de dados é outra maneira de reduzir a quantidade de dados que cada VM carrega na memória. Consulte a seção Como escrever código para treinamento distribuído deste documento.

Exportar um modelo de ML treinado

O código de ML geralmente exporta um modelo treinado no final do treinamento, na forma de um ou mais artefatos do modelo. Use os artefatos do modelo para receber predições.

Após a conclusão do treinamento personalizado, não será mais possível acessar as VMs que executaram o código de treinamento. Portanto, seu código de treinamento precisa exportar artefatos de modelo a um local fora da Vertex AI.

Recomendamos que você exporte artefatos de modelo para um bucket do Cloud Storage. Conforme descrito na seção anterior sobre quais recursos seu código pode acessar, a Vertex AI pode acessar qualquer bucket do Cloud Storage no projeto do Google Cloud em que você esteja realizando o treinamento personalizado. Usar uma biblioteca compatível com o ADC para exportar os artefatos do modelo. Por exemplo, as APIs do TensorFlow para salvar modelos da Keras podem exportar artefatos diretamente para um caminho do Cloud Storage.

Se você quiser usar um modelo treinado para exibir previsões na Vertex AI, o código precisará exportar os artefatos do modelo em um formato compatível com um dos contêineres pré-criados para previsão. Saiba mais no guia sobre como exportar artefatos de modelo para predição.

Variáveis de ambiente para diretórios especiais do Cloud Storage

Se você especificar o campo baseOutputDirectory da API, a Vertex AI define as seguintes variáveis de ambiente quando executar o código de treinamento:

Os valores dessas variáveis de ambiente diferem um pouco de acordo com o ajuste de hiperparâmetro. Para saber mais, consulte a referência da APIbaseOutputDirectory.

O uso dessas variáveis de ambiente facilita a reutilização do mesmo código de treinamento várias vezes, como dados ou opções de configuração diferentes, e salva os artefatos de modelo e pontos de verificação em diferentes locais, simplesmente alterando campo baseOutputDirectory da API. No entanto, não é obrigatório usar as variáveis de ambiente no seu código se você não quiser. Por exemplo, é possível fixar locais no código para salvar checkpoints e exportar artefatos de modelo.

Além disso, se você usar um TrainingPipeline para treinamentos personalizados e não especificar o campo modelToUpload.artifactUri, a Vertex AI usará o valor da variável de ambiente AIP_MODEL_DIR para modelToUpload.artifactUri. Para o ajuste de hiperparâmetros, a Vertex AI usa o valor da variável de ambiente AIP_MODEL_DIR da melhor avaliação.

Garanta a resiliência a reinicializações

As VMs que executam seu código de treinamento são reiniciadas de vez em quando. Por exemplo, o Google Cloud pode precisar reiniciar a VM por motivos de manutenção. Quando uma VM é reiniciada, a Vertex AI começa a executar o código novamente desde o início.

Se você espera que o código de treinamento seja executado por mais de quatro horas, adicione vários comportamentos ao código para torná-lo resiliente a reinicializações:

  • Exporte com frequência o progresso de treinamento para o Cloud Storage pelo menos uma vez a cada quatro horas. Assim, você não perderá o progresso se as VMs forem reiniciadas.

  • No início do código de treinamento, verifique se o andamento do treinamento já existe no local de exportação. Nesse caso, carregue o estado de treinamento salvo em vez de começar do treinamento do zero.

Quatro horas é uma recomendação, não um limite rígido. Se a resiliência for uma prioridade, considere adicionar esses comportamentos ao código, mesmo que você não espere que ele seja executado por tanto tempo.

A maneira de realizar esses comportamentos depende do framework de ML que você usa. Por exemplo, se você usa o Keras do TensorFlow, saiba como usar o callback ModelCheckpoint para esse fim.

Para saber mais sobre como a Vertex AI gerencia VMs, consulte Noções básicas sobre o serviço de treinamento personalizado.

Práticas recomendadas para recursos de treinamento personalizados opcionais

Se você quiser usar determinados recursos de treinamento personalizados opcionais, talvez precise fazer outras alterações no código de treinamento. Nesta seção, descrevemos as práticas recomendadas de código para ajuste de hiperparâmetros, GPUs, treinamento distribuído e TensorBoard da Vertex AI.

Escreva o código para ativar o registro automático

É possível ativar a auotologging usando o SDK da Vertex AI para Python para capturar automaticamente parâmetros e métricas de desempenho ao enviar o job personalizado. Para detalhes, consulte Executar o job de treinamento com o acompanhamento de experimentos.

Escreva o código para retornar registros de contêiner

Quando você grava registros do serviço ou job, eles são coletados automaticamente pelo Cloud Logging, desde que os registros sejam gravados em qualquer um dos seguintes locais:

Espera-se que a maioria dos desenvolvedores grave registros usando a saída e o erro padrão.

Os registros de contêiner gravados nesses locais compatíveis são automaticamente associados ao serviço, à revisão e ao local de treinamento personalizado da Vertex AI ou ao job de treinamento personalizado. As exceções contidas nos registros são capturadas e informadas no Error Reporting.

Usar texto simples ou JSON estruturado nos registros

Ao gravar registros, é possível enviar uma string de texto simples ou uma única linha de JSON serializado, também chamado de dados "estruturados". Ela é selecionada e analisada pelo Cloud Logging e colocada em jsonPayload. Por outro lado, a mensagem de texto simples é colocada em textPayload.

Gravar registros estruturados

É possível transmitir registros JSON estruturados de várias maneiras. As formas mais comuns são usando a biblioteca de geração de registros para Python ou transmitindo JSON bruto usando print.

Biblioteca de geração de registros do Python

import json
import logging
from pythonjsonlogger import jsonlogger

class CustomJsonFormatter(jsonlogger.JsonFormatter):
 """Formats log lines in JSON."""
  def process_log_record(self, log_record):
    """Modifies fields in the log_record to match Cloud Logging's expectations."""
    log_record['severity'] = log_record['levelname']
    log_record['timestampSeconds'] = int(log_record['created'])
    log_record['timestampNanos'] = int(
        (log_record['created'] % 1) * 1000 * 1000 * 1000)

    return log_record

def configure_logger():
  """Configures python logger to format logs as JSON."""
  formatter = CustomJsonFormatter(
        '%(name)s|%(levelname)s|%(message)s|%(created)f'
        '|%(lineno)d|%(pathname)s', '%Y-%m-%dT%H:%M:%S')
  root_logger = logging.getLogger()
  handler = logging.StreamHandler()
  handler.setFormatter(formatter)
  root_logger.addHandler(handler)
  root_logger.setLevel(logging.WARNING)

logging.warning("This is a warning log")

JSON bruto

import json

def log(severity, message):
  global_extras = {"debug_key": "debug_value"}
  structured_log = {"severity": severity, "message": message, **global_extras}
  print(json.dumps(structured_log))

def main(args):
  log("DEBUG", "Debugging the application.")
  log("INFO", "Info.")
  log("WARNING", "Warning.")
  log("ERROR", "Error.")
  log("CRITICAL", "Critical.")

Campos JSON especiais nas mensagens

Quando você fornece um registro estruturado como um dicionário JSON, alguns campos especiais são retirados do jsonPayload e gravados no campo correspondente no LogEntry gerado, conforme descrito na documentação sobre campos especiais.

Por exemplo, se o JSON incluir uma propriedade severity, ela será removida do jsonPayload e aparecerá como a severity da entrada de registro. A propriedade message é usada como o texto de exibição principal da entrada de registro, se houver.

Correlacionar os registros de contêiner com um registro de solicitação (somente serviços)

Na Análise de registros, os registros correlacionados pelos mesmos trace são visíveis no formato “pai-filho”: quando você clicar no ícone de triângulo à esquerda da entrada de registro de solicitação, os registros do contêiner relacionados a essa solicitação aparecerão aninhados no registro da solicitação.

Os registros de contêiner não são correlacionados automaticamente com os registros de solicitação, a menos que você use uma biblioteca de cliente do Cloud Logging. Para correlacionar registros de contêiner com registros de solicitação sem usar uma biblioteca de cliente, use uma linha de registro JSON estruturada que contenha um campo logging.googleapis.com/trace com o identificador de trace extraído do cabeçalho X-Cloud-Trace-Context.

Mostrar registros

Para visualizar os registros de contêiner no console do Google Cloud, faça o seguinte:

  1. No console do Google Cloud, acesse a página Jobs personalizados da Vertex AI.

    Acessar "Jobs personalizados"

  2. Clique no nome do job personalizado com os registros que você quer consultar.

  3. Clique em Ver registros.

Escrever código para ajuste de hiperparâmetros

A Vertex AI pode realizar o ajuste de hiperparâmetros no código de treinamento de ML. Saiba mais sobre como o ajuste de hiperparâmetros na Vertex AI funciona e como configurar um recurso HyperparameterTuningJob.

Se você quiser usar o ajuste de hiperparâmetros, o código de treinamento precisará:

  • Analise argumentos de linha de comando que representam os hiperparâmetros que você quer ajustar. Use os valores analisados para definir os hiperparâmetros para treinamento.

  • Informe intermitentemente a métrica de ajuste de hiperparâmetro à Vertex AI.

Analisar argumentos de linha de comando

Para o ajuste de hiperparâmetros, a Vertex AI executa o código de treinamento várias vezes, com diferentes argumentos de linha de comando a cada vez. O código de treinamento precisa analisar esses argumentos de linha de comando e usá-los como hiperparâmetros para treinamento. Por exemplo, para ajustar a taxa de aprendizado do otimizador, analise um argumento de linha de comando chamado --learning_rate. Saiba como configurar quais argumentos de linha de comando a Vertex AI fornece.

Recomendamos que você use a biblioteca argparse do Python para analisar argumentos de linha de comando.

Gerar relatórios sobre a métrica de ajuste de hiperparâmetro

O código de treinamento precisa informar de modo intermitente a métrica de hiperparâmetros que você está tentando otimizar para a Vertex AI. Por exemplo, se você quiser maximizar a precisão do modelo, informe essa métrica ao final de cada período de treinamento. A Vertex AI usa essas informações para decidir quais hiperparâmetros usar no próximo teste de treinamento. Saiba mais sobre como selecionar e especificar uma métrica de ajuste de hiperparâmetros.

Use a biblioteca cloudml-hypertune do Python para relatar a métrica de ajuste de hiperparâmetro. Essa biblioteca está incluída em todos os contêineres pré-criados para treinamento, e é possível usar pip para instalá-la em um contêiner personalizado.

Para saber como instalar e usar essa biblioteca, consulte o repositório cloudml-hypertune do GitHub ou consulte o codelab Vertex AI: ajuste de hiperparâmetros.

Escrever código para GPUs

Selecione VMs com unidades de processamento gráfico (GPUs, na sigla em inglês) para executar o código de treinamento personalizado. Saiba mais sobre como configurar o treinamento personalizado para usar VMs ativadas por GPU.

Se você quer treinar com GPUs, verifique se o código de treinamento pode aproveitá-las. Dependendo do framework de ML que você usar, isso poderá exigir alterações no código. Por exemplo, se você usar o Keras do TensorFlow, só precisará ajustar seu código se quiser usar mais de uma GPU. Alguns frameworks de ML não podem usar GPUs.

Além disso, verifique se o contêiner é compatível com GPUs: selecione umum contêiner pré-construído para treinamento compatível com GPUs ou instalar asKit de ferramentas CUDA NVIdiA e NVIDIA cuDNN no seu contêiner personalizado. Uma maneira de fazer isso é usar a imagem base do repositório nvidia/cuda do Docker. Outra maneira é usar uma instância do Deep Learning Containers do como a imagem base.

Escreva código para treinamento distribuído

Para treinar em grandes conjuntos de dados, é possível executar o código em várias VMs em um cluster distribuído, gerenciado pela Vertex AI. Saiba como configurar várias VMs para treinamento.

Alguns frameworks de ML, como o TensorFlow e o PyTorch, permitem executar códigos de treinamento idênticos em várias máquinas, coordenando automaticamente como dividir o trabalho com base. sobre as variáveis de ambiente definidas em cada máquina. Descubra se a Vertex AI define variáveis de ambiente para tornar isso possível para o framework de ML.

Como alternativa, você pode executar um contêiner diferente em cada um dos vários pools de workers. Um pool de workers é um grupo de VMs configuradas para usar as mesmas opções de computação e contêiner. Nesse caso, talvez você ainda queira usar as variáveis de ambiente definidas pela Vertex AI para coordenar a comunicação entre as VMs. É possível personalizar o código de treinamento de cada pool para executar as tarefas arbitrárias que você quiser: A maneira de fazer isso depende da sua meta e do framework de ML que você usa.

Rastreie e visualize experimentos de treinamento personalizados usando do TensorBoard da Vertex AI

O Vertex TensorBoard é uma versão gerenciada do TensorBoard, um projeto de código aberto do Google para visualizar experimentos de machine learning. Com o TensorBoard da Vertex AI, é possível rastrear, visualizar e comparar experimentos de ML e compartilhá-los com sua equipe. O TensorBoard Profiler também pode ser usado para identificar e corrigir gargalos de desempenho no treinamento de modelos com mais rapidez e economia.

Para usar o TensorBoard da Vertex AI com o treinamento personalizado, faça o seguinte:

  • Crie uma instância do TensorBoard da Vertex AI no projeto para armazenar seus experimentos (consulte Criar uma instância do TensorBoard).

  • Configure uma conta de serviço para executar o job de treinamento personalizado com as permissões apropriadas.

  • Ajuste seu código de treinamento personalizado para gravar registros compatíveis com o TensorBoard no Cloud Storage (consulte Alterações no script de treinamento).

Para ver um guia passo a passo, consulte Como usar o TensorBoard da Vertex AI com treinamento personalizado.

A seguir