使用 Private Service Connect 從內部部署環境存取訓練管道


Vertex AI Pipelines 是一項代管服務,可協助您在 Google Cloud 平台上建構、部署及管理端對端機器學習 (ML) 工作流程。這項服務提供無伺服器環境來執行管道,因此您不必擔心基礎架構管理問題。

在本教學課程中,您將使用 Vertex AI Pipelines 執行自訂訓練工作,並在混合式網路環境中,於 Vertex AI 部署訓練好的模型。

整個程序需要 2 到 3 個小時才能完成,包括管道執行作業約 50 分鐘。

本教學課程適用於熟悉 Vertex AI、虛擬私有雲 (VPC)、 Google Cloud 控制台和 Cloud Shell 的企業網路管理員、資料科學家和研究人員。熟悉 Vertex AI Workbench 有助於瞭解本課程,但並非必要條件。

使用 Private Service Connect 存取訓練管道的架構圖。

目標

  • 建立兩個虛擬私有雲 (VPC) 網路:
    • 其中一個 (vertex-networking-vpc) 是使用 Vertex AI Pipelines API 建立及代管 pipeline 範本,用於訓練機器學習模型並部署至端點。
    • 另一個 (onprem-dataservice-vpc) 則代表內部部署網路。
  • 請按照下列步驟連結這兩個 VPC 網路:
    • 部署高可用性 VPN 閘道、Cloud VPN 通道和 Cloud Router,以連線 vertex-networking-vpconprem-dataservice-vpc
    • 建立 Private Service Connect (PSC) 端點,將私密要求轉送至 Vertex AI Pipelines REST API。
    • vertex-networking-vpc 中設定 Cloud Router 自訂路徑通告,向 onprem-dataservice-vpc 公告 Private Service Connect 端點的路徑。
  • onprem-dataservice-vpc VPC 網路中建立 Filestore 執行個體,並在 NFS 共用區中新增訓練資料。
  • 為訓練工作建立 Python 套件應用程式。
  • 建立 Vertex AI Pipelines 工作範本,以執行下列操作:
    • 在 NFS 共用區的資料上建立及執行訓練工作。
    • 匯入訓練好的模型,並上傳至 Vertex AI Model Registry。
    • 建立 Vertex AI 線上預測端點。
    • 將模型部署至端點。
  • 將管道範本上傳至 Artifact Registry 存放區。
  • 使用 Vertex AI Pipelines REST API,從地端資料服務主機 (on-prem-dataservice-host) 觸發 pipeline 執行。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。

事前準備

  1. In the Google Cloud console, go to the project selector page.

    Go to project selector

  2. Select or create a Google Cloud project.

  3. Verify that billing is enabled for your Google Cloud project.

  4. 開啟 Cloud Shell,執行本教學課程中列出的指令。Cloud Shell 是一種互動式殼層環境,可讓您透過網路瀏覽器管理專案和資源。 Google Cloud
  5. 在 Cloud Shell 中,將目前的專案設為您的 Google Cloud 專案 ID,並將該專案 ID 儲存至 projectid 殼層變數:
      projectid="PROJECT_ID"
      gcloud config set project ${projectid}
    PROJECT_ID 替換為專案 ID。如有需要,您可以在 Google Cloud 控制台中找到專案 ID。詳情請參閱「找出專案 ID」。
  6. 如果您不是專案擁有者,請要求專案擁有者授予您專案 IAM 管理員 (roles/resourcemanager.projectIamAdmin) 角色。您必須具備這個角色,才能在下一個步驟中授予 IAM 角色。
  7. Make sure that you have the following role or roles on the project: roles/artifactregistry.admin, roles/artifactregistry.repoAdmin, roles/compute.instanceAdmin.v1, roles/compute.networkAdmin, roles/compute.securityAdmin, roles/dns.admin, roles/file.editor, roles/logging.viewer, roles/logging.admin, roles/notebooks.admin, roles/iam.serviceAccountAdmin, roles/iam.serviceAccountUser, roles/servicedirectory.editor, roles/servicemanagement.quotaAdmin, roles/serviceusage.serviceUsageAdmin, roles/storage.admin, roles/storage.objectAdmin, roles/aiplatform.admin, roles/aiplatform.user, roles/aiplatform.viewer, roles/iap.admin, roles/iap.tunnelResourceAccessor, roles/resourcemanager.projectIamAdmin

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      前往 IAM
    2. 選取專案。
    3. 按一下 「授予存取權」
    4. 在「New principals」(新增主體) 欄位中,輸入您的使用者 ID。 這通常是 Google 帳戶的電子郵件地址。

    5. 在「Select a role」(選取角色) 清單中,選取角色。
    6. 如要授予其他角色,請按一下 「新增其他角色」,然後新增每個其他角色。
    7. 按一下 [Save]
  8. Enable the DNS, Artifact Registry, IAM, Compute Engine, Cloud Logging, Network Connectivity, Notebooks, Cloud Filestore, Service Networking, Service Usage, and Vertex AI APIs.

    Enable the APIs

建立虛擬私有雲網路

在本節中,您會建立兩個虛擬私有雲網路:一個用於存取 Vertex AI Pipelines 的 Google API,另一個則用於模擬地端網路。在兩個虛擬私有雲網路中,您會建立 Cloud Router 和 Cloud NAT 閘道。Cloud NAT 閘道可為沒有外部 IP 位址的 Compute Engine 虛擬機器 (VM) 執行個體提供傳出連線。

  1. 在 Cloud Shell 中執行下列指令,並將 PROJECT_ID 替換為您的專案 ID:

    projectid=PROJECT_ID
    gcloud config set project ${projectid}
    
  2. 建立 vertex-networking-vpc 虛擬私有雲網路:

    gcloud compute networks create vertex-networking-vpc \
        --subnet-mode custom
    
  3. vertex-networking-vpc 網路中,建立名為 pipeline-networking-subnet1 的子網路,主要 IPv4 範圍為 10.0.0.0/24

    gcloud compute networks subnets create pipeline-networking-subnet1 \
        --range=10.0.0.0/24 \
        --network=vertex-networking-vpc \
        --region=us-central1 \
        --enable-private-ip-google-access
    
  4. 建立虛擬私有雲網路,模擬內部部署網路 (onprem-dataservice-vpc):

    gcloud compute networks create onprem-dataservice-vpc \
        --subnet-mode custom
    
  5. onprem-dataservice-vpc 網路中,建立名為 onprem-dataservice-vpc-subnet1 的子網路,主要 IPv4 範圍為 172.16.10.0/24

    gcloud compute networks subnets create onprem-dataservice-vpc-subnet1 \
        --network onprem-dataservice-vpc \
        --range 172.16.10.0/24 \
        --region us-central1 \
        --enable-private-ip-google-access
    

確認虛擬私有雲網路設定正確無誤

  1. 在 Google Cloud 控制台中,前往「VPC networks」(虛擬私有雲網路) 頁面的「Networks in current project」(目前專案中的網路) 分頁。

    前往「VPC networks」(虛擬私有雲網路)

  2. 在虛擬私有雲網路清單中,確認已建立兩個網路:vertex-networking-vpconprem-dataservice-vpc

  3. 按一下「目前專案中的子網路」分頁。

  4. 在虛擬私有雲子網路清單中,確認已建立 pipeline-networking-subnet1onprem-dataservice-vpc-subnet1 子網路。

設定混合式連線

在本節中,您將建立兩個互相連線的高可用性 VPN 閘道。其中一個位於 vertex-networking-vpc 虛擬私有雲網路。另一個則位於 onprem-dataservice-vpc 虛擬私有雲網路。每個閘道都包含 Cloud Router 和一對 VPN 通道。

建立高可用性 VPN 閘道

  1. 在 Cloud Shell 中,為 vertex-networking-vpc 虛擬私有雲網路建立高可用性 VPN 閘道:

    gcloud compute vpn-gateways create vertex-networking-vpn-gw1 \
        --network vertex-networking-vpc \
        --region us-central1
    
  2. onprem-dataservice-vpc 虛擬私有雲網路建立高可用性 VPN 閘道:

    gcloud compute vpn-gateways create onprem-vpn-gw1 \
        --network onprem-dataservice-vpc \
        --region us-central1
    
  3. 在 Google Cloud 控制台中,前往「VPN」頁面的「Cloud VPN Gateways」(Cloud VPN 閘道) 分頁標籤。

    前往 VPN

  4. 確認已建立兩個閘道 (vertex-networking-vpn-gw1onprem-vpn-gw1),且每個閘道都有兩個介面 IP 位址。

建立 Cloud Router 和 Cloud NAT 閘道

在兩個虛擬私有雲網路中,您會建立兩個 Cloud Router:一個用於 Cloud NAT,另一個則用於管理高可用性 VPN 的 BGP 工作階段。

  1. 在 Cloud Shell 中,為將用於 VPN 的 vertex-networking-vpc VPC 網路建立 Cloud Router:

    gcloud compute routers create vertex-networking-vpc-router1 \
        --region us-central1 \
        --network vertex-networking-vpc \
        --asn 65001
    
  2. 為用於 VPN 的 onprem-dataservice-vpc VPC 網路建立 Cloud Router:

    gcloud compute routers create onprem-dataservice-vpc-router1 \
        --region us-central1 \
        --network onprem-dataservice-vpc \
        --asn 65002
    
  3. 為 Cloud NAT 使用的 vertex-networking-vpc 虛擬私有雲網路建立 Cloud Router:

    gcloud compute routers create cloud-router-us-central1-vertex-nat \
        --network vertex-networking-vpc \
        --region us-central1
    
  4. 在 Cloud Router 上設定 Cloud NAT 閘道:

    gcloud compute routers nats create cloud-nat-us-central1 \
        --router=cloud-router-us-central1-vertex-nat \
        --auto-allocate-nat-external-ips \
        --nat-all-subnet-ip-ranges \
        --region us-central1
    
  5. 為 Cloud NAT 使用的 onprem-dataservice-vpc VPC 網路建立 Cloud Router:

    gcloud compute routers create cloud-router-us-central1-onprem-nat \
        --network onprem-dataservice-vpc \
        --region us-central1
    
  6. 在 Cloud Router 上設定 Cloud NAT 閘道:

    gcloud compute routers nats create cloud-nat-us-central1-on-prem \
        --router=cloud-router-us-central1-onprem-nat \
        --auto-allocate-nat-external-ips \
        --nat-all-subnet-ip-ranges \
        --region us-central1
    
  7. 前往 Google Cloud 控制台的「Cloud Routers」頁面。

    前往 Cloud Router

  8. 在「Cloud Routers」清單中,確認已建立下列路由器:

    • cloud-router-us-central1-onprem-nat
    • cloud-router-us-central1-vertex-nat
    • onprem-dataservice-vpc-router1
    • vertex-networking-vpc-router1

    您可能需要重新整理 Google Cloud 控制台瀏覽器分頁,才能看到新值。

  9. 在 Cloud Router 清單中,按一下 cloud-router-us-central1-vertex-nat

  10. 在「路由器詳細資料」頁面中,確認已建立 cloud-nat-us-central1 Cloud NAT 閘道。

  11. 按一下 返回箭頭,返回「Cloud Routers」頁面。

  12. 在 Cloud Router 清單中,按一下 cloud-router-us-central1-onprem-nat

  13. 在「路由器詳細資料」頁面中,確認已建立 cloud-nat-us-central1-on-prem Cloud NAT 閘道。

建立 VPN 通道

  1. 在 Cloud Shell 中,於 vertex-networking-vpc 網路中建立名為 vertex-networking-vpc-tunnel0 的 VPN 通道:

    gcloud compute vpn-tunnels create vertex-networking-vpc-tunnel0 \
        --peer-gcp-gateway onprem-vpn-gw1 \
        --region us-central1 \
        --ike-version 2 \
        --shared-secret [ZzTLxKL8fmRykwNDfCvEFIjmlYLhMucH] \
        --router vertex-networking-vpc-router1 \
        --vpn-gateway vertex-networking-vpn-gw1 \
        --interface 0
    
  2. vertex-networking-vpc 網路中,建立名為 vertex-networking-vpc-tunnel1 的 VPN 通道:

    gcloud compute vpn-tunnels create vertex-networking-vpc-tunnel1 \
        --peer-gcp-gateway onprem-vpn-gw1 \
        --region us-central1 \
        --ike-version 2 \
        --shared-secret [bcyPaboPl8fSkXRmvONGJzWTrc6tRqY5] \
        --router vertex-networking-vpc-router1 \
        --vpn-gateway vertex-networking-vpn-gw1 \
        --interface 1
    
  3. onprem-dataservice-vpc 網路中,建立名為 onprem-dataservice-vpc-tunnel0 的 VPN 通道:

    gcloud compute vpn-tunnels create onprem-dataservice-vpc-tunnel0 \
        --peer-gcp-gateway vertex-networking-vpn-gw1 \
        --region us-central1\
        --ike-version 2 \
        --shared-secret [ZzTLxKL8fmRykwNDfCvEFIjmlYLhMucH] \
        --router onprem-dataservice-vpc-router1 \
        --vpn-gateway onprem-vpn-gw1 \
        --interface 0
    
  4. onprem-dataservice-vpc 網路中,建立名為 onprem-dataservice-vpc-tunnel1 的 VPN 通道:

    gcloud compute vpn-tunnels create onprem-dataservice-vpc-tunnel1 \
        --peer-gcp-gateway vertex-networking-vpn-gw1 \
        --region us-central1\
        --ike-version 2 \
        --shared-secret [bcyPaboPl8fSkXRmvONGJzWTrc6tRqY5] \
        --router onprem-dataservice-vpc-router1 \
        --vpn-gateway onprem-vpn-gw1 \
        --interface 1
    
  5. 前往 Google Cloud 控制台的「VPN」頁面。

    前往 VPN

  6. 在 VPN 通道清單中,確認已建立四個 VPN 通道。

建立 BGP 工作階段

Cloud Router 會透過邊界閘道通訊協定 (BGP),在 VPC 網路 (本例中為 vertex-networking-vpc) 與地端部署網路 (以 onprem-dataservice-vpc 表示) 之間交換路徑。在 Cloud Router 上,您會為地端部署路由器設定介面和 BGP 對等互連。這個介面和 BGP 對等點設定組合起來,就會形成 BGP 工作階段。在本節中,您將為 vertex-networking-vpc 建立兩個 BGP 工作階段,並為 onprem-dataservice-vpc 建立兩個 BGP 工作階段。

設定路由器之間的介面和 BGP 對等互連後,路由器就會自動開始交換路徑。

為「vertex-networking-vpc」建立 BGP 工作階段

  1. 在 Cloud Shell 中,於 vertex-networking-vpc 網路中為 vertex-networking-vpc-tunnel0 建立 BGP 介面:

    gcloud compute routers add-interface vertex-networking-vpc-router1 \
        --interface-name if-tunnel0-to-onprem \
        --ip-address 169.254.0.1 \
        --mask-length 30 \
        --vpn-tunnel vertex-networking-vpc-tunnel0 \
        --region us-central1
    
  2. vertex-networking-vpc 網路中,為 bgp-onprem-tunnel0 建立 BGP 對等點:

    gcloud compute routers add-bgp-peer vertex-networking-vpc-router1 \
        --peer-name bgp-onprem-tunnel0 \
        --interface if-tunnel0-to-onprem \
        --peer-ip-address 169.254.0.2 \
        --peer-asn 65002 \
        --region us-central1
    
  3. vertex-networking-vpc 網路中,為 vertex-networking-vpc-tunnel1 建立 BGP 介面:

    gcloud compute routers add-interface vertex-networking-vpc-router1 \
        --interface-name if-tunnel1-to-onprem \
        --ip-address 169.254.1.1 \
        --mask-length 30 \
        --vpn-tunnel vertex-networking-vpc-tunnel1 \
        --region us-central1
    
  4. vertex-networking-vpc 網路中,為 bgp-onprem-tunnel1 建立 BGP 對等點:

    gcloud compute routers add-bgp-peer vertex-networking-vpc-router1 \
        --peer-name bgp-onprem-tunnel1 \
        --interface if-tunnel1-to-onprem \
        --peer-ip-address 169.254.1.2 \
        --peer-asn 65002 \
        --region us-central1
    

為「onprem-dataservice-vpc」建立 BGP 工作階段

  1. onprem-dataservice-vpc 網路中,為 onprem-dataservice-vpc-tunnel0 建立 BGP 介面:

    gcloud compute routers add-interface onprem-dataservice-vpc-router1 \
        --interface-name if-tunnel0-to-vertex-networking-vpc \
        --ip-address 169.254.0.2 \
        --mask-length 30 \
        --vpn-tunnel onprem-dataservice-vpc-tunnel0 \
        --region us-central1
    
  2. onprem-dataservice-vpc 網路中,為 bgp-vertex-networking-vpc-tunnel0 建立 BGP 對等點:

    gcloud compute routers add-bgp-peer onprem-dataservice-vpc-router1 \
        --peer-name bgp-vertex-networking-vpc-tunnel0 \
        --interface if-tunnel0-to-vertex-networking-vpc \
        --peer-ip-address 169.254.0.1 \
        --peer-asn 65001 \
        --region us-central1
    
  3. onprem-dataservice-vpc 網路中,為 onprem-dataservice-vpc-tunnel1 建立 BGP 介面:

    gcloud compute routers add-interface onprem-dataservice-vpc-router1  \
        --interface-name if-tunnel1-to-vertex-networking-vpc \
        --ip-address 169.254.1.2 \
        --mask-length 30 \
        --vpn-tunnel onprem-dataservice-vpc-tunnel1 \
        --region us-central1
    
  4. onprem-dataservice-vpc 網路中,為 bgp-vertex-networking-vpc-tunnel1 建立 BGP 對等點:

    gcloud compute routers add-bgp-peer onprem-dataservice-vpc-router1 \
        --peer-name bgp-vertex-networking-vpc-tunnel1 \
        --interface if-tunnel1-to-vertex-networking-vpc \
        --peer-ip-address 169.254.1.1 \
        --peer-asn 65001 \
        --region us-central1
    

驗證 BGP 工作階段建立作業

  1. 前往 Google Cloud 控制台的「VPN」頁面。

    前往 VPN

  2. 在 VPN 通道清單中,確認每個通道的「BGP 工作階段狀態」欄值已從「設定 BGP 工作階段」變更為「已建立 BGP」。您可能需要重新整理 Google Cloud 控制台瀏覽器分頁,才能看到新值。

驗證onprem-dataservice-vpc已知的路徑

  1. 在 Google Cloud 控制台中,前往「VPC networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 在虛擬私有雲網路清單中,按一下 onprem-dataservice-vpc

  3. 按一下「Routes」(路徑) 分頁標籤。

  4. 在「Region」(區域) 清單中選取「us-central1 (Iowa)」(us-central1 (愛荷華州)),然後按一下「View」(查看)

  5. 在「目的地 IP 範圍」欄中,確認 pipeline-networking-subnet1 子網路 IP 範圍 (10.0.0.0/24) 出現兩次。

    您可能需要重新整理 Google Cloud 控制台瀏覽器分頁,才能看到這兩個項目。

驗證vertex-networking-vpc已知的路徑

  1. 按一下返回箭頭,返回「VPC 網路」頁面。

  2. 在虛擬私有雲網路清單中,按一下 vertex-networking-vpc

  3. 按一下「Routes」(路徑) 分頁標籤。

  4. 在「Region」(區域) 清單中選取「us-central1 (Iowa)」(us-central1 (愛荷華州)),然後按一下「View」(查看)

  5. 在「Destination IP range」(目的地 IP 範圍) 欄中,確認子網路的 IP 範圍 (172.16.10.0/24) 顯示兩次。onprem-dataservice-vpc-subnet1

為 Google API 建立 Private Service Connect 端點

在本節中,您將為 Google API 建立 Private Service Connect 端點,用於從內部部署網路存取 Vertex AI Pipelines REST API。

  1. 在 Cloud Shell 中,預留用於存取 Google API 的消費者端點 IP 位址:

    gcloud compute addresses create psc-googleapi-ip \
        --global \
        --purpose=PRIVATE_SERVICE_CONNECT \
        --addresses=192.168.0.1 \
        --network=vertex-networking-vpc
    
  2. 建立轉送規則,將端點連線至 Google API 和服務。

    gcloud compute forwarding-rules create pscvertex \
       --global \
       --network=vertex-networking-vpc \
       --address=psc-googleapi-ip \
       --target-google-apis-bundle=all-apis
    

為「vertex-networking-vpc」建立自訂路徑通告

在本節中,您將為 vertex-networking-vpc-router1 (vertex-networking-vpc 的 Cloud Router) 建立自訂路徑通告,將 PSC 端點的 IP 位址通告至 onprem-dataservice-vpc 虛擬私有雲網路。

  1. 前往 Google Cloud 控制台的「Cloud Routers」頁面。

    前往 Cloud Router

  2. 在 Cloud Router 清單中,按一下 vertex-networking-vpc-router1

  3. 在「路由器詳細資料」頁面中,按一下「編輯」

  4. 在「公告路徑」部分,選取「路徑」的「建立自訂路徑」

  5. 選取「公告 Cloud Router 可使用的所有子網路」核取方塊,繼續公告 Cloud Router 可用的子網路。啟用這個選項後,即可模擬預設通告模式下的 Cloud Router 行為。

  6. 按一下「新增自訂路徑」

  7. 在「來源」中選取「自訂 IP 範圍」

  8. 在「IP address range」(IP 位址範圍) 中,輸入下列 IP 位址:

    192.168.0.1
    
  9. 在「說明」中輸入下列文字:

    Custom route to advertise Private Service Connect endpoint IP address
    
  10. 依序按一下 [完成] 及 [儲存]

確認 onprem-dataservice-vpc 已得知要 advertise 的路徑

  1. 前往 Google Cloud 控制台的「Routes」(路徑) 頁面。

    前往「Routes」(路徑)

  2. 在「有效路徑」分頁中,執行下列操作:

    1. 在「Network」(網路) 中選擇 onprem-dataservice-vpc
    2. 在「區域」部分,選擇 us-central1 (Iowa)
    3. 點按「查看」。
    4. 在路徑清單中,確認有兩個名稱開頭為 onprem-dataservice-vpc-router1-bgp-vertex-networking-vpc-tunnel0 的項目,以及兩個名稱開頭為 onprem-dataservice-vpc-router1-bgp-vertex-networking-vpc-tunnel1 的項目。

      如果這些項目沒有立即顯示,請稍候幾分鐘,然後重新整理 Google Cloud 控制台瀏覽器分頁。

    5. 確認其中兩項的「目的地 IP 範圍」192.168.0.1/32,另外兩項為 10.0.0.0/24

onprem-dataservice-vpc 中建立 VM 執行個體

在本節中,您將建立 VM 執行個體,模擬地端資料服務主機。根據 Compute Engine 和 IAM 最佳做法,這個 VM 使用的是使用者管理的服務帳戶,而非 Compute Engine 預設服務帳戶

為 VM 執行個體建立使用者管理的服務帳戶

  1. 在 Cloud Shell 中執行下列指令,並將 PROJECT_ID 替換為您的專案 ID:

    projectid=PROJECT_ID
    gcloud config set project ${projectid}
    
  2. 建立名為 onprem-user-managed-sa 的服務帳戶:

    gcloud iam service-accounts create onprem-user-managed-sa \
        --display-name="onprem-user-managed-sa"
    
  3. Vertex AI 使用者 (roles/aiplatform.user) 角色指派給服務帳戶:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:onprem-user-managed-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/aiplatform.user"
    
  4. 指派 Vertex AI 檢視者 (roles/aiplatform.viewer) 角色:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:onprem-user-managed-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/aiplatform.viewer"
    
  5. 指派 Filestore 編輯者 (roles/file.editor) 角色:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:onprem-user-managed-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/file.editor"
    
  6. 指派服務帳戶管理員 (roles/iam.serviceAccountAdmin) 角色:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:onprem-user-managed-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/iam.serviceAccountAdmin"
    
  7. 指派「服務帳戶使用者 (roles/iam.serviceAccountUser)」角色:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:onprem-user-managed-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/iam.serviceAccountUser"
    
  8. 指派 Artifact Registry Reader (roles/artifactregistry.reader) 角色:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:onprem-user-managed-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/artifactregistry.reader"
    
  9. 指派「Storage 物件管理員 (roles/storage.objectAdmin)」角色:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:onprem-user-managed-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/storage.objectAdmin"
    
  10. 指派「Logging 管理員 (roles/logging.admin)」角色:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:onprem-user-managed-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/logging.admin"
    

建立 on-prem-dataservice-host VM 執行個體

您建立的 VM 執行個體沒有外部 IP 位址,且不允許直接透過網際網路存取。如要啟用 VM 的管理員存取權,請使用 Identity-Aware Proxy (IAP) TCP 轉送功能。

  1. 在 Cloud Shell 中,建立 on-prem-dataservice-host VM 執行個體:

    gcloud compute instances create on-prem-dataservice-host \
        --zone=us-central1-a \
        --image-family=debian-11 \
        --image-project=debian-cloud \
        --subnet=onprem-dataservice-vpc-subnet1 \
        --scopes=https://www.googleapis.com/auth/cloud-platform \
        --no-address \
        --shielded-secure-boot \
        --service-account=onprem-user-managed-sa@$projectid.iam.gserviceaccount.com \
        --metadata startup-script="#! /bin/bash
    sudo apt-get update
    sudo apt-get install tcpdump dnsutils -y"
    
    
  2. 建立防火牆規則,允許 IAP 連線至 VM 執行個體:

    gcloud compute firewall-rules create ssh-iap-on-prem-vpc \
        --network onprem-dataservice-vpc \
        --allow tcp:22 \
        --source-ranges=35.235.240.0/20
    

更新 /etc/hosts 檔案,指向 PSC 端點

在本節中,您會在 /etc/hosts 檔案中新增一行,將傳送至公開服務端點 (us-central1-aiplatform.googleapis.com) 的要求重新導向至 PSC 端點 (192.168.0.1)。

  1. 在 Cloud Shell 中,使用 IAP 登入 on-prem-dataservice-host VM 執行個體:

    gcloud compute ssh on-prem-dataservice-host \
      --zone=us-central1-a \
      --tunnel-through-iap
    
  2. on-prem-dataservice-host VM 執行個體中,使用 vimnano 等文字編輯器開啟 /etc/hosts 檔案,例如:

    sudo vim /etc/hosts
    
  3. 在檔案中新增下列這行文字:

    192.168.0.1 us-central1-aiplatform.googleapis.com
    

    這行會將 PSC 端點的 IP 位址 (192.168.0.1) 指派給 Vertex AI Google API 的完整網域名稱 (us-central1-aiplatform.googleapis.com)。

    編輯後的檔案應如下所示:

    127.0.0.1       localhost
    ::1             localhost ip6-localhost ip6-loopback
    ff02::1         ip6-allnodes
    ff02::2         ip6-allrouters
    
    192.168.0.1 us-central1-aiplatform.googleapis.com  # Added by you
    172.16.10.6 on-prem-dataservice-host.us-central1-a.c.PROJECT_ID.internal on-prem-dataservice-host  # Added by Google
    169.254.169.254 metadata.google.internal  # Added by Google
    
  4. 按照下列方式儲存檔案:

    • 如果使用 vim,請按下 Esc 鍵,然後輸入 :wq 儲存檔案並結束。
    • 如果使用 nano,請輸入 Control+O 並按下 Enter 儲存檔案,然後輸入 Control+X 結束。
  5. 按照下列方式 Ping Vertex AI API 端點:

    ping us-central1-aiplatform.googleapis.com
    

    ping 指令應傳回下列輸出內容。192.168.0.1 是 PSC 端點 IP 位址:

    PING us-central1-aiplatform.googleapis.com (192.168.0.1) 56(84) bytes of data.
    
  6. 輸入 Control+C 即可退出 ping

  7. 輸入 exit 即可退出 on-prem-dataservice-host VM 執行個體,並返回 Cloud Shell 提示。

設定 Filestore 執行個體的網路

在本節中,您要為虛擬私有雲網路啟用私人服務存取權,為建立 Filestore 執行個體並將其掛接為網路檔案系統 (NFS) 共用區做準備。如要瞭解本節和下一節的內容,請參閱「掛接 NFS 共用資料夾以進行自訂訓練」和「設定 VPC 網路對等互連」。

在虛擬私有雲網路中啟用私人服務連線

在本節中,您會建立 Service Networking 連線,並透過虛擬私有雲網路對等互連,使用該連線啟用虛擬私有雲網路的私人服務存取權。onprem-dataservice-vpc

  1. 在 Cloud Shell 中,使用 gcloud compute addresses create 設定保留的 IP 位址範圍:

    gcloud compute addresses create filestore-subnet \
       --global \
       --purpose=VPC_PEERING \
       --addresses=10.243.208.0 \
       --prefix-length=24 \
       --description="filestore subnet" \
       --network=onprem-dataservice-vpc
    
  2. 使用 gcloud services vpc-peerings connect,在虛擬私有雲網路與 Google 的 Service Networking 之間建立對等互連連線:onprem-dataservice-vpc

    gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com \
        --ranges=filestore-subnet \
        --network=onprem-dataservice-vpc
    
  3. 更新虛擬私有雲網路對等互連,啟用匯入及匯出自訂學習路徑:

    gcloud compute networks peerings update servicenetworking-googleapis-com \
        --network=onprem-dataservice-vpc \
        --import-custom-routes \
        --export-custom-routes
    
  4. 在 Google Cloud 控制台中,前往「VPC network peering」(VPC 網路對等互連) 頁面。

    前往「VPC network peering」(虛擬私有雲網路對等互連) 頁面

  5. 在虛擬私有雲對等互連清單中,確認 servicenetworking.googleapis.comonprem-dataservice-vpc 虛擬私有雲網路之間有對等互連項目。

為「filestore-subnet」建立自訂路徑通告

  1. 前往 Google Cloud 控制台的「Cloud Routers」頁面。

    前往 Cloud Router

  2. 在 Cloud Router 清單中,按一下 onprem-dataservice-vpc-router1

  3. 在「路由器詳細資料」頁面中,按一下「編輯」

  4. 在「公告路徑」部分,選取「路徑」的「建立自訂路徑」

  5. 選取「公告 Cloud Router 可使用的所有子網路」核取方塊,繼續公告 Cloud Router 可用的子網路。啟用這個選項後,即可模擬預設通告模式下的 Cloud Router 行為。

  6. 按一下「新增自訂路徑」

  7. 在「來源」中選取「自訂 IP 範圍」

  8. 在「IP address range」(IP 位址範圍) 中,輸入下列 IP 位址範圍:

    10.243.208.0/24
    
  9. 在「說明」中輸入下列文字:

    Filestore reserved IP address range
    
  10. 依序按一下 [完成] 及 [儲存]

onprem-dataservice-vpc 網路中建立 Filestore 執行個體

為虛擬私有雲網路啟用私人服務存取權後,請建立 Filestore 執行個體,並將該執行個體掛接為自訂訓練作業的 NFS 共用區。這可讓訓練工作存取遠端檔案,就像存取本機檔案一樣,進而實現高總處理量和低延遲。

建立 Filestore 執行個體

  1. 前往 Google Cloud 控制台的「Filestore Instances」(Filestore 執行個體) 頁面

    前往「Filestore Instances」(Filestore 執行個體)

  2. 按一下「建立執行個體」,然後按照下列方式設定執行個體:

    • 將「Instance ID」(執行個體 ID) 設為下列值:

      image-data-instance
      
    • 將「Instance type」(執行個體類型) 設定為「Basic」(基本)

    • 將「儲存空間類型」設為「HDD」

    • 將「Allocate capacity」(分配容量) 設為 1 TiB

    • 將「Region」(地區) 設為 us-central1,「Zone」(區域) 設為 us-central1-c

    • 將「VPC network」(虛擬私有雲網路) 設為 onprem-dataservice-vpc

    • 將「已分配的 IP 範圍」設為「使用已分配的現有 IP 範圍」,然後選擇 filestore-subnet

    • 將「File share name」(檔案共用區名稱) 設為下列項目:

      vol1
      
    • 將「存取控制」設為「為虛擬私有雲網路中的所有用戶端授予存取權限」

  3. 點選「建立」

  4. 記下新 Filestore 執行個體的 IP 位址。您可能需要重新整理控制台瀏覽器分頁,才能看到新執行個體。 Google Cloud

掛接 Filestore 檔案共用區

  1. 在 Cloud Shell 中執行下列指令,並將 PROJECT_ID 替換為您的專案 ID:

    projectid=PROJECT_ID
    gcloud config set project ${projectid}
    
  2. 登入 on-prem-dataservice-host VM 執行個體:

    gcloud compute ssh on-prem-dataservice-host \
        --zone=us-central1-a \
        --tunnel-through-iap
    
  3. 在 VM 執行個體上安裝 NFS 套件:

    sudo apt-get update -y
    sudo apt-get -y install nfs-common
    
  4. 為 Filestore 檔案共用區建立掛接目錄:

    sudo mkdir -p /mnt/nfs
    
  5. 掛接檔案共用區,並將 FILESTORE_INSTANCE_IP 替換為 Filestore 執行個體的 IP 位址:

    sudo mount FILESTORE_INSTANCE_IP:/vol1 /mnt/nfs
    

    如果連線逾時,請檢查您是否提供 Filestore 執行個體的正確 IP 位址。

  6. 執行下列指令,確認 NFS 掛接作業是否成功:

    df -h
    

    確認結果中顯示 /mnt/nfs 檔案共用:

    Filesystem           Size  Used Avail Use% Mounted on
    udev                 1.8G     0  1.8G   0% /dev
    tmpfs                368M  396K  368M   1% /run
    /dev/sda1            9.7G  1.9G  7.3G  21% /
    tmpfs                1.8G     0  1.8G   0% /dev/shm
    tmpfs                5.0M     0  5.0M   0% /run/lock
    /dev/sda15           124M   11M  114M   9% /boot/efi
    tmpfs                368M     0  368M   0% /run/user
    10.243.208.2:/vol1  1007G     0  956G   0% /mnt/nfs
    
  7. 變更設定,開放檔案共用區的存取權限:

    sudo chmod go+rw /mnt/nfs
    

將資料集下載到檔案共用區

  1. on-prem-dataservice-host VM 執行個體中,將資料集下載至檔案共用區:

    gcloud storage cp gs://cloud-samples-data/vertex-ai/dataset-management/datasets/fungi_dataset /mnt/nfs/ --recursive
    

    下載作業需要幾分鐘才能完成。

  2. 執行下列指令,確認資料集是否已成功複製:

    sudo du -sh /mnt/nfs
    

    預期的輸出內容如下:

    104M    /mnt/nfs
    
  3. 輸入 exit 即可退出 on-prem-dataservice-host VM 執行個體,並返回 Cloud Shell 提示。

為管道建立暫存 bucket

Vertex AI Pipelines 會使用 Cloud Storage 儲存管道執行的構件。執行管道前,您需要建立 Cloud Storage 值區,做為管道執行的暫存區。

在 Cloud Shell 中,建立 Cloud Storage bucket:

gcloud storage buckets create gs://pipelines-staging-bucket-$projectid --location=us-central1

為 Vertex AI Workbench 建立使用者管理的服務帳戶

  1. 在 Cloud Shell 中建立服務帳戶:

    gcloud iam service-accounts create workbench-sa \
        --display-name="workbench-sa"
    
  2. Vertex AI 使用者 (roles/aiplatform.user) 角色指派給服務帳戶:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/aiplatform.user"
    
  3. 指派 Artifact Registry 管理員 (artifactregistry.admin) 角色:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/artifactregistry.admin"
    
  4. 指派「Storage 管理員 (storage.admin)」角色:

    gcloud projects add-iam-policy-binding $projectid \
        --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
        --role="roles/storage.admin"
    

建立 Python 訓練應用程式

在本節中,您將建立 Vertex AI Workbench 執行個體,並使用該執行個體建立 Python 自訂訓練應用程式套件。

建立 Vertex AI Workbench 執行個體

  1. 前往 Google Cloud 控制台的「Vertex AI Workbench」頁面,然後點選「Instances」分頁標籤。

    前往 Vertex AI Workbench

  2. 依序點選「建立新頻道」和「進階選項」

    「New instance」(新增執行個體) 頁面隨即開啟。

  3. 在「New instance」(新增執行個體) 頁面的「Details」(詳細資料) 區段中,為新執行個體提供下列資訊,然後按一下「Continue」(繼續)

    • 名稱:輸入下列內容,並將 PROJECT_ID 替換為專案 ID:

      pipeline-tutorial-PROJECT_ID
      
    • 地區:選取 us-central1

    • 區域:選取 us-central1-a

    • 取消勾選「Enable Dataproc Serverless Interactive Sessions」(啟用 Dataproc Serverless 互動工作階段) 核取方塊。

  4. 在「環境」部分中,按一下「繼續」

  5. 在「Machine type」(機器類型) 區段中,提供下列資訊,然後按一下「Continue」(繼續)

    • 機器類型:選擇「N1」,然後從「機器類型」選單中選取 n1-standard-4
    • 受防護的 VM:勾選下列核取方塊:

      • 安全啟動
      • 虛擬信任平台模組 (vTPM)
      • 完整性監控
  6. 在「Disks」(磁碟) 區段中,確認已選取 Google-managed encryption key,然後按一下「Continue」(繼續)

  7. 在「Networking」(網路) 專區中,提供下列資訊,然後按一下「Continue」(繼續)

    • 網路:選取「這項專案中的網路」,然後完成下列步驟:

      1. 在「Network」(網路) 欄位中,選取「vertex-networking-vpc」

      2. 在「Subnetwork」(子網路) 欄位中,選取「pipeline-networking-subnet1」

      3. 取消勾選「指派外部 IP 位址」核取方塊。不指派外部 IP 位址可防止執行個體接收來自網際網路或其他虛擬私有雲網路的未經要求通訊。

      4. 勾選「允許 Proxy 存取」核取方塊。

  8. 在「IAM and security」(IAM 和安全性) 部分中,提供下列資訊,然後按一下「繼續」

    • IAM 和安全性:如要將執行個體 JupyterLab 介面的存取權授予單一使用者,請完成下列步驟:

      1. 選取 [服務帳戶]。
      2. 取消勾選「使用 Compute Engine 的預設服務帳戶」核取方塊。 這個步驟非常重要,因為 Compute Engine 預設服務帳戶 (以及您剛才指定的單一使用者) 可能具有專案的「編輯者」角色 (roles/editor)。
      3. 在「Service account email」(服務帳戶電子郵件地址) 欄位中輸入下列內容,並將 PROJECT_ID 替換為專案 ID:

        workbench-sa@PROJECT_ID.iam.gserviceaccount.com
        

        (這是您先前建立的自訂服務帳戶電子郵件地址)。這個服務帳戶的權限有限。

        如要進一步瞭解如何授予存取權,請參閱「管理 Vertex AI Workbench 執行個體 JupyterLab 介面的存取權」。

    • 安全性選項:取消勾選下列核取方塊:

      • 執行個體的根目錄存取權

      勾選下列核取方塊:

      • nbconvertnbconvert 可讓使用者匯出筆記本檔案,並下載為其他檔案類型,例如 HTML、PDF 或 LaTeX。Google Cloud 生成式 AI GitHub 存放區中的部分筆記本需要這項設定。

      取消勾選下列核取方塊:

      • 下載檔案

      除非您位於正式環境,否則請選取下列核取方塊:

      • 終端機存取權:從 JupyterLab 使用者介面內啟用執行個體的終端機存取權。
  9. 在「系統健康狀態」部分中,清除「環境自動升級」,並提供下列資訊:

    • 在「報表」中,勾選下列核取方塊:

      • 回報系統健康狀態
      • 向 Cloud Monitoring 回報自訂指標
      • 安裝 Cloud Monitoring
      • 回報所需 Google 網域的 DNS 狀態
  10. 按一下「建立」,然後等待幾分鐘,讓系統建立 Vertex AI Workbench 執行個體。

在 Vertex AI Workbench 執行個體中執行訓練應用程式

  1. 前往 Google Cloud 控制台的「Vertex AI Workbench」頁面,然後點選「Instances」分頁標籤。

    前往 Vertex AI Workbench

  2. 在 Vertex AI Workbench 執行個體名稱 (pipeline-tutorial-PROJECT_ID) 旁,按一下「Open JupyterLab」(開啟 JupyterLab),其中 PROJECT_ID 是專案 ID。

    Vertex AI Workbench 執行個體會在 JupyterLab 中開啟。

  3. 依序選取「File」>「New」>「Terminal」

  4. 在 JupyterLab 終端機 (不是 Cloud Shell) 中,為專案定義環境變數。將 PROJECT_ID 替換為您的專案 ID:

    projectid=PROJECT_ID
    
  5. 建立訓練應用程式的上層目錄 (仍在 JupyterLab 終端機中):

    mkdir fungi_training_package
    mkdir fungi_training_package/trainer
    
  6. 在「File Browser」 中,依序按兩下 fungi_training_package 資料夾和 trainer 資料夾。

  7. 「File Browser」中, 在空白檔案清單 (「Name」標題下方) 上按一下滑鼠右鍵,然後選取「New file」

  8. 在新檔案上按一下滑鼠右鍵,然後選取「重新命名檔案」

  9. 將檔案從 untitled.txt 重新命名為 task.py

  10. 按兩下 task.py 檔案即可開啟。

  11. 將下列程式碼複製到 task.py

    # Import the libraries
    import tensorflow as tf
    from tensorflow.python.client import device_lib
    import argparse
    import os
    import sys
    # add parser arguments
    parser = argparse.ArgumentParser()
    parser.add_argument('--data-dir', dest='dataset_dir', type=str, 
                     help='Dir to access dataset.')
    parser.add_argument('--model-dir', dest='model_dir', default=os.getenv("AIP_MODEL_DIR"), type=str,
                     help='Dir to save the model.')
    parser.add_argument('--epochs', dest='epochs', default=10, type=int,
                     help='Number of epochs.')
    parser.add_argument('--batch-size', dest='batch_size', default=32, type=int,
                     help='Number of images per batch.')
    parser.add_argument('--distribute', dest='distribute', default='single', type=str, 
                     help='distributed training strategy.')
    args = parser.parse_args()
    # print the tf version and config
    print('Python Version = {}'.format(sys.version))
    print('TensorFlow Version = {}'.format(tf.__version__))
    print('TF_CONFIG = {}'.format(os.environ.get('TF_CONFIG', 'Not found')))
    print('DEVICES', device_lib.list_local_devices())
    
    # Single Machine, single compute device
    if args.distribute == 'single':
        if tf.test.is_gpu_available():
            strategy = tf.distribute.OneDeviceStrategy(device="/gpu:0")
        else:
            strategy = tf.distribute.OneDeviceStrategy(device="/cpu:0")
    # Single Machine, multiple compute device
    elif args.distribute == 'mirror':
        strategy = tf.distribute.MirroredStrategy()
    # Multiple Machine, multiple compute device
    elif args.distribute == 'multi':
        strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()
    
    # Multi-worker configuration
    print('num_replicas_in_sync = {}'.format(strategy.num_replicas_in_sync))
    
    # Preparing dataset
    BUFFER_SIZE = 1000
    IMG_HEIGHT = 224
    IMG_WIDTH = 224
    
    def make_datasets_batched(dataset_path, global_batch_size):
        # Configure the training data generator
        train_data_dir = os.path.join(dataset_path,"train/")
        train_ds = tf.keras.utils.image_dataset_from_directory(
                             train_data_dir,
                             seed=36,
                             image_size=(IMG_HEIGHT, IMG_WIDTH),
                             batch_size=global_batch_size
                   )
        # Configure the validation data generator
        val_data_dir = os.path.join(dataset_path,"valid/")
        val_ds = tf.keras.utils.image_dataset_from_directory(
                           val_data_dir,
                           seed=36,
                           image_size=(IMG_HEIGHT, IMG_WIDTH),
                           batch_size=global_batch_size
                 )
        # get the number of classes in the data
        num_classes = len(train_ds.class_names)
    
        # Configure the dataset for performance
        AUTOTUNE = tf.data.AUTOTUNE
        train_ds = train_ds.cache().shuffle(BUFFER_SIZE).prefetch(buffer_size=AUTOTUNE)
        val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
        return train_ds, val_ds, num_classes
    
    # Build the Keras model
    def build_and_compile_cnn_model(num_classes):
        # build a CNN model
        model = tf.keras.models.Sequential([
          tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
          tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
          tf.keras.layers.MaxPooling2D(),
          tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
          tf.keras.layers.MaxPooling2D(),
          tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
          tf.keras.layers.MaxPooling2D(),
          tf.keras.layers.Flatten(),
          tf.keras.layers.Dense(128, activation='relu'),
          tf.keras.layers.Dense(num_classes)
        ])
        # compile the CNN model
        model.compile(optimizer='adam',
                   loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                   metrics=['accuracy'])
        return model
    
    # Get the strategy data
    NUM_WORKERS = strategy.num_replicas_in_sync
    # Here the batch size scales up by number of workers
    GLOBAL_BATCH_SIZE = args.batch_size * NUM_WORKERS
    
    # Create dataset generator objects
    train_ds, val_ds, num_classes = make_datasets_batched(args.dataset_dir, GLOBAL_BATCH_SIZE)
    # Compile the model
    with strategy.scope():
        # Creation of dataset, and model building/compiling need to be within
        # `strategy.scope()`.
        model = build_and_compile_cnn_model(num_classes)
    # fit the model on the data
    history = model.fit(train_ds, validation_data=val_ds, epochs=args.epochs)
    # save the model to the output dir
    model.save(args.model_dir)
    
  12. 選取「檔案」> 儲存 Python 檔案

  13. 在 JupyterLab 終端機中,於每個子目錄建立 __init__.py 檔案,將子目錄設為套件:

    touch fungi_training_package/__init__.py
    touch fungi_training_package/trainer/__init__.py
    
  14. 在「檔案瀏覽器」中,按兩下 fungi_training_package 資料夾。

  15. 依序選取「File」>「New」>「Python file」

  16. 在新檔案上按一下滑鼠右鍵,然後選取「重新命名檔案」

  17. 將檔案從 untitled.py 重新命名為 setup.py

  18. 按兩下 setup.py 檔案即可開啟。

  19. 將下列程式碼複製到 setup.py

    from setuptools import find_packages
    from setuptools import setup
    setup(
       name='trainer',
       version='0.1',
       packages=find_packages(),
       include_package_data=True,
       description='Training application package for fungi-classification.'
    )
    
  20. 選取「檔案」> 儲存 Python 檔案

  21. 在終端機中,前往 fungi_training_package 目錄:

    cd fungi_training_package
    
  22. 使用 sdist 指令建立訓練應用程式的來源發布內容:

    python setup.py sdist --formats=gztar
    
  23. 前往父項目錄:

    cd ..
    
  24. 確認您位於正確的目錄:

    pwd
    

    輸出如下所示:

    /home/jupyter
    
  25. 將 Python 套件複製到暫存值區:

    gcloud storage cp fungi_training_package/dist/trainer-0.1.tar.gz gs://pipelines-staging-bucket-$projectid/training_package/
    
  26. 確認暫存 bucket 包含套件:

    gcloud storage ls gs://pipelines-staging-bucket-$projectid/training_package
    

    輸出內容會如下所示:

    gs://pipelines-staging-bucket-PROJECT_ID/training_package/trainer-0.1.tar.gz
    

為 Vertex AI Pipelines 建立 Service Networking 連線

本節會建立 Service Networking 連線,用於透過虛擬私有雲網路對等互連,建立連至 vertex-networking-vpc 虛擬私有雲網路的生產端服務。詳情請參閱「虛擬私有雲網路對等互連」。

  1. 在 Cloud Shell 中執行下列指令,並將 PROJECT_ID 替換為您的專案 ID:

    projectid=PROJECT_ID
    gcloud config set project ${projectid}
    
  2. 使用 gcloud compute addresses create 設定保留的 IP 位址範圍:

    gcloud compute addresses create vertex-pipeline-subnet \
        --global \
        --purpose=VPC_PEERING \
        --addresses=192.168.10.0 \
        --prefix-length=24 \
        --description="pipeline subnet" \
        --network=vertex-networking-vpc
    
  3. 使用 gcloud services vpc-peerings connect,在虛擬私有雲網路與 Google 的 Service Networking 之間建立對等互連連線:vertex-networking-vpc

    gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com \
        --ranges=vertex-pipeline-subnet \
        --network=vertex-networking-vpc
    
  4. 更新虛擬私有雲對等互連連線,啟用自訂學習路徑的匯入和匯出功能:

    gcloud compute networks peerings update servicenetworking-googleapis-com \
        --network=vertex-networking-vpc \
        --import-custom-routes \
        --export-custom-routes
    
  1. 前往 Google Cloud 控制台的「Cloud Router」頁面。

    前往 Cloud Router

  2. 在 Cloud Router 清單中,按一下 vertex-networking-vpc-router1

  3. 在「路由器詳細資料」頁面中,按一下「編輯」

  4. 按一下「新增自訂路徑」

  5. 在「來源」中選取「自訂 IP 範圍」

  6. 在「IP address range」(IP 位址範圍) 中,輸入下列 IP 位址範圍:

    192.168.10.0/24
    
  7. 在「說明」中輸入下列文字:

    Vertex AI Pipelines reserved subnet
    
  8. 依序按一下 [完成] 及 [儲存]

建立管道範本並上傳至 Artifact Registry

在本節中,您將建立並上傳 Kubeflow Pipelines (KFP) 管道範本。這個範本包含可重複使用的工作流程定義,可供單一或多位使用者使用。

定義及編譯管道

  1. 在 Jupyterlab 的「File Browser」中,按兩下頂層資料夾。

  2. 依序選取「File」>「New」>「Notebook」

  3. 在「Select Kernel」選單中,選取 Python 3 (ipykernel) 並按一下「Select」

  4. 在新的筆記本儲存格中執行下列指令,確認您擁有最新版本的 pip

    !python -m pip install --upgrade pip
    
  5. 執行下列指令,從 Python 套件索引 (PyPI) 安裝 Google Cloud Pipeline Components SDK:

    !pip install --upgrade google-cloud-pipeline-components
    
  6. 安裝完成後,請選取「Kernel」>「Restart kernel」重新啟動核心,並確保程式庫可用於匯入。

  7. 在新的筆記本儲存格中執行下列程式碼,定義管道:

    from kfp import dsl
    # define the train-deploy pipeline
    @dsl.pipeline(name="custom-image-classification-pipeline")
    def custom_image_classification_pipeline(
     project: str,
     training_job_display_name: str,
     worker_pool_specs: list,
     base_output_dir: str,
     model_artifact_uri: str,
     prediction_container_uri: str,
     model_display_name: str,
     endpoint_display_name: str,
     network: str = '',
     location: str="us-central1",
     serving_machine_type: str="n1-standard-4",
     serving_min_replica_count: int=1,
     serving_max_replica_count: int=1
     ):
     from google_cloud_pipeline_components.types import artifact_types
     from google_cloud_pipeline_components.v1.custom_job import CustomTrainingJobOp
     from google_cloud_pipeline_components.v1.model import ModelUploadOp
     from google_cloud_pipeline_components.v1.endpoint import (EndpointCreateOp,
                                                               ModelDeployOp)
     from kfp.dsl import importer
    
     # Train the model task
     custom_job_task = CustomTrainingJobOp(
          project=project,
          display_name=training_job_display_name,
          worker_pool_specs=worker_pool_specs,
          base_output_directory=base_output_dir,
          location=location,
          network=network
          )
    
     # Import the model task
     import_unmanaged_model_task = importer(
          artifact_uri=model_artifact_uri,
          artifact_class=artifact_types.UnmanagedContainerModel,
          metadata={
             "containerSpec": {
                "imageUri": prediction_container_uri,
                },
             },
             ).after(custom_job_task)
     # Model upload task
     model_upload_op = ModelUploadOp(
          project=project,
          display_name=model_display_name,
          unmanaged_container_model=import_unmanaged_model_task.outputs["artifact"],
          )
     model_upload_op.after(import_unmanaged_model_task)
     # Create Endpoint task
     endpoint_create_op = EndpointCreateOp(
          project=project,
          display_name=endpoint_display_name,
          )
     # Deploy the model to the endpoint
     ModelDeployOp(
          endpoint=endpoint_create_op.outputs["endpoint"],
          model=model_upload_op.outputs["model"],
          dedicated_resources_machine_type=serving_machine_type,
          dedicated_resources_min_replica_count=serving_min_replica_count,
          dedicated_resources_max_replica_count=serving_max_replica_count,
          )
    
  8. 在新的筆記本儲存格中執行下列程式碼,編譯管道定義:

    from kfp import compiler 
    PIPELINE_FILE = "pipeline_config.yaml"
    compiler.Compiler().compile(
        pipeline_func=custom_image_classification_pipeline,
        package_path=PIPELINE_FILE,
    )
    

    「檔案瀏覽器」中,檔案清單會顯示名為 pipeline_config.yaml 的檔案。

建立 Artifact Registry 存放區

  1. 在新的筆記本儲存格中執行下列程式碼,建立 KFP 類型的構件存放區:

    REPO_NAME="fungi-repo"
    REGION="us-central1"
    !gcloud artifacts repositories create $REPO_NAME --location=$REGION --repository-format=KFP
    

將管道範本上傳至 Artifact Registry

在本節中,您會設定 Kubeflow Pipelines SDK 登錄用戶端,並從 JupyterLab 筆記本將已編譯的管道範本上傳至 Artifact Registry。

  1. 在 JupyterLab 筆記本中執行下列程式碼,上傳管道範本,並將 PROJECT_ID 替換為您的專案 ID:

    PROJECT_ID = "PROJECT_ID"
    from kfp.registry import RegistryClient
    host = f"https://{REGION}-kfp.pkg.dev/{PROJECT_ID}/{REPO_NAME}"
    client = RegistryClient(host=host)
    TEMPLATE_NAME, VERSION_NAME = client.upload_pipeline(
       file_name=PIPELINE_FILE,
       tags=["v1", "latest"],
       extra_headers={"description":"This is an example pipeline template."})
    
  2. 在 Google Cloud 控制台中,如要確認範本已上傳,請前往 Vertex AI Pipelines 範本

    前往 Pipelines

  3. 如要開啟「Select repository」(選取存放區) 窗格,請按一下「Select repository」(選取存放區)

  4. 在存放區清單中,按一下您建立的存放區 (fungi-repo),然後按一下「選取」

  5. 確認管道 (custom-image-classification-pipeline) 顯示在清單中。

從地端觸發管道執行作業

在本節中,管道範本和訓練套件都已準備就緒,您將使用 cURL 從地端應用程式觸發管道執行作業。

提供管道參數

  1. 在 JupyterLab 筆記本中,執行下列指令來驗證管道範本名稱:

    print (TEMPLATE_NAME)
    

    傳回的範本名稱為:

    custom-image-classification-pipeline
    
  2. 執行下列指令,取得管道範本版本:

    print (VERSION_NAME)
    

    傳回的管道範本版本名稱如下所示:

    sha256:41eea21e0d890460b6e6333c8070d7d23d314afd9c7314c165efd41cddff86c7
    

    請記下整個版本名稱字串。

  3. 在 Cloud Shell 中執行下列指令,並將 PROJECT_ID 替換為您的專案 ID:

    projectid=PROJECT_ID
    gcloud config set project ${projectid}
    
  4. 登入 on-prem-dataservice-host VM 執行個體:

    gcloud compute ssh on-prem-dataservice-host \
        --zone=us-central1-a \
        --tunnel-through-iap
    
  5. on-prem-dataservice-host VM 執行個體中,使用文字編輯器 (例如 vimnano) 建立 request_body.json 檔案,例如:

    sudo vim request_body.json
    
  6. 將下列這行文字新增到 request_body.json 檔案:

    {
    "displayName": "fungi-image-pipeline-job",
    "serviceAccount": "onprem-user-managed-sa@PROJECT_ID.iam.gserviceaccount.com",
    "runtimeConfig":{
    "gcsOutputDirectory":"gs://pipelines-staging-bucket-PROJECT_ID/pipeline_root/",
    "parameterValues": {
       "project": "PROJECT_ID",
       "training_job_display_name": "fungi-image-training-job",
       "worker_pool_specs": [{
          "machine_spec": {
             "machine_type": "n1-standard-4"
          },
          "replica_count": 1,
          "python_package_spec":{
             "executor_image_uri":"us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-8.py310:latest", 
             "package_uris": ["gs://pipelines-staging-bucket-PROJECT_ID/training_package/trainer-0.1.tar.gz"],
             "python_module": "trainer.task",
             "args": ["--data-dir","/mnt/nfs/fungi_dataset/", "--epochs", "10"],
             "env": [{"name": "AIP_MODEL_DIR", "value": "gs://pipelines-staging-bucket-PROJECT_ID/model/"}]
          },
          "nfs_mounts": [{
             "server": "FILESTORE_INSTANCE_IP",
             "path": "/vol1",
             "mount_point": "/mnt/nfs/"
          }]
       }],
       "base_output_dir":"gs://pipelines-staging-bucket-PROJECT_ID",
       "model_artifact_uri":"gs://pipelines-staging-bucket-PROJECT_ID/model/",
       "prediction_container_uri":"us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest",
       "model_display_name":"fungi-image-model",
       "endpoint_display_name":"fungi-image-endpoint",
       "location": "us-central1",
       "serving_machine_type":"n1-standard-4",
       "network":"projects/PROJECT_NUMBER/global/networks/vertex-networking-vpc"
         }
    },
    "templateUri": "https://us-central1-kfp.pkg.dev/PROJECT_ID/fungi-repo/custom-image-classification-pipeline/latest",
    "templateMetadata": {
       "version":"VERSION_NAME"
    }
    }
    

    替換下列值:

    • PROJECT_ID:您的專案 ID
    • PROJECT_NUMBER:專案編號。這與專案 ID 不同。您可以在Google Cloud 控制台的專案「Project Settings」(專案設定) 頁面中找到專案編號。
    • FILESTORE_INSTANCE_IP:Filestore 執行個體 IP 位址,例如 10.243.208.2。您可以在執行個體的 Filestore 執行個體頁面中找到這項資訊。
    • VERSION_NAME:您在步驟 2 中記下的管道範本版本名稱 (sha256:...)。
  7. 按照下列方式儲存檔案:

    • 如果使用 vim,請按下 Esc 鍵,然後輸入 :wq 儲存檔案並結束。
    • 如果使用 nano,請輸入 Control+O 並按下 Enter 儲存檔案,然後輸入 Control+X 結束。

從範本提交管道執行作業

  1. on-prem-dataservice-host VM 執行個體中執行下列指令,並將 PROJECT_ID 替換為您的專案 ID:

    curl -v -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request_body.json \
    https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/pipelineJobs
    

    您會看到很長的輸出內容,但主要需要尋找的是下列這行,表示服務正在準備執行管道:

    "state": "PIPELINE_STATE_PENDING"
    

    整個 pipeline 執行作業約需 45 到 50 分鐘。

  2. 在 Google Cloud 控制台的「Vertex AI」專區,前往「Pipelines」頁面的「Runs」分頁。

    前往「Runs」

  3. 按一下管道執行的執行名稱 (custom-image-classification-pipeline)。

    系統會顯示管道執行頁面,並顯示管道的執行階段圖表。 管道摘要會顯示在「Pipeline run analysis」(管道執行作業分析結果) 窗格中。

    如要瞭解如何解讀執行階段圖表顯示的資訊,包括如何查看記錄檔及使用 Vertex ML Metadata 進一步瞭解管道構件,請參閱「查看及分析管道結果」。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

您可以按照下列步驟刪除專案中的個別資源:

  1. 按照下列步驟刪除所有管道執行作業:

    1. 在 Google Cloud 控制台的「Vertex AI」專區,前往「Pipelines」頁面的「Runs」分頁。

      前往「Runs」

    2. 選取要刪除的管道執行作業,然後按一下「Delete」(刪除)

  2. 按照下列步驟刪除管道範本:

    1. 在「Vertex AI」部分,前往「Pipelines」頁面的「Your templates」分頁。

      前往 Pipelines

    2. 按一下 custom-image-classification-pipeline 管道範本旁的「動作」,然後選取「刪除」

  3. 從 Artifact Registry 刪除存放區,方法如下:

    1. 在「Artifact Registry」頁面中,前往「Repositories」分頁。

      前往存放區

    2. 選取 fungi-repo 存放區,然後按一下 「Delete」

  4. 按照下列步驟從端點取消部署模型:

    1. 在「Vertex AI」部分中,前往「線上預測」頁面的「端點」分頁。

      前往 Endpoints

    2. 按一下 fungi-image-endpoint 前往端點詳細資料頁面。

    3. 在模型所在資料列中,依序點選 fungi-image-model「動作」和「取消部署端點的模型」

    4. 在「取消部署端點中的模型」對話方塊中,按一下「取消部署」

  5. 請按照下列步驟刪除端點:

    1. 在「Vertex AI」部分中,前往「線上預測」頁面的「端點」分頁。

      前往 Endpoints

    2. 選取 fungi-image-endpoint,然後按一下「刪除」

  6. 按照下列步驟刪除模型:

    1. 前往「Model Registry」頁面。

      前往「模型」

    2. 在模型所在的資料列中,依序點選 fungi-image-model「動作」和「刪除模型」

  7. 按照下列步驟刪除暫存 bucket:

    1. 前往「Cloud Storage」頁面。

      前往 Cloud Storage

    2. 選取 pipelines-staging-bucket-PROJECT_ID,其中 PROJECT_ID 是專案 ID,然後按一下「刪除」

  8. 按照下列步驟刪除 Vertex AI Workbench 執行個體:

    1. 在「Vertex AI」專區中,前往「Workbench」頁面的「Instances」分頁。

      前往 Vertex AI Workbench

    2. 選取 pipeline-tutorial-PROJECT_ID Vertex AI Workbench 執行個體,其中 PROJECT_ID 是專案 ID,然後按一下「刪除」

  9. 按照下列步驟刪除 Compute Engine VM 執行個體:

    1. 前往 Compute Engine 頁面。

      前往 Compute Engine

    2. 選取 on-prem-dataservice-host VM 執行個體,然後按一下 「Delete」(刪除)

  10. 請按照下列步驟刪除 VPN 通道:

    1. 前往「VPN」頁面。

      前往 VPN

    2. 在「VPN」頁面中,按一下「Cloud VPN 通道」分頁標籤。

    3. 在 VPN 通道清單中,選取您在本教學課程中建立的四個 VPN 通道,然後按一下 「刪除」

  11. 按照下列步驟刪除高可用性 VPN 閘道:

    1. 在「VPN」頁面中,按一下「Cloud VPN 閘道」分頁標籤。

      前往 Cloud VPN 閘道

    2. 在 VPN 閘道清單中,按一下 onprem-vpn-gw1

    3. 在「Cloud VPN 閘道詳細資料」頁面中,按一下「 刪除 VPN 閘道」

    4. 視需要點按 返回箭頭,返回 VPN 閘道清單,然後點按 vertex-networking-vpn-gw1

    5. 在「Cloud VPN 閘道詳細資料」頁面中,按一下「 刪除 VPN 閘道」

  12. 按照下列步驟刪除 Cloud Router:

    1. 前往「Cloud Routers」頁面。

      前往 Cloud Router

    2. 在 Cloud Router 清單中,選取您在本教學課程中建立的四個路由器。

    3. 如要刪除路由器,請按一下「刪除」

      這項操作也會一併刪除連線至 Cloud Router 的兩個 Cloud NAT 閘道。

  13. 按照下列步驟,刪除與 vertex-networking-vpconprem-dataservice-vpc 虛擬私有雲網路的服務網路連線:

    1. 前往「VPC Network Peering」(VPC 網路對等互連) 頁面。

      前往「VPC Network Peering」(虛擬私有雲網路對等互連)

    2. 選取「servicenetworking-googleapis-com」。

    3. 如要刪除連結,請按一下「刪除」

  14. 按照下列步驟,刪除虛擬私有雲網路的 pscvertex 轉送規則:vertex-networking-vpc

    1. 前往「Load balancing」(負載平衡) 頁面的「Frontends」(前端) 分頁標籤

      前往「前端」

    2. 在轉寄規則清單中,按一下 pscvertex

    3. 在「通用轉送規則詳細資料」頁面中,按一下 「刪除」

  15. 按照下列步驟刪除 Filestore 執行個體:

    1. 前往「Filestore」Filestore頁面。

      前往 Filestore

    2. 選取 image-data-instance 執行個體。

    3. 如要刪除執行個體,請依序點選 >「Actions」(動作) 和「Delete instance」(刪除執行個體)

  16. 按照下列步驟刪除 VPC 網路:

    1. 前往「VPC networks」(VPC 網路) 頁面。

      前往「VPC networks」(虛擬私有雲網路)

    2. 在虛擬私有雲網路清單中,按一下 onprem-dataservice-vpc

    3. 在「虛擬私有雲網路詳細資料」頁面,點選「刪除虛擬私有雲網路」

      刪除每個網路時,系統也會一併移除當中的子網路、路徑和防火牆規則。

    4. 在虛擬私有雲網路清單中,按一下 vertex-networking-vpc

    5. 在「虛擬私有雲網路詳細資料」頁面,點選「刪除虛擬私有雲網路」

  17. 按照下列步驟刪除 workbench-saonprem-user-managed-sa 服務帳戶:

    1. 前往「Service accounts」(服務帳戶) 頁面。

      前往「Service accounts」(服務帳戶)

    2. 選取 onprem-user-managed-saworkbench-sa 服務帳戶,然後按一下「刪除」圖示

後續步驟