Usar o TensorBoard da Vertex AI com treinamento personalizado

Ao usar o treinamento personalizado para treinar modelos, é possível configurar seu job de treinamento para fazer upload automático dos registros do Vertex AI TensorBoard para a Vertex AI TensorBoard.

Essa integração é necessária para monitorar o treinamento quase em tempo real, já que o TensorBoard da Vertex AI fará streaming nos registros do TensorBoard Vertex AI à medida que eles forem gravados no Cloud Storage.

Para a configuração inicial, consulte Configuração para o TensorBoard da Vertex AI.

Alterações no script de treinamento

Seu script de treinamento precisa ser configurado para gravar registros do TensorBoard no bucket do Cloud Storage, o local do serviço de treinamento do Vertex AI que será disponibilizado automaticamente por meio de uma variável de ambiente predefinida AIP_TENSORBOARD_LOG_DIR.

Geralmente, isso pode ser feito ao fornecer os.environ['AIP_TENSORBOARD_LOG_DIR'] como o diretório de registros para as APIs de gravação de registros de TensorBoard de código aberto. O local do AIP_TENSORBOARD_LOG_DIR é normalmente definido com a variável staging_bucket.

Para configurar seu script de treinamento no TensorFlow 2.x, crie um callback do TensorBoard e defina oslog_dir comoos.environ['AIP_TENSORBOARD_LOG_DIR'] O callback do TensorBoard é incluído nomodel.fit de callbacks.

  tensorboard_callback = tf.keras.callbacks.TensorBoard(
       log_dir=os.environ['AIP_TENSORBOARD_LOG_DIR'],
       histogram_freq=1
  )
  
  model.fit(
       x=x_train,
       y=y_train,
       epochs=epochs,
       validation_data=(x_test, y_test),
       callbacks=[tensorboard_callback],
  )
  

Saiba mais sobre como a Vertex AI define variáveis de ambiente no ambiente de treinamento personalizado.

Criar um job de treinamento personalizado

O exemplo a seguir mostra como criar seu próprio job de treinamento personalizado.

Para ver um exemplo detalhado de como criar um job de treinamento personalizado, consulte Treinamento personalizado do Hello. Para ver as etapas de criação de contêineres de treinamento personalizados, consulte Criar uma imagem de contêiner personalizada para treinamento.

Para criar um job de treinamento personalizado, use o SDK da Vertex AI para Python ou REST.

Python

Python

def create_training_pipeline_custom_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    script_path: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 0,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomTrainingJob(
        display_name=display_name,
        script_path=script_path,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    print(model.uri)
    return model

  • project: o ID do projeto. Esses IDs estão na página de boas-vindas do console do Google Cloud.
  • location: o local para executar o CustomJob. Precisa ser o mesmo local da instância do TensorBoard fornecida.
  • staging_bucket: o bucket do Cloud Storage para preparar artefatos durante chamadas de API, incluindo registros do TensorBoard.
  • display_name: nome de exibição do job de treinamento personalizado.
  • script_path: o caminho, relativo ao diretório em uso no seu sistema de arquivos local, para o script que é o ponto de entrada para seu código de treinamento.
  • container_uri: o URI da imagem do contêiner de treinamento pode ser um contêiner de treinamento pré-criado da Vertex AI ou um contêiner personalizado.
  • model_serving_container_image_uri: o URI do contêiner de exibição do modelo adequado para exibir o modelo produzido pelo script de treinamento.
  • dataset_id: o número do ID do conjunto de dados a ser usado para treinamento.
  • model_display_name: nome de exibição do modelo treinado.
  • args: argumentos da linha de comando a serem passados para o módulo Python.
  • replica_count: o número de réplicas de worker a serem usadas. No geral, defina como 1 para o primeiro pool de workers.
  • machine_type: o tipo de VM a ser usada. Para uma lista de VMs compatíveis, consulte Tipos de máquina.
  • accelerator_type: o tipo de GPU a ser anexado a cada VM no pool de recursos. Para uma lista de GPUs compatíveis, consulte GPUs.
  • accelerator_count: o número de GPUs a serem anexadas a cada VM no pool de recursos. O valor padrão é 1.
  • training_fraction_split: a fração do conjunto de dados a ser usada para treinar o modelo.
  • validation_fraction_split: a fração do conjunto de dados a ser usada para validar o modelo.
  • test_fraction_split: a fração do conjunto de dados a ser usada para avaliar o modelo.
  • sync: se o método será executado de forma síncrona.
  • tensorboard_resource_name: o nome do recurso da instância do Vertex TensorBoard em que o CustomJob fará o upload dos registros do TensorBoard.
  • service_account: obrigatório ao executar com o TensorBoard. Consulte Criar uma conta de serviço com as permissões necessárias.

REST

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • LOCATION_ID: o local em que o CustomJob será executado, por exemplo, us-central1. Precisa ser o mesmo local da instância do TensorBoard fornecida.
  • PROJECT_ID: o ID do projeto.
  • TENSORBOARD_INSTANCE_NAME: (obrigatório) o nome completo da instância atual do TensorBoard da Vertex AI que armazena os registros do TensorBoard da Vertex AI:
    projects/PROJECT_ID/locations/LOCATION_ID/tensorboards/TENSORBOARD_INSTANCE_ID
    Observação: se a instância do tensorboard não é uma instância existente, a criação de jobs personalizados gera um erro 404.
  • GCS_BUCKET_NAME: "${PROJECT_ID}-tensorboard-logs-${LOCATION}"
  • USER_SA_EMAIL: (obrigatório) a conta de serviço criada em etapas anteriores ou sua própria conta de serviço. "USER_SA_NAME@${PROJECT_ID}.iam.gserviceaccount.com"
  • TRAINING_CONTAINER: TRAINING_CONTAINER.
  • INVOCATION_TIMESTAMP: "$(date +'%Y%m%d-%H%M%S')"
  • JOB_NAME: "tensorboard-example-job-${INVOCATION_TIMESTAMP}"
  • BASE_OUTPUT_DIR: (obrigatório) o caminho do Google Cloud em que toda a saída do treinamento é gravada. "gs://$GCS_BUCKET_NAME/$JOB_NAME"

Método HTTP e URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/customJobs

Corpo JSON da solicitação:

{
"displayName": JOB_NAME,
"jobSpec":{
"workerPoolSpecs":[
  {
    "replicaCount": "1",
     "machineSpec": {
        "machineType": "n1-standard-8",
      },
      "containerSpec": {
        "imageUri": TRAINING_CONTAINER,
      }
    }
  ],
  
  "base_output_directory": {
  "output_uri_prefix": BASE_OUTPUT_DIR,
   },
  "serviceAccount": USER_SA_EMAIL,
  "tensorboard": TENSORBOARD_INSTANCE_NAME,
  }
}

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "name": "projects/PROJECT_ID/locations/LOCATION_ID/customJobs/CUSTOM_JOB_ID",
  "displayName": "DISPLAY_NAME",
  "jobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "n1-standard-8"
        },
        "replicaCount": "1",
        "diskSpec": {
          "bootDiskType": "pd-ssd",
          "bootDiskSizeGb": 100
        },
        "containerSpec": {
          "imageUri": "IMAGE_URI"
        }
      }
    ],
    "serviceAccount": "SERVICE_ACCOUNT",
    "baseOutputDirectory": {
      "outputUriPrefix": "OUTPUT_URI_PREFIX"
    },
    "tensorboard": "projects//locations/LOCATION_ID/tensorboards/tensorboard-id"
  },
  "state": "JOB_STATE_PENDING",
  "createTime": "CREATE-TIME",
  "updateTime": "UPDATE-TIME"
}

A seguir