Vertex AI Pipelines 可讓您以無伺服器的方式自動調度管理機器學習 (ML) 工作流程。Vertex AI Pipelines 必須先將工作流程描述為管道,才能自動調度管理機器學習工作流程。機器學習管道是以容器和 Google Cloud 服務為基礎的可攜式可擴充機器學習工作流程。
本指南說明如何著手建構機器學習 pipeline。
我該使用哪個管道 SDK?
Vertex AI Pipelines 可執行使用下列任一 SDK 建構的管道:
Kubeflow Pipelines SDK 1.8 以上版本 (建議使用 2.x 以上版本)
TensorFlow Extended 0.30.0 以上版本
如果您在處理 TB 規模結構化資料或文字資料的機器學習工作流程中使用 TensorFlow,建議您使用 TFX 建構管道。
- 如要進一步瞭解如何建立 TFX 管線,請參閱 TFX 入門教學課程。
- 如要進一步瞭解如何使用 Vertex AI Pipelines 執行 TFX 管線,請參閱Google Cloud 上的 TFX 教學課程。
如為其他用途,建議您使用 Kubeflow Pipelines SDK 建構管道。您可以使用 Kubeflow Pipelines SDK 建構管道,藉此透過建構自訂元件或重複使用預先建構的元件 (例如 Google Cloud Pipeline 元件) 來實作工作流程。Google Cloud Pipeline Components 可讓您在管道中輕鬆使用 Vertex AI 服務,例如 AutoML。
本指南說明如何使用 Kubeflow Pipelines SDK 建構管道。
事前準備
在建構及執行管道前,請按照下列操作說明設定 Google Cloud 專案和開發環境。
如要讓 Google Cloud 專案準備好執行 ML 管道,請按照指南中的操作說明設定Google Cloud 專案。
安裝 Kubeflow Pipelines SDK 2 以上版本。
pip install --upgrade "kfp>=2,<3"
如要在管道中使用 Vertex AI Python 用戶端,請安裝 Vertex AI 用戶端程式庫 1.7 以上版本。
如要在管道中使用 Vertex AI 服務,請安裝Google Cloud SDK。
開始建立管道
如要在 Vertex AI Pipelines 上自動化調度管理機器學習工作流程,您必須先將工作流程描述為管道。以下範例說明如何使用 Google Cloud Pipeline 元件與 Vertex AI 建立資料集、使用 AutoML 訓練模型,以及部署經過訓練的模型以進行預測。
您必須先設定驗證,才能執行下列程式碼範例。
如何設定驗證
如要設定驗證方法,您必須建立服務帳戶金鑰,並為該服務帳戶金鑰的路徑設定環境變數。
-
建立服務帳戶:
-
前往 Google Cloud 控制台的「Create service account」(建立服務帳戶) 頁面。
- 在 [Service account name] (服務帳戶名稱) 欄位中輸入一個名稱。
- 選用:在「服務帳戶說明」欄位中輸入說明。
- 按一下 [建立]。
- 按一下「請選擇角色」欄位。在「所有角色」下方,依序選取「Vertex AI」 >「Vertex AI 使用者」。
-
按一下「Done」建立服務帳戶。
請勿關閉瀏覽器視窗。您將在下一個步驟中使用此項目。
-
-
建立服務帳戶金鑰以用於驗證程序:
- 在 Google Cloud 控制台中,按一下您建立的服務帳戶電子郵件地址。
- 點選「金鑰」。
- 依序點選「新增金鑰」和「建立新的金鑰」。
- 按一下「建立」,JSON 金鑰檔案會下載至您的電腦。
- 按一下 [關閉]。
- 將您用來執行管道的服務帳戶存取權,授予新的服務帳戶。
- 按一下 即可返回服務帳戶清單。
按一下用來執行管道的服務帳戶名稱。系統隨即會顯示「服務帳戶詳細資料」頁面。
如果您按照指南中的操作說明設定 Vertex AI Pipelines 專案,這個服務帳戶就是您在「設定具備精細權限的服務帳戶」一節中建立的服務帳戶。否則,Vertex AI 會使用 Compute Engine 預設服務帳戶執行管道。Compute Engine 預設服務帳戶的名稱如下:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
- 按一下「Permissions」(權限) 分頁標籤。
- 按一下「Grant access」(授予存取權)。「Add principals」面板隨即會顯示。
- 在「新增主體」方塊中,輸入您在先前步驟中建立的服務帳戶電子郵件地址。
- 在「角色」下拉式選單中,依序選取「服務帳戶」 >「服務帳戶使用者」。
- 點選「儲存」。
-
將環境變數 GOOGLE_APPLICATION_CREDENTIALS 設為包含服務帳戶金鑰的 JSON 檔案路徑。這項變數僅適用於您目前的殼層工作階段,因此如果您開啟了新的工作階段,就必須重新設定變數。
範例:Linux 或 macOS
將 [PATH] 替換為包含服務帳戶金鑰的 JSON 檔案路徑。
export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
例如:
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
範例:Windows
將 [PATH] 替換為包含服務帳戶金鑰的 JSON 檔案路徑,並將 [FILE_NAME] 替換為檔案名稱。
使用 PowerShell:
$env:GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
例如:
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\[FILE_NAME].json"
使用命令提示字元:
set GOOGLE_APPLICATION_CREDENTIALS=[PATH]
使用 Kubeflow Pipelines DSL 套件定義工作流程
kfp.dsl
套件包含特定領域語言 (DSL),可用於定義及與管道和元件互動。
Kubeflow 管道元件是建立管道步驟的工廠函式。每個元件都會說明元件的輸入內容、輸出內容和實作方式。舉例來說,在下方程式碼範例中,ds_op
是一個元件。
元件可用於建立管道步驟。管道執行時,系統會在依附的資料可用時執行步驟。舉例來說,訓練元件可以將 CSV 檔案做為輸入內容,並用於訓練模型。
import kfp
from google.cloud import aiplatform
from google_cloud_pipeline_components.v1.dataset import ImageDatasetCreateOp
from google_cloud_pipeline_components.v1.automl.training_job import AutoMLImageTrainingJobRunOp
from google_cloud_pipeline_components.v1.endpoint import EndpointCreateOp, ModelDeployOp
project_id = PROJECT_ID
pipeline_root_path = PIPELINE_ROOT
# Define the workflow of the pipeline.
@kfp.dsl.pipeline(
name="automl-image-training-v2",
pipeline_root=pipeline_root_path)
def pipeline(project_id: str):
# The first step of your workflow is a dataset generator.
# This step takes a Google Cloud Pipeline Component, providing the necessary
# input arguments, and uses the Python variable `ds_op` to define its
# output. Note that here the `ds_op` only stores the definition of the
# output but not the actual returned object from the execution. The value
# of the object is not accessible at the dsl.pipeline level, and can only be
# retrieved by providing it as the input to a downstream component.
ds_op = ImageDatasetCreateOp(
project=project_id,
display_name="flowers",
gcs_source="gs://cloud-samples-data/vision/automl_classification/flowers/all_data_v2.csv",
import_schema_uri=aiplatform.schema.dataset.ioformat.image.single_label_classification,
)
# The second step is a model training component. It takes the dataset
# outputted from the first step, supplies it as an input argument to the
# component (see `dataset=ds_op.outputs["dataset"]`), and will put its
# outputs into `training_job_run_op`.
training_job_run_op = AutoMLImageTrainingJobRunOp(
project=project_id,
display_name="train-iris-automl-mbsdk-1",
prediction_type="classification",
model_type="CLOUD",
dataset=ds_op.outputs["dataset"],
model_display_name="iris-classification-model-mbsdk",
training_fraction_split=0.6,
validation_fraction_split=0.2,
test_fraction_split=0.2,
budget_milli_node_hours=8000,
)
# The third and fourth step are for deploying the model.
create_endpoint_op = EndpointCreateOp(
project=project_id,
display_name = "create-endpoint",
)
model_deploy_op = ModelDeployOp(
model=training_job_run_op.outputs["model"],
endpoint=create_endpoint_op.outputs['endpoint'],
automatic_resources_min_replica_count=1,
automatic_resources_max_replica_count=1,
)
更改下列內容:
- PROJECT_ID:這個管道執行的 Google Cloud 專案。
PIPELINE_ROOT_PATH:指定 管道服務帳戶可存取的 Cloud Storage URI。管道執行作業的構件會儲存在管道根目錄中。
管道根目錄可設為管道函式上
@kfp.dsl.pipeline
註解的引數,也可以在呼叫create_run_from_job_spec
以建立管道執行作業時設定。
將管道編譯為 YAML 檔案
定義管道的工作流程後,您可以繼續將管道編譯為 YAML 格式。YAML 檔案包含在 Vertex AI 管道上執行管道所需的所有資訊。
from kfp import compiler
compiler.Compiler().compile(
pipeline_func=pipeline,
package_path='image_classif_pipeline.yaml'
)
提交管道執行作業
管道的流程編譯為 YAML 格式後,您可以使用 Vertex AI Python 用戶端提交及執行管道。
import google.cloud.aiplatform as aip
# Before initializing, make sure to set the GOOGLE_APPLICATION_CREDENTIALS
# environment variable to the path of your service account.
aip.init(
project=project_id,
location=PROJECT_REGION,
)
# Prepare the pipeline job
job = aip.PipelineJob(
display_name="automl-image-training-v2",
template_path="image_classif_pipeline.yaml",
pipeline_root=pipeline_root_path,
parameter_values={
'project_id': project_id
}
)
job.submit()
更改下列內容:
- PROJECT_REGION:這個管道執行的區域。
在上述範例中:
- Kubeflow 管道會定義為 Python 函式。這個函式會加上
@kfp.dsl.pipeline
修飾符註解,用來指定 pipeline 的名稱和根路徑。管道根路徑是儲存管道構件的資料夾位置。 - 管道的 workflow 步驟是使用 Google Cloud Pipeline Components 建立。您可以將元件的輸出內容做為另一個元件的輸入內容,藉此將管道的流程定義為圖表。例如:
training_job_run_op
依附於ds_op
的dataset
輸出內容。 - 您會使用
kfp.compiler.Compiler
編譯管道。 - 您會使用 Vertex AI Python 用戶端,在 Vertex AI Pipelines 上建立管道執行作業。執行管道時,您可以覆寫管道名稱和管道根路徑。您可以使用管道名稱將管道執行作業分組。覆寫管道名稱有助於區分正式版和實驗版管道執行作業。
如要進一步瞭解如何建構管道,請參閱「建構 Kubeflow 管道」一節,並參考樣本和教學課程。
在本機測試管道 (選用)
定義管道和元件後,您可以在本機撰寫環境中執行程式碼,以便測試元件程式碼。您可以在本機執行管道或元件,在建立管道執行作業 (例如 Vertex AI Pipelines) 之前,找出並偵錯潛在問題。如要進一步瞭解如何在本機執行管道和元件,請參閱 KFP 說明文件中的「本機執行」。
本頁面說明如何定義及執行由兩個工作組成的管道。
設定本機環境
選用:安裝 Docker。
請使用以下程式碼範例定義簡單的管道:
from kfp import dsl # Define a component to add two numbers. @dsl.component def add(a: int, b: int) -> int: return a + b # Define a simple pipeline using the component. @dsl.pipeline def addition_pipeline(x: int, y: int, z: int) -> int: task1 = add(a=x, b=y) task2 = add(a=task1.output, b=z) return task2.output
叫用本機執行作業
使用 local.init()
函式初始化本機工作階段。使用 local.init()
時,您呼叫管道和元件時,KFPlayer SDK 會在本機執行這些項目。
使用 local.init()
時,您必須指定執行程式類型。執行程式類型會指出 KFP 應如何執行各項工作。
請使用以下範例,指定 DockerRunner
執行程式類型,以便在容器中執行每項工作。如要進一步瞭解 KFP 支援的本機執行工具,請參閱 KFP 說明文件中的「本機執行工具」。
from kfp import local
local.init(runner=local.DockerRunner())
pipeline_task = addition_pipeline(x=1, y=2, z=3)
請使用下列程式碼,在本機執行時查看管道工作內容的輸出內容:
print(f'Result: {pipeline_task.output}')
建構 Kubeflow 管道
請按照下列程序建構管道。
將管道設計為一系列元件。為了促進重複使用性,每個元件都應有單一責任。盡可能設計管道,以便重複使用已驗證的元件,例如 Google Cloud Pipeline 元件。
使用 Kubeflow Pipelines SDK 建構任何自訂元件,以便實作機器學習工作流程。元件是一組獨立的程式碼,用於執行機器學習工作流程中的步驟。請使用下列選項建立管道元件。
將元件的程式碼封裝為容器映像檔。這個選項可讓您在管道中加入以任何語言編寫的程式碼,這些語言可封裝為容器映像檔。
將元件的程式碼做為獨立的 Python 函式導入,並使用 Kubeflow Pipelines SDK 將函式封裝為元件。這個選項可讓您更輕鬆地建構以 Python 為基礎的元件。
將管道建構為 Python 函式。
使用 Kubeflow Pipelines SDK 編譯器編譯管道。
from kfp import compiler compiler.Compiler().compile( pipeline_func=PIPELINE_FUNCTION, package_path=PIPELINE_PACKAGE_PATH)
更改下列內容:
- PIPELINE_FUNCTION:管道函式的名稱。
- PIPELINE_PACKAGE_PATH:要儲存編譯後管道的路徑。
在管道中存取 Google Cloud 資源
如果您在執行管道時未指定服務帳戶,Vertex AI Pipelines 會使用 Compute Engine 預設服務帳戶執行管道。Vertex AI Pipelines 也會使用管道執行作業的服務帳戶,授權管道存取Google Cloud 資源。根據預設,Compute Engine 預設服務帳戶具備專案編輯者角色。這可能會讓管道過度存取 Google Cloud 專案 Google Cloud 中的資源。
建議您建立服務帳戶來執行管道,然後為這個帳戶授予執行管道所需 Google Cloud 資源的精細權限。
進一步瞭解如何使用 Identity and Access Management 建立服務帳戶,以及管理服務帳戶的存取權。
讓管道保持最新狀態
您用來建構及執行管道的 SDK 用戶端和容器映像檔,會定期更新為新版本,以便修補安全漏洞並新增新功能。為確保 pipeline 能隨時更新至最新版本,建議您採取下列做法:
請參閱 Vertex AI 架構支援政策和支援的架構清單。
訂閱 Vertex AI 版本說明和您使用的 SDK (Kubeflow Pipelines SDK、Google Cloud Pipeline Components SDK 或 TensorFlow Extended SDK) 的 PyPi.org RSS 動態消息,隨時掌握新版本。
如果管道範本或定義參照的容器有安全漏洞,您應採取下列行動:
安裝最新的修補版 SDK。
重新建構並重新編譯管道範本或定義。
將範本或定義重新上傳至 Artifact Registry 或 Cloud Storage。
後續步驟
- 請參閱 Vertex AI 管道簡介,進一步瞭解如何自動化調度管理機器學習工作流程。
- 瞭解如何執行管道。
- 視覺化呈現及分析管道執行結果。