本頁說明如何使用互動式殼層,檢查訓練程式碼執行所在的容器。您可以在 Vertex AI 上執行的每個預建容器或自訂容器中,瀏覽檔案系統並執行偵錯公用程式。
使用互動式殼層檢查訓練容器,有助於您偵錯訓練程式碼或 Vertex AI 設定的問題。舉例來說,您可以使用互動式殼層執行以下操作:
- 執行追蹤和剖析工具。
- 分析 GPU 用量。
- 檢查 Google Cloud 容器的可用權限。
您也可以使用 Cloud Profiler 為自訂訓練工作偵錯模型訓練成效。詳情請參閱「使用 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
權限。如果您已將專案設定為搭配 Vertex AI 使用 VPC Service Controls,請考量以下額外限制:
您無法使用私人 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 的安全性優勢。
啟用互動式殼層
如要為自訂訓練資源啟用互動式殼層,請在建立 CustomJob
、HyperparameterTuningJob
或自訂 TrainingPipeline
時,將 enableWebAccess
API 欄位設為 true
。
以下範例說明如何使用多種不同的工具執行這項操作:
控制台
請按照指南在 Google Cloud 控制台中建立自訂 TrainingPipeline
。在「Train new model」窗格中,當您看到「Model details」步驟時,請執行下列操作:
點選「進階選項」。
勾選「Enable training debugging」(啟用訓練偵錯功能) 核取方塊。
然後完成訓練新模型工作流程的其餘部分。
gcloud
如要建立
CustomJob
,請執行gcloud ai custom-jobs create
指令,並在該指令中指定--enable-web-access
標記。如要建立
HyperparameterTuningJob
,請執行gcloud ai hp-tuning-jobs create
指令,並在該指令中指定--enable-web-access
標記。
如要瞭解如何使用這些指令,請參閱建立 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
,請參閱「使用超參數調整」一文。
自訂訓練管道
以下範例顯示 projects.locations.trainingPipelines.create
API 方法的部分要求主體。視是否使用超參數調整功能而定,請選取下列其中一個分頁:
未調整超參數
{
...
"trainingTaskInputs": {
...
"enableWebAccess": true
}
...
}
使用超參數調整
{
...
"trainingTaskInputs": {
...
"trialJobSpec": {
...
"enableWebAccess": true
}
}
...
}
如需傳送 API 要求以建立自訂 TrainingPipeline
的範例,請參閱「建立訓練管道」。
Python 適用的 Vertex AI SDK
如要瞭解如何安裝或更新 Python 適用的 Vertex AI SDK,請參閱「安裝 Python 適用的 Vertex AI SDK」。 詳情請參閱 Vertex AI SDK for Python API 參考說明文件。
執行下列任一方法時,請將 enable_web_access
參數設為 true
:
如要建立
CustomJob
,請使用CustomJob.run
方法。如要建立
HyperparameterTuningJob
,請使用HyperparameterTuningJob.run
方法。如要建立自訂
TrainingPipeline
,請使用下列任一方法:
前往互動式殼層
按照前一個章節的指引啟動自訂訓練後,Vertex AI 會產生一或多個 URI,供您用於存取互動式殼層。Vertex AI 會為工作中的每個訓練節點產生專屬的 URI。
您可以透過下列任一方式前往互動式殼層:
- 按一下 Google Cloud 控制台中的連結
- 使用 Vertex AI API 取得殼層的網頁存取 URI
從 Google Cloud 控制台前往
在 Google Cloud 控制台的「Vertex AI」專區中,前往下列任一頁面:
按一下自訂訓練資源的名稱。
如果您已為自訂訓練建立
TrainingPipeline
,請按一下TrainingPipeline
建立的CustomJob
或HyperparameterTuningJob
名稱。舉例來說,如果管道名稱為PIPELINE_NAME
,則可能會稱為PIPELINE_NAME-custom-job
或PIPELINE_NAME-hyperparameter-tuning-job
。在工作頁面上,按一下「Launch web terminal」。如果工作使用多個節點,請按一下要啟動互動式殼層的節點旁邊的「Launch web terminal」。
請注意,您只能在工作執行期間存取互動式殼層。如果您沒有看到「Launch web terminal」,可能是因為 Vertex AI 尚未開始執行工作,或是工作已完成或失敗。如果工作狀態是
Queued
或Pending
,請稍候片刻,然後嘗試重新整理頁面。如果您使用超參數調整功能,每個試驗都會有個別的「Launch web terminal」連結。
從 API 取得網頁存取 URI
使用 projects.locations.customJobs.get
API 方法或 projects.locations.hyperparameterTuningJobs.get
API 方法,查看可用於存取互動式殼層的 URI。
請根據您使用的自訂訓練資源類型,選取下列任一分頁,查看如何尋找 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_QUEUED
或 JOB_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_QUEUED
或 JOB_STATE_PENDING
,請稍候一分鐘,然後再嘗試取得專案資訊。
當試驗進入 ACTIVE
狀態時,Vertex AI 會為每個超參數調整試驗提供一組互動式殼層 URI。如果您想取得互動式殼層 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 執行訓練程式碼的容器檔案系統。
以下各節將說明使用 Shell 時應考量的幾個事項,並提供一些您可能會在 Shell 中使用的監控工具範例。
防止工作結束
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 訓練費用。
檢查權限問題
互動式殼層環境會使用 應用程式預設憑證 (ADC) 進行驗證,該憑證適用於 Vertex AI 用來執行訓練程式碼的服務帳戶。您可以在殼層中執行 gcloud auth list
以取得更多詳細資訊。
您可以在殼層中使用 bq
和其他支援 ADC 的工具。這有助於您驗證工作是否能夠存取特定 Cloud Storage 值區、BigQuery 資料表或訓練程式碼需要的其他Google Cloud 資源。
使用 py-spy
以圖表呈現 Python 執行作業
py-spy
可讓您在不修改執行中的 Python 程式情況下,對其進行剖析。如要在互動式殼層中使用 py-spy
,請執行下列操作:
安裝
py-spy
:pip3 install py-spy
在 Shell 中執行
ps aux
,並查看 Python 訓練程式的 PID。使用先前步驟中找到的 PID,執行
py-spy
說明文件中所述的任何子指令。如果您使用
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 值區,以便日後在本機電腦上進行分析。例如:
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
-
設定
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
)。
-
-
設定
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" }
-
記錄 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 }
-
啟用互動式殼層 + VPC-SC + 虛擬私有雲對等互連,然後提交訓練工作。
後續步驟
- 瞭解如何使用剖析器,改善自訂訓練工作效能。
- 進一步瞭解 Vertex AI 如何協調自訂訓練。
- 請參閱訓練工作的程式碼需求。