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 com um código que treine 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:
AIP_MODEL_DIR
: um URI do Cloud Storage de um diretório destinado a salvar artefatos do modeloAIP_CHECKPOINT_DIR
: um URI do Cloud Storage de um diretório destinado a salvar checkpointsAIP_TENSORBOARD_LOG_DIR
: um URI do Cloud Storage de um diretório destinado a salvar registros do TensorBoard. Consulte Como usar o TensorBoard da Vertex AI com treinamento personalizado.
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:
- Streamings de saída padrão (
stdout
) ou de erro padrão (stderr
) - Arquivos de registros em
/var/log-storage/
que seguem a convenção de nomenclaturaoutput*.log
. - syslog (
/dev/log
) - Registros gravados usando as bibliotecas de cliente do Cloud Logging, disponíveis para muitas linguagens conhecidas
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
.
Ver registros
Para visualizar os registros de contêiner no console do Google Cloud, faça o seguinte:
No console do Google Cloud, acesse a página Jobs personalizados da Vertex AI.
Clique no nome do job personalizado com os registros que você quer consultar.
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 Cloud 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
Conheça os detalhes de como criar um aplicativo de treinamento em Python para usar com um contêiner pré-criado ou como criar uma imagem de contêiner personalizada.
Se você não tem certeza de que quer executar o treinamento personalizado, leia uma comparação do treinamento personalizado e do AutoML.