使用互動式殼層監控訓練並偵錯

本頁說明如何使用互動式殼層檢查執行訓練程式碼的容器。您可以在 Vertex AI 上執行的每個預建容器自訂容器中,瀏覽檔案系統並執行偵錯公用程式。

使用互動式殼層檢查訓練容器,有助於偵錯訓練程式碼或 Vertex AI 設定的問題。舉例來說,您可以使用互動式殼層執行下列操作:

  • 執行追蹤和剖析工具。
  • 分析 GPU 使用率。
  • 檢查容器可用的權限 Google Cloud 。

您也可以使用 Cloud Profiler,針對自訂訓練工作偵錯模型訓練成效。詳情請參閱「使用分析器分析模型訓練成效」。

事前準備

使用 CustomJob 資源、HyperparameterTuningJob 資源或自訂 TrainingPipeline 資源執行自訂訓練時,可以使用互動式殼層。準備訓練程式碼設定所選的自訂訓練資源時,請務必符合下列規定:

  • 確認訓練容器已安裝 bash

    所有預先建構的訓練容器都已安裝 bash。如果您建立自訂容器進行訓練,請使用包含 bash 的基本容器,或在 Dockerfile 中安裝 bash

  • 支援互動式殼層的區域中執行自訂訓練。

  • 請確認要存取互動式殼層的使用者,具備下列 Google Cloud 專案的權限,才能執行自訂訓練作業:

    • aiplatform.customJobs.create
    • aiplatform.customJobs.get
    • aiplatform.customJobs.cancel

    如果您自行啟動自訂訓練,代表您很可能已具備這些權限,並可存取互動式殼層。不過,如要使用互動式殼層檢查貴機構中其他人建立的自訂訓練資源,您可能需要取得這些權限。

    如要取得這些權限,其中一種方法是請貴機構的管理員授予您 Vertex AI 使用者角色 (roles/aiplatform.user)。

進階案件的規定

如果您使用特定進階功能,請符合下列額外規定:

  • 如果您將自訂服務帳戶附加至自訂訓練資源,請確保所有想存取互動式殼層的使用者,都具備附加服務帳戶的 iam.serviceAccounts.actAs 權限。

    自訂服務帳戶指南指出,您必須具備這項權限才能附加服務帳戶。此外,您也需要這項權限,才能在自訂訓練期間查看互動式殼層。

    舉例來說,如要建立已繫結服務帳戶的 CustomJob,您必須具備該服務帳戶的 iam.serviceAccounts.actAs 權限。如果同事想查看這個 CustomJob 的互動式殼層,也必須具備相同的 iam.serviceAccounts.actAs 權限。

  • 如果已將專案設定為搭配使用 VPC Service Controls 與 Vertex AI,請注意下列額外限制:

    • 您無法使用私人 IP 進行自訂訓練。如果您需要搭配 VPC 對等互連使用 VPC-SC,則必須完成額外設定,才能使用互動式殼層。請按照「Ray 資訊主頁和互動式殼層 (搭配 VPC-SC + VPC 對等互連)」一文的操作說明,在使用者專案中設定互動式殼層,並搭配 VPC-SC 和 VPC 對等互連。

    • 在互動式殼層中,您無法存取公開網際網路或Google Cloud 服務範圍外的資源。

    • 如要確保互動式殼層的存取安全,除了 aiplatform.googleapis.com 之外,您還必須在服務範圍中新增 notebooks.googleapis.com 做為受限服務。如果您只限制 aiplatform.googleapis.com 而未限制 notebooks.googleapis.com,使用者就能從服務範圍外的機器存取互動式殼層,這會降低使用 VPC Service Controls 的安全性優勢。

啟用互動式殼層

如要為自訂訓練資源啟用互動式殼層,請在建立 CustomJobHyperparameterTuningJob 或自訂 TrainingPipeline 時,將 enableWebAccess API 欄位設為 true

以下範例說明如何使用幾種不同的工具執行這項操作:

控制台

請按照指南在 Google Cloud 控制台建立自訂 TrainingPipeline。在「Train new model」(訓練新模型) 窗格中,當您到達「Model details」(模型詳細資料) 步驟時,請執行下列操作:

  1. 點選「進階選項」

  2. 勾選「Enable training debugging」(啟用訓練偵錯) 核取方塊。

接著,完成其餘的「訓練新模型」工作流程。

gcloud

如要瞭解如何使用這些指令,請參閱建立 CustomJob 的指南和建立 HyperparameterTuningJob 的指南。

API

下列部分 REST 要求主體顯示各類自訂訓練資源的 enableWebAccess 欄位指定位置:

CustomJob

以下範例是 projects.locations.customJobs.create API 方法的部分要求內文:

{
  ...
  "jobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

如要查看傳送 API 要求來建立 CustomJob 的範例,請參閱建立自訂訓練工作

HyperparameterTuningJob

以下範例是 projects.locations.hyperparameterTuningJobs.create API 方法的部分要求內文:

{
  ...
  "trialJobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

如要查看傳送 API 要求來建立 HyperparameterTuningJob 的範例,請參閱「使用超參數調整」。

自訂 TrainingPipeline

下列範例顯示 projects.locations.trainingPipelines.create API 方法的部分要求主體。根據您是否使用超參數調整功能,選取下列其中一個分頁:

不進行超參數調整

{
  ...
  "trainingTaskInputs": {
    ...
    "enableWebAccess": true
  }
  ...
}

使用超參數調整

{
  ...
  "trainingTaskInputs": {
    ...
    "trialJobSpec": {
      ...
      "enableWebAccess": true
    }
  }
  ...
}

如要查看傳送 API 要求來建立自訂 TrainingPipeline 的範例,請參閱建立訓練管道

Python

如要瞭解如何安裝或更新 Python 適用的 Vertex AI SDK,請參閱「安裝 Python 適用的 Vertex AI SDK」。 詳情請參閱 Python API 參考說明文件

執行下列任一方法時,請將 enable_web_access 參數設為 true

根據前一節的指引啟動自訂訓練後,Vertex AI 會產生一或多個 URI,您可以使用這些 URI 存取互動式殼層。Vertex AI 會為工作中的每個訓練節點產生專屬 URI。

您可以透過下列任一方式前往互動式殼層:

  • 按一下 Google Cloud 控制台中的連結
  • 使用 Vertex AI API 取得 Shell 的網頁存取 URI
  1. 在 Google Cloud 控制台的「Vertex AI」部分,前往下列任一頁面:

  2. 按一下自訂訓練資源的名稱。

    如果您為自訂訓練建立 TrainingPipeline,請按一下 TrainingPipeline 建立的 CustomJobHyperparameterTuningJob 名稱。舉例來說,如果管道名稱為 PIPELINE_NAME,這可能會稱為 PIPELINE_NAME-custom-jobPIPELINE_NAME-hyperparameter-tuning-job

  3. 在工作頁面中,按一下「啟動網頁終端機」。如果您的工作使用多個節點,請按一下要取得互動式殼層的節點旁邊的「啟動網頁終端機」

    請注意,只有在作業執行期間,您才能存取互動式殼層。 如果沒有看到「啟動網頁終端機」,可能是因為 Vertex AI 尚未開始執行工作,或是工作已完成或失敗。如果工作「狀態」QueuedPending,請稍候片刻,然後嘗試重新整理頁面。

    如果您使用超參數調整功能,每個試驗都有各自的「啟動網頁終端機」連結。

從 API 取得網頁存取 URI

使用 projects.locations.customJobs.get API 方法projects.locations.hyperparameterTuningJobs.get API 方法,查看可用來存取互動式殼層的 URI。

HyperparameterTuningJob

請根據您使用的自訂訓練資源類型,選取下列其中一個分頁,查看如何找出 webAccessUris API 欄位,其中包含您工作中每個節點的互動式殼層 URI:

CustomJob

以下分頁說明傳送 projects.locations.customJobs.get 要求的方式:

gcloud

執行 gcloud ai custom-jobs describe 指令

gcloud ai custom-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

更改下列內容:

  • JOB_ID:您的工作數值 ID。這個 ID 是工作 name 欄位的最後一部分。您可能在建立工作時看過這組 ID。 (如果不知道工作 ID,可以執行 gcloud ai custom-jobs list 指令,找出適當的工作)。

  • LOCATION:您建立作業的區域。

REST

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

  • LOCATION:您建立作業的區域。

  • PROJECT_ID:您的專案 ID

  • JOB_ID:您的工作數值 ID。這個 ID 是工作 name 欄位的最後一部分。您可能在建立工作時看過這組 ID。

HTTP 方法和網址:

GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs/JOB_ID

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

 

在輸出內容中,尋找下列項目:

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "webAccessUris": {
    "workerpool0-0": "INTERACTIVE_SHELL_URI"
  }
}

如果沒有看到 webAccessUris 欄位,可能是因為 Vertex AI 尚未開始執行工作。確認 state 欄位中顯示 JOB_STATE_RUNNING。如果狀態為 JOB_STATE_QUEUEDJOB_STATE_PENDING,請稍候片刻,然後再次嘗試取得專案資訊。

HyperparameterTuningJob

以下分頁說明傳送 projects.locations.hyperparameterTuningJobs.get 要求的方式:

gcloud

執行 gcloud ai hp-tuning-jobs describe 指令

gcloud ai hp-tuning-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

更改下列內容:

  • JOB_ID:您的工作數值 ID。這個 ID 是工作 name 欄位的最後一部分。您可能在建立工作時看過這組 ID。 (如果不知道工作 ID,可以執行 gcloud ai hp-tuning-jobs list 指令,找出適當的工作)。

  • LOCATION:您建立作業的區域。

REST

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

  • LOCATION:您建立作業的區域。

  • PROJECT_ID:您的專案 ID

  • JOB_ID:您的工作數值 ID。這個 ID 是工作 name 欄位的最後一部分。您可能在建立工作時看過這組 ID。

HTTP 方法和網址:

GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/hyperparameterTuningJobs/JOB_ID

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

 

在輸出內容中,尋找下列項目:

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "trials": [
    ...
    {
      ...
      "state": "ACTIVE",
      ...
      "webAccessUris": {
        "workerpool0-0": "INTERACTIVE_SHELL_URI"
      }
    }
  ],
}

如果沒有看到 webAccessUris 欄位,可能是因為 Vertex AI 尚未開始執行工作。確認 state 欄位中顯示 JOB_STATE_RUNNING。如果狀態為 JOB_STATE_QUEUEDJOB_STATE_PENDING,請稍候片刻,然後再次嘗試取得專案資訊。

超參數調整試驗進入 ACTIVE 狀態時,Vertex AI 會為每項試驗提供一組互動式殼層 URI。如要在後續試用中取得互動式 Shell URI,請在試用開始後再次取得工作資訊。

上例顯示單一副本訓練的預期輸出內容:主要訓練節點的一個 URI。如果您執行分散式訓練,輸出內容會包含每個訓練節點的 URI,並以工作站集區識別。

舉例來說,如果您的工作有一個備用資源的主要工作站集區,以及兩個備用資源的次要工作站集區,則 webAccessUris 欄位看起來會類似下列內容:

{
  "workerpool0-0": "URI_FOR_PRIMARY",
  "workerpool1-0": "URI_FOR_FIRST_SECONDARY",
  "workerpool1-1": "URI_FOR_SECOND_SECONDARY"
}

使用互動式殼層

如要使用訓練節點的互動式殼層,請前往前一節中找到的其中一個 URI。瀏覽器會顯示 Bash 殼層,讓您存取容器的檔案系統,Vertex AI 會在該容器中執行訓練程式碼。

以下各節將說明使用殼層時應注意的事項,並提供一些可在殼層中使用的監控工具範例。

防止工作結束

Vertex AI 執行完工作或試驗後,您會立即失去互動式殼層的存取權。如果發生這種情況,您可能會看到 command terminated with exit code 137 訊息,或是殼層停止回應。如果您在容器的檔案系統中建立任何檔案,這些檔案在工作結束後不會保留。

在某些情況下,您可能會想刻意延長工作執行時間,以便使用互動式殼層進行偵錯。舉例來說,您可以在訓練程式碼中加入下列程式碼,確保作業在發生例外狀況後至少會持續執行一小時:

import time
import traceback

try:
    # Replace with a function that runs your training code
    train_model()
except Exception as e:
    traceback.print_exc()
    time.sleep(60 * 60)  # 1 hour

但請注意,只要工作持續執行,系統就會向您收取 Vertex AI Training 費用

檢查權限問題

互動式殼層環境會使用應用程式預設憑證 (ADC) 進行驗證,適用於 Vertex AI 用來執行訓練程式碼的服務帳戶。如需更多詳細資料,請在殼層中執行 gcloud auth list

在殼層中,您可以使用 bq 和其他支援 ADC 的工具。這有助於確認工作是否能存取特定 Cloud Storage 值區、BigQuery 資料表或其他訓練程式碼需要的Google Cloud 資源。

使用 py-spy 以圖表呈現 Python 執行作業

py-spy 可讓您分析執行中的 Python 程式,而不需修改程式。如要在互動式殼層中使用 py-spy,請執行下列操作:

  1. 安裝 py-spy

    pip3 install py-spy
    
  2. 在殼層中執行 ps aux,然後找出 Python 訓練程式的 PID。

  3. 使用您在上一個步驟中找到的 PID,執行 py-spy 說明文件中說明的任何子指令。

  4. 如果您使用 py-spy record 建立 SVG 檔案,請將該檔案複製到 Cloud Storage 值區,以便稍後在本機電腦上查看。例如:

    gcloud storage cp profile.svg gs://BUCKET
    

    BUCKET 替換成您有權存取的值區名稱。

使用 perf 分析成效

perf 可用於分析訓練節點的效能。如要安裝適用於節點 Linux 核心的 perf 版本,請執行下列指令:

apt-get update
apt-get install -y linux-tools-generic
rm /usr/bin/perf
LINUX_TOOLS_VERSION=$(ls /usr/lib/linux-tools | tail -n 1)
ln -s "/usr/lib/linux-tools/${LINUX_TOOLS_VERSION}/perf" /usr/bin/perf

完成後,您就可以執行perf說明文件中說明的任何子指令。

擷取 GPU 使用率相關資訊

在搭載 GPU 的節點上執行的 GPU 啟用容器,通常會預先安裝多種指令列工具,協助您監控 GPU 使用情形。例如:

  • 使用 nvidia-smi 監控各種程序的 GPU 使用率。

  • 使用 nvprof 收集各種 GPU 剖析資訊。由於 nvprof 無法附加至現有程序,您可能需要使用這項工具啟動額外程序,執行訓練程式碼。(也就是說,訓練程式碼會在節點上執行兩次)。例如:

    nvprof -o prof.nvvp python3 -m MODULE_NAME
    

    MODULE_NAME 替換為訓練應用程式進入點模組的完整名稱;例如 trainer.task

    然後將輸出檔案轉移至 Cloud Storage bucket,以便稍後在本機電腦上進行分析。例如:

    gcloud storage cp prof.nvvp gs://BUCKET
    

    BUCKET 替換成您有權存取的值區名稱。

  • 如果遇到 GPU 錯誤 (不是設定或 Vertex AI 的問題),請使用 nvidia-bug-report.sh 建立錯誤報告。

    然後將報表轉移至 Cloud Storage 值區,以便稍後在本機電腦上分析報表,或傳送給 NVIDIA。例如:

    gcloud storage cp nvidia-bug-report.log.gz gs://BUCKET
    

    BUCKET 替換成您有權存取的值區名稱。

如果 bash 找不到任何 NVIDIA 指令,請嘗試將 /usr/local/nvidia/bin/usr/local/cuda/bin 新增至殼層的 PATH

export PATH="/usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}"

搭配 VPC-SC + 虛擬私有雲對等互連的 Ray 資訊主頁和互動式 Shell

  1. 設定「peered-dns-domains」。

    {
      VPC_NAME=NETWORK_NAME
      REGION=LOCATION
      gcloud services peered-dns-domains create training-cloud \
      --network=$VPC_NAME \
      --dns-suffix=$REGION.aiplatform-training.cloud.google.com.
    
      # Verify
      gcloud beta services peered-dns-domains list --network $VPC_NAME;
    }
        
    • NETWORK_NAME:變更為對等互連網路。

    • LOCATION:所需位置 (例如 us-central1)。

  2. 設定「DNS managed zone」。

    {
      PROJECT_ID=PROJECT_ID
      ZONE_NAME=$PROJECT_ID-aiplatform-training-cloud-google-com
      DNS_NAME=aiplatform-training.cloud.google.com
      DESCRIPTION=aiplatform-training.cloud.google.com
    
      gcloud dns managed-zones create $ZONE_NAME  \
      --visibility=private  \
      --networks=https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/$VPC_NAME  \
      --dns-name=$DNS_NAME  \
      --description="Training $DESCRIPTION"
    }
        
    • PROJECT_ID:您的專案 ID。您可以在 Google Cloud 控制台 歡迎頁面中找到這些 ID。

  3. 記錄 DNS 交易。

    {
      gcloud dns record-sets transaction start --zone=$ZONE_NAME
    
      gcloud dns record-sets transaction add \
      --name=$DNS_NAME. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction add \
      --name=*.$DNS_NAME. \
      --type=CNAME $DNS_NAME. \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction execute --zone=$ZONE_NAME
    }
        
  4. 提交訓練工作,並啟用互動式殼層 + VPC-SC + 虛擬私有雲對等互連。

後續步驟