使用 Vertex AI TensorBoard 進行自訂訓練

使用自訂訓練功能訓練模型時,您可以設定訓練工作,自動將 Vertex AI TensorBoard 記錄上傳至 Vertex AI TensorBoard。

您可以透過這項整合功能,在 Vertex AI TensorBoard 將 Vertex AI TensorBoard 記錄檔寫入 Cloud Storage 時,近乎即時地監控訓練作業。

如需初始設定,請參閱「設定 Vertex AI TensorBoard」。

訓練指令碼變更

訓練指令碼必須設定為將 TensorBoard 記錄寫入 Cloud Storage 值區,而 Vertex AI Training 服務會透過預先定義的環境變數 AIP_TENSORBOARD_LOG_DIR,自動提供該值區的位置。

通常只要將 os.environ['AIP_TENSORBOARD_LOG_DIR'] 提供給開放原始碼 TensorBoard 記錄寫入 API 做為記錄目錄即可。AIP_TENSORBOARD_LOG_DIR 的位置通常會使用 staging_bucket 變數設定。

如要在 TensorFlow 2.x 中設定訓練指令碼,請建立 TensorBoard 回呼,並將 log_dir 變數設為 os.environ['AIP_TENSORBOARD_LOG_DIR']。接著,TensorBoard 回呼會納入 TensorFlow model.fit 回呼清單。

  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],
  )
  

進一步瞭解 Vertex AI 如何在自訂訓練環境中設定環境變數。

建立自訂訓練工作

下列範例說明如何建立自己的自訂訓練工作。

如需如何建立自訂訓練工作的詳細範例,請參閱「Hello custom training」。如需建構自訂訓練容器的操作步驟,請參閱「建立用於訓練的自訂容器映像檔」。

如要建立自訂訓練工作,請使用 Python 適用的 Vertex AI SDK 或 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:。您可以在 Google Cloud 控制台 歡迎頁面中找到這些 ID。
  • location:執行 CustomJob 的位置。這個位置應與提供的 TensorBoard 執行個體相同。
  • staging_bucket:在 API 呼叫期間暫存構件的 Cloud Storage 值區,包括 TensorBoard 記錄。
  • display_name:自訂訓練工作的顯示名稱。
  • script_path:相對於本機檔案系統工作目錄的路徑,指向訓練程式碼的進入點指令碼。
  • container_uri:訓練容器映像檔的 URI,可以是 Vertex AI。 預先建構的訓練容器自訂容器
  • model_serving_container_image_uri:模型服務容器的 URI,適用於提供訓練指令碼產生的模型。
  • dataset_id:用於訓練的資料集 ID 號碼。
  • model_display_name:訓練模型的顯示名稱。
  • args:要傳遞至 Python 指令碼的指令列引數。
  • replica_count:要使用的工作站備用資源數量。 在大多數情況下,請將此值設為 1,用於第一個工作站集區
  • machine_type:要使用的 VM 類型。如需支援的 VM 清單,請參閱「機器類型」。
  • accelerator_type:要附加至資源集區中每個 VM 的 GPU 類型。如需支援的 GPU 清單,請參閱「GPU」。
  • accelerator_count 要附加至資源集區中每個 VM 的 GPU 數量。預設值為 1
  • training_fraction_split:用於訓練模型的部分資料集。
  • validation_fraction_split:用於驗證模型的部分資料集。
  • test_fraction_split:用於評估模型的部分資料集。
  • sync:是否要同步執行這個方法。
  • tensorboard_resource_name:CustomJob 將 TensorBoard 記錄檔上傳至的 Vertex TensorBoard 執行個體資源名稱。
  • service_account:使用 TensorBoard 執行時為必要項目。請參閱「建立具備必要權限的服務帳戶」。

REST

使用任何要求資料之前,請先替換以下項目:

  • LOCATION_ID:執行 CustomJob 的位置,例如 us-central1。這個位置應與提供的 TensorBoard 執行個體相同。
  • PROJECT_ID:您的專案 ID
  • TENSORBOARD_INSTANCE_NAME:(必要) 儲存 Vertex AI TensorBoard 記錄的現有 Vertex AI TensorBoard 執行個體完整名稱:
    projects/PROJECT_ID/locations/LOCATION_ID/tensorboards/TENSORBOARD_INSTANCE_ID
    注意:如果 TensorBoard 執行個體不是現有執行個體,建立 customJobs 時會擲回 404 錯誤。
  • GCS_BUCKET_NAME: "${PROJECT_ID}-tensorboard-logs-${LOCATION}"
  • USER_SA_EMAIL:(必要) 先前步驟中建立的服務帳戶,或您自己的服務帳戶。"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:(必要) 訓練的所有輸出內容寫入的 Google Cloud 路徑。"gs://$GCS_BUCKET_NAME/$JOB_NAME"

HTTP 方法和網址:

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

JSON 要求主體:

{
"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,
  }
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "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"
}

後續步驟