Como executar um job de treinamento

O AI Platform Training oferece treinamento de modelo como um serviço assíncrono em lote. Nesta página, descrevemos como configurar e enviar um job de treinamento executando gcloud ai-platform jobs submit training a partir da linha de comando ou enviando uma solicitação para a API em projects.jobs.create.

Antes de começar

Antes de enviar um job de treinamento, é necessário empacotar o aplicativo, bem como fazer upload dele e de qualquer dependência incomum para um bucket do Cloud Storage. Observação: se você usar a ferramenta de linha de comando gcloud para enviar seu job, poderá empacotar o aplicativo e enviar o job na mesma etapa.

Como configurar o job

Para transferir os parâmetros ao serviço de treinamento, é preciso definir os membros do recurso Job, que inclui os itens no recurso TrainingInput.

Caso use a ferramenta de linha de comando gcloud para enviar seus jobs de treinamento:

  • Especifique os parâmetros de treinamento mais comuns como sinalizadores do comando gcloud ai-platform jobs submit training.
  • Transmita os parâmetros restantes em um arquivo de configuração YAML, denominado config.yaml por convenção. O arquivo de configuração espelha a estrutura da representação JSON do recurso Job. O caminho do arquivo de configuração é transmitido na sinalização --config do comando gcloud ai-platform jobs submit training. Se o caminho para o arquivo de configuração for config.yaml, defina --config=config.yaml.

Como coletar os dados de configuração do job

As propriedades a seguir são usadas para definir o job.

Nome do job (jobId)
: o nome que será usado para o job. Use apenas letras maiúsculas e minúsculas, números e sublinhados, começando com uma letra.
Configuração do cluster (scaleTier)
Um nível de escalonamento que especifica o tipo de cluster de processamento para executar o job. Se o nível de escalonamento for CUSTOM, especifique explicitamente o número e o tipo de máquinas a serem usadas.
Configuração do disco (diskConfig)
Configuração do disco de inicialização para cada VM de treinamento. Esse campo é opcional. Por padrão, cada VM é executada com um disco de inicialização pd-ssd de 100 GB. A especificação desse campo pode gerar cobranças de disco adicionais.
Pacote do aplicativo de treinamento (packageUris)
Um aplicativo de treinamento empacotado, organizado em um local do Cloud Storage. Caso esteja usando a ferramenta de linha de comando gcloud, a etapa de empacotamento do aplicativo será amplamente automatizada. Confira os detalhes no guia sobre como empacotar o aplicativo.
Nome do módulo (pythonModule)
O nome do módulo principal em seu pacote. O módulo principal é o arquivo Python chamado para iniciar o aplicativo. Se você usar o gcloud para enviar o job, especifique o nome do módulo principal na sinalização --module-name. Consulte o guia sobre como empacotar o aplicativo.
Região (region)
A região do Compute Engine em que o job será executado. Execute o job de treinamento na mesma região do bucket do Cloud Storage que armazena os dados de treinamento. Veja as regiões disponíveis para os serviços do AI Platform Training.
Diretório do job (jobDir)
O caminho para um local do Cloud Storage a ser usado para saída do job. A maioria dos aplicativos de treinamento salva checkpoints durante o treinamento e salva o modelo treinado em um arquivo no final do job. Você precisa de um local do Cloud Storage para salvá-los. Seu projeto do Google Cloud precisa ter acesso de gravação a esse bucket. O serviço de treinamento transmite automaticamente o caminho que você definiu para o diretório do job ao seu aplicativo de treinamento como um argumento da linha de comandos chamado job_dir. Você pode analisá-lo junto com os outros argumentos do seu aplicativo e usá-lo no seu código. A vantagem de usar o diretório do job é que o serviço de treinamento valida o diretório antes de iniciar seu aplicativo.
Versão do ambiente de execução (runtimeVersion)
A versão do ambiente de execução do AI Platform Training que será usada no job.
Versão do Python (pythonVersion)
A versão do Python a ser usada para o job. O Python 3.5 está disponível nas versões 1.13 a 1.14 do ambiente de execução. Já o Python 3.7 está disponível nas versões 1.15 e posteriores.
Tempo máximo de espera (scheduling.maxWaitTime)
Uma duração máxima de espera em segundos com o sufixo s (por exemplo, 3600s) determina por quanto tempo você permite que seu job permaneça nos estados QUEUED e PREPARING. O AI Platform Training nem sempre inicia o job imediatamente devido a restrições de recursos. Especifique este campo se não quiser esperar mais do que uma determinada duração para o job ser executado. A duração limitada começa quando você cria o job. Se o job ainda não tiver inserido o estado RUNNING até o final deste período, o AI Platform Training cancelará o job. Esse campo é opcional e não tem um limite como padrão. Se você especificar esse campo, será necessário definir o valor como pelo menos 1800s (30 minutos).
Tempo máximo de execução (scheduling.maxRunningTime)
Uma duração máxima de execução em segundos com o sufixo s (por exemplo, 7200s) para seu job de treinamento. A duração limitada começa quando o job entra no estado RUNNING. Se o job continuar em execução após esse período, ele será cancelado pelo AI Platform Training. Este campo é opcional, e o padrão é sete dias (604800s).
Conta de serviço (serviceAccount)
O endereço de e-mail de uma conta de serviço para o AI Platform Training usar quando executar seu aplicativo de treinamento. Isso pode fornecer ao aplicativo de treinamento acesso aos recursos do Google Cloud sem conceder acesso direto à conta de serviço gerenciada pelo Google do AI Platform do projeto. Este campo é opcional. Saiba mais sobre os requisitos para contas de serviço personalizadas.

Como formatar os parâmetros de configuração

A maneira como você especificará os detalhes de configuração depende de como você inicia o job de treinamento:

gcloud

Forneça os detalhes de configuração do job para o comando gcloud ai-platform jobs submit training. Existem duas maneiras de fazer isso:

  • com sinalizações da linha de comando
  • Em um arquivo YAML que representa o recurso Job. Nomeie esse arquivo como quiser. Por convenção, o nome é config.yaml.

Mesmo se você usar um arquivo YAML, alguns detalhes precisam ser fornecidos como sinalizações de linha de comando. Por exemplo, é necessário fornecer o sinalizador --module-name e pelo menos um sinal de --package-path ou --packages. Caso use o --package-path, também deverá incluir --job-dir ou --staging-bucket. Além disso, forneça a sinalização --region ou defina uma região padrão para seu cliente gcloud. Essas opções (e qualquer outra que você fornecer como sinalização de linha de comando) substituirão os valores das opções no arquivo de configuração.

Exemplo 1: neste exemplo, você pode escolher um cluster de máquina pré-configurado e fornecer todos os detalhes necessários como sinalizações de linha de comando ao enviar o job. Não é necessário usar qualquer arquivo de configuração. Consulte o guia sobre como enviar o job na próxima seção.

Exemplo 2: o exemplo a seguir mostra o conteúdo do arquivo de configuração para um job com um cluster de processamento personalizado. Esse arquivo inclui alguns, mas não todos os detalhes de configuração, supondo que você fornecerá os demais detalhes necessários (como sinalizações de linha de comando) ao enviar o job.

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  runtimeVersion: '2.4'
  pythonVersion: '3.7'
  scheduling:
    maxWaitTime: 3600s
    maxRunningTime: 7200s

No exemplo acima, é especificada a versão 3.7 do Python, que é disponibilizada quando você usa a versão 1.15 ou posterior do ambiente de execução do AI Platform Training. Nele também são configuradas máquinas virtuais de worker e de servidor de parâmetros. Configure essas máquinas somente se você realizar treinamentos distribuídos usando o TensorFlow ou contêineres personalizados. Saiba mais sobre os tipos de máquinas.

Python

Ao enviar um job de treinamento usando a biblioteca de cliente das APIs do Google para Python, defina sua configuração em um dicionário com a mesma estrutura do recurso Job. Isso assume a forma de um dicionário com duas chaves: jobId e trainingInput, com seus respectivos dados sendo o nome do job e um segundo dicionário com chaves para os objetos no recurso TrainingInput.

O exemplo a seguir mostra como criar uma representação Job para um job com cluster de processamento personalizado.

training_inputs = {
    'scaleTier': 'CUSTOM',
    'masterType': 'complex_model_m',
    'workerType': 'complex_model_m',
    'parameterServerType': 'large_model',
    'workerCount': 9,
    'parameterServerCount': 3,
    'packageUris': ['gs://my/trainer/path/package-0.0.0.tar.gz'],
    'pythonModule': 'trainer.task',
    'args': ['--arg1', 'value1', '--arg2', 'value2'],
    'region': 'us-central1',
    'jobDir': 'gs://my/training/job/directory',
    'runtimeVersion': '2.4',
    'pythonVersion': '3.7',
    'scheduling': {'maxWaitTime': '3600s', 'maxRunningTime': '7200s'},
}

job_spec = {'jobId': 'my_job_name', 'trainingInput': training_inputs}

Observe que training_inputs e job_spec são identificadores arbitrários: nomeie esses dicionários como quiser. No entanto, as chaves do dicionário devem ser nomeadas exatamente como mostradas, para corresponder aos nomes nos recursos Job e TrainingInput.

No exemplo acima, é especificada a versão 3.7 do Python, que é disponibilizada quando você usa a versão 1.15 ou posterior do ambiente de execução do AI Platform Training. Nele também são configuradas máquinas virtuais de worker e de servidor de parâmetros. Configure essas máquinas somente se você realizar treinamentos distribuídos usando o TensorFlow ou contêineres personalizados. Saiba mais sobre os tipos de máquinas.

Como enviar o job

Ao enviar um job de treinamento, especifique dois conjuntos de sinalizações:

  • Parâmetros de configuração do job: o AI Platform Training precisa desses valores para configurar recursos na nuvem e implantar o aplicativo em cada nó no cluster de processamento.
  • Argumentos do usuário ou parâmetros do aplicativo: O AI Platform Training transmite o valor dessas sinalizações para o aplicativo.

Crie o job:

gcloud

Envie um job de treinamento usando o comando gcloud ai-platform jobs submit training.

Primeiramente, defina algumas variáveis de ambiente contendo os detalhes da configuração. Para criar o nome do job, o código a seguir acrescenta a data e a hora ao nome do modelo:

PACKAGE_PATH="/path/to/your/application/sources"
now=$(date +"%Y%m%d_%H%M%S")
JOB_NAME="your_name_$now"
MODULE_NAME="trainer.task"
JOB_DIR="gs://your/chosen/job/output/path"
REGION="us-east1"
RUNTIME_VERSION="2.4"

O envio de job a seguir corresponde à configuração do exemplo 1 acima, em que você escolhe um nível de escalonamento pré-configurado (basic) e decide fornecer todos os detalhes de configuração por meio de sinalizações de linha de comando. Não é necessário um arquivo config.yaml:

gcloud ai-platform jobs submit training $JOB_NAME \
        --scale-tier basic \
        --package-path $PACKAGE_PATH \
        --module-name $MODULE_NAME \
        --job-dir $JOB_DIR \
        --region $REGION \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

O exemplo de envio de job a seguir corresponde ao arquivo de configuração do exemplo 2 acima, em que apenas algumas configurações estão no arquivo e você fornece os demais detalhes por meio de sinalizações de linha de comando:

gcloud ai-platform jobs submit training $JOB_NAME \
        --package-path $PACKAGE_PATH \
        --module-name $MODULE_NAME \
        --job-dir $JOB_DIR \
        --region $REGION \
        --config config.yaml \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

Observações:

  • Caso especifique 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 do gcloud e o início do USER_ARGS que você quer passar para seu aplicativo.
  • Sinalizações específicas do AI Platform Training, como --module-name, --runtime-version e --job-dir, precisam ser inseridas antes da sinalização -- vazia. O serviço do AI Platform Training interpreta essas sinalizações.
  • É necessário que a sinalização --job-dir, se especificada, venha antes da sinalização vazia -- porque o AI Platform Training usa --job-dir para validar o caminho.
  • Seu aplicativo também precisa manipular a sinalização --job-dir, se especificada. Mesmo que a sinalização venha antes do -- vazio, --job-dir também será passado ao seu aplicativo como uma sinalização de linha de comando.
  • Defina quantos USER_ARGS forem necessários. O AI Platform Training transmite --user_first_arg, --user_second_arg e assim por diante para o aplicativo.

Python

Use a biblioteca de cliente de APIs do Google para Python para chamar a API AI Platform Training and Prediction sem gerar solicitações HTTP manualmente. Antes de executar a amostra de código a seguir, você precisa configurar a autenticação.

  1. Salve o ID do projeto no formato necessário para as APIs, "projects/projectname":

    project_name = 'my_project_name'
    project_id = 'projects/{}'.format(project_name)
    
  2. Consiga uma representação em Python dos serviços do AI Platform Training:

    cloudml = discovery.build('ml', 'v1')
    
  3. Crie e envie a solicitação: Observe que job_spec foi criado na etapa anterior em que você formatou os parâmetros de configuração

    request = cloudml.projects().jobs().create(body=job_spec,
                  parent=project_id)
    response = request.execute()
    
  4. Identifique os erros HTTP. A maneira mais simples é colocar o comando anterior em um bloco de try:

    try:
        response = request.execute()
        # You can put your code for handling success (if any) here.
    
    except errors.HttpError, err:
        # Do whatever error response is appropriate for your application.
        # For this example, just send some text to the logs.
        # You need to import logging for this to work.
        logging.error('There was an error creating the training job.'
                      ' Check the details:')
        logging.error(err._get_reason())
    

A seguir