使用 Vertex AI TensorBoard 進行自訂訓練

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

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

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

訓練指令碼變更

訓練指令碼必須設定為將 TensorBoard 記錄寫入 Cloud Storage 值區,Vertex AI Training Service 會透過預先定義的環境變數 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:Vertex TensorBoard 執行個體的資源名稱,CustomJob 會將 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"
}

後續步驟