Vertex AI 建立安全的使用者自行管理筆記本

1. 簡介

有了 Vertex AI Workbench 使用者自管筆記本執行個體,您就能建立及管理使用 JupyterLab 預先封裝的深度學習虛擬機器 (VM) 執行個體。

使用者自行管理的筆記本執行個體已預先安裝深度學習套件,包括支援 TensorFlow 和 PyTorch 架構。您可以設定只使用 CPU 或已啟用 GPU 的執行個體。

建構項目

本教學課程說明如何按照「網路與安全性」的最佳做法,部署安全的使用者自行管理的筆記本。操作步驟如下:

  1. 建立虛擬私有雲
  2. 建立 Cloud Router 和 Cloud NAT
  3. 使用合適的安全性設定來設定筆記本執行個體

本教學課程會提供每個步驟的詳細操作說明。並介紹保護使用者自行管理筆記本的提示和最佳做法。圖 1 是使用獨立虛擬私有雲的部署插圖。

圖 1

2292244ba0b11f71.png

課程內容

  • 如何判斷獨立虛擬私有雲是否適合貴機構
  • 如何建立獨立虛擬私有雲
  • 如何建立 Cloud Router 和 Cloud NAT
  • 如何建立由使用者自行管理的筆記本
  • 如何存取使用者自行管理的筆記本
  • 如何監控使用者自行管理的筆記本健康狀態
  • 如何建立及套用執行個體排程

軟硬體需求

  • Google Cloud 專案

IAM 權限

2. 虛擬私有雲網路

您可以將虛擬私有雲網路視為實體網路的概念,差別在於前者是在 Google Cloud 中的虛擬化網路。虛擬私有雲網路是全域性資源,由區域子網路組成。Google Cloud 中的虛擬私有雲網路在邏輯上彼此獨立。

獨立虛擬私有雲

圖 2 的例子是獨立的全域虛擬私有雲,除了 Cloud Router 和 Cloud NAT,這個區域的子網路和 Cloud NAT 可用來安全地建立網際網路連線。

圖 2

2292244ba0b11f71.png

共用虛擬私有雲

共用虛擬私有雲可讓您匯出主專案內虛擬私有雲網路的子網路,傳送至同一個機構的服務專案。主專案包含與服務專案共用的網路資源,例如子網路、Cloud Nat 和防火牆規則。服務專案含有應用程式層級資源,會使用主專案中的網路資源。

圖 3 是全域共用虛擬私有雲的插圖,當中的網路和安全性基礎架構會部署於主專案中,而工作負載則部署在服務專案中。

圖 3

1354a9323c8e5787.png

獨立與共用虛擬私有雲

單一虛擬私有雲網路足以滿足許多簡易用途,因為比起較複雜的替代方案,更易於建立、維護和瞭解。對於具有多個團隊的機構來說,共用虛擬私有雲是很有效的工具,因為可以使用服務專案,將單一虛擬私有雲網路的簡便架構延伸至多個工作群組。

教學課程中使用的虛擬私有雲最佳做法

  • 啟用 Cloud NAT 來存取筆記本。
  • 在建立子網路時開啟私人 Google 存取權
  • 建立規定性防火牆規則以減少不請自來的流量。舉例來說,請勿使用 0.0.0.0/0 tcp,而是定義確切的子網路或主機 IP 位址。
  • 運用防火牆政策來加深輸入規則的範圍,例如地理位置、威脅情報清單、來源網域名稱等。

3. 筆記本最佳做法

將執行個體調整到適當規模

  • 停止和/或刪除未使用的執行個體
  • 使用較小的初始執行個體,並運用較小的樣本資料疊代
  • 視需要擴充執行個體
  • 使用較小的資料集進行實驗

選取合適的機器類型

  • 成本效益最高的 VM
  • 更妥善運用硬體資源,降低成本
  • 相較於 N1,最多可省下 31%
  • 承諾使用 1 年或 3 年可省下 20% 至 50% 的費用
  • 增加機器大小或增加 GPU 可協助提升效能,並避免發生記憶體限制錯誤

安排關閉執行個體

  • 閒置時關閉執行個體 (僅須支付磁碟儲存空間費用)
  • 安排在特定時間關閉及啟動筆記本 VM 執行個體

監控筆記本健康狀態

安全性考量

以下是建立使用者自行管理的筆記本時,建議的安全考量事項:

  • 選取「僅限單一使用者」選項筆記本存取權如果指定的使用者不是執行個體建立者,則您必須將執行個體服務帳戶的服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予指定使用者。
  • 停用下列選項:
  • 根存取權
  • nbconvert
  • 正在從 JupyterLab UI 下載檔案
  • 將使用 Cloud NAT,而不是將外部 IP 位址指派給使用者自行管理的筆記本。
  • 選取下列運算選項:
  • 安全啟動
  • 虛擬信任平台模組 (vTPM)
  • 完整性監控

4. 事前準備

更新專案以支援教學課程

本教學課程將使用 $variables,協助在 Cloud Shell 中實作 gcloud 設定。

在 Cloud Shell 中執行以下操作:

gcloud config list project
gcloud config set project [your-project-name]
projectid=your-project-name
echo $projectid

5. 虛擬私有雲設定

建立獨立虛擬私有雲

在 Cloud Shell 中執行以下操作:

gcloud compute networks create securevertex-vpc --project=$projectid --subnet-mode=custom

建立使用者自行管理的筆記本子網路

在 Cloud Shell 中執行以下操作:

gcloud compute networks subnets create securevertex-subnet-a --project=$projectid --range=10.10.10.0/28 --network=securevertex-vpc --region=us-central1 --enable-private-ip-google-access

Cloud Router 和 NAT 設定

使用者管理的筆記本執行個體沒有外部 IP 位址,因此教學課程會使用 Cloud NAT 下載筆記本軟體套件。Cloud NAT 也提供輸出 NAT 功能,因此網際網路主機無法與使用者自行管理的筆記本展開通訊,因此更加安全。

在 Cloud Shell 建立區域性 Cloud Router。

gcloud compute routers create cloud-router-us-central1 --network securevertex-vpc --region us-central1

在 Cloud Shell 中建立區域 Cloud NAT 閘道。

gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-us-central1 --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1

6. 建立儲存空間值區

Storage 值區提供安全的檔案上傳/擷取功能。教學課程中,Cloud Storage 提供後啟動指令碼,讓使用者自行管理的筆記本安裝生成式 AI 套件。

建立 Cloud Storage 值區,並將 BUCKET_NAME 替換為您偏好的全域不重複名稱。

在 Cloud Shell 中建立一個不重複的儲存空間值區。

gsutil mb -l us-central1 -b on gs://BUCKET_NAME

儲存「BUCKET_NAME」持續學習

BUCKET_NAME=YOUR BUCKET NAME
echo $BUCKET_NAME

7. 建立 POST 開機指令碼

如要啟用生成式 AI 套件的下載功能,請使用 vinano 編輯器在 Cloud Shell 中建立後啟動指令碼,並將其儲存為 poststartup.sh

#! /bin/bash
echo "Current user: id" >> /tmp/notebook_config.log 2>&1
echo "Changing dir to /home/jupyter" >> /tmp/notebook_config.log 2>&1
cd /home/jupyter
echo "Cloning generative-ai from github" >> /tmp/notebook_config.log 2>&1
su - jupyter -c "git clone https://github.com/GoogleCloudPlatform/generative-ai.git" >> /tmp/notebook_config.log 2>&1
echo "Current user: id" >> /tmp/notebook_config.log 2>&1
echo "Installing python packages" >> /tmp/notebook_config.log 2&1
su - jupyter -c "pip install --upgrade --no-warn-conflicts --no-warn-script-location --user \
     google-cloud-bigquery \
     google-cloud-pipeline-components \
     google-cloud-aiplatform \
     seaborn \
     kfp" >> /tmp/notebook_config.log 2>&1

範例:

vpc_admin@cloudshell$ more poststartup.sh 
#! /bin/bash
echo "Current user: id" >> /tmp/notebook_config.log 2>&1
echo "Changing dir to /home/jupyter" >> /tmp/notebook_config.log 2>&1
cd /home/jupyter
echo "Cloning generative-ai from github" >> /tmp/notebook_config.log 2>&1
su - jupyter -c "git clone https://github.com/GoogleCloudPlatform/generative-ai.git" >> /tmp/notebook_config.log 2>&1
echo "Current user: id" >> /tmp/notebook_config.log 2>&1
echo "Installing python packages" >> /tmp/notebook_config.log 2&1
su - jupyter -c "pip install --upgrade --no-warn-conflicts --no-warn-script-location --user \
     google-cloud-bigquery \
     google-cloud-pipeline-components \
     google-cloud-aiplatform \
     seaborn \
     kfp" >> /tmp/notebook_config.log 2>&1

使用 gsutil 從 Cloud Shell 將 POST 開機指令碼上傳至 Storage 值區

gsutil cp poststartup.sh gs://$BUCKET_NAME

8. 建立服務帳戶

如要針對使用者自行管理的筆記本提供精細的控管權限,系統需要服務帳戶。產生服務帳戶後,您就能根據業務需求修改服務帳戶權限。在本教學課程中,服務帳戶會套用下列規則:

必須 Service Account API 才能繼續操作。

在 Cloud Shell 中建立服務帳戶。

gcloud iam service-accounts create user-managed-notebook-sa \
    --display-name="user-managed-notebook-sa"

在 Cloud Shell 中,使用「Storage 物件檢視者」角色更新服務帳戶

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.objectViewer"

在 Cloud Shell 中,將服務帳戶更新為「Vertex AI 使用者」角色

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

在 Cloud Shell 中列出服務帳戶,並記下建立使用者自行管理筆記本時要使用的電子郵件地址。

gcloud iam service-accounts list

範例:

$ gcloud iam service-accounts list
DISPLAY NAME: user-managed-notebook-sa
EMAIL: user-managed-notebook-sa@my-project-id.iam.gserviceaccount.com
DISABLED: False

9. 建立由使用者自行管理的安全筆記本

使用者自行管理的筆記本執行個體是深度學習虛擬機器執行個體,當中已預先安裝最新機器學習和數據資料學程式庫。您可以選擇納入 Nvidia GPU,以進行硬體加速。

啟用用戶 API

Notebooks API

建立由使用者自行管理的筆記本

  1. 前往 Workbench
  2. 選取「使用者自行管理的筆記本」,然後選取「建立筆記本」。「建立使用者自行管理的筆記本」頁面會隨即開啟。
  3. 如果已部署現有筆記本,請依序選取「使用者自行管理的筆記本」→「新增筆記本」→「自訂」
  4. 在「建立由使用者管理的筆記本」頁面的「詳細資料」部分,為新執行個體提供下列資訊:
  • 名稱:提供新執行個體的名稱。
  • 區域和可用區:教學課程會使用 us-central1 區域和 us-central1-a 可用區

選取「繼續」

  1. 在「Environment」區段中提供下列內容:
  • 作業系統:選取要使用的作業系統。
  • 選取要使用的環境
  • 版本:選取要使用的版本。
  • 開機指令碼後 (選用,可使用先前建立的生成式 AI 指令碼) 選取「瀏覽」,然後選取執行個體啟動後要執行的指令碼。
  • 中繼資料:選用:提供執行個體的自訂中繼資料鍵。

選取「繼續」

  1. 在「機器類型」專區中,提供下列資訊:
  • 機器類型:為新執行個體選取 CPU 數量和 RAM 容量。Vertex AI Workbench 會針對您選取的每種機器類型提供每月預估費用。
  • GPU 類型:選取新執行個體的 GPU 類型和 GPU 數量。如要進一步瞭解不同的 GPU,請參閱 Compute Engine 上的 GPU 一文。
  • 勾選「自動為我安裝 NVIDIA GPU 驅動程式」核取方塊。

受防護的 VM

  • 啟用安全啟動功能
  • 啟用 vTPM
  • 啟用完整性監控功能

選取「繼續」

  1. 在「磁碟」區段中提供下列項目:
  • 磁碟:選用:如要變更預設開機磁碟或資料磁碟設定,請選取所需的開機磁碟類型、開機磁碟大小 (以 GB 為單位)、資料磁碟類型和資料磁碟大小 (以 GB 為單位)。如要進一步瞭解磁碟類型,請參閱「儲存空間選項」。
  • 刪除至垃圾桶 (選用):如果勾選這個核取方塊,即可使用作業系統的預設垃圾桶行為。如果您使用預設的垃圾桶行為,那麼透過 JupyterLab 使用者介面刪除的檔案可以復原,但這些刪除的檔案會佔用磁碟空間。
  • 備份 (選用):如要將 Cloud Storage 位置與執行個體的資料磁碟同步處理,請選取「瀏覽」並指定 Cloud Storage 位置。如要瞭解儲存空間費用,請參閱 Cloud Storage 定價
  • 加密:Google 代管的加密金鑰

選取「繼續」

  1. 在「網路」專區中提供下列項目:
  • 網路:選取這項專案中的網路或與我共用的網路。如果您使用的是主專案的共用虛擬私有雲,也必須將 Compute 網路使用者角色 (roles/compute.networkUser) 授予服務專案的筆記本服務代理
  • 在「網路」欄位中,選取需要的網路。本教學課程使用 securevertex-vpc 網路。只要網路已啟用私人 Google 存取權或能夠存取網際網路,您就能選取虛擬私有雲網路。在「Subnetwork」(子網路) 欄位中,選取您在教學課程中使用的子網路 securevertex-subnet-a
  • 取消選取外部 IP 位址
  • 選取「允許 Proxy 存取」

選取「繼續」

81bb7dbe31fbf587.png

  1. 在「IAM 與安全性」區段中,提供以下資訊:
  • 選取「單一使用者」,然後在「使用者電子郵件」欄位中,輸入要授予存取權的使用者帳戶。如果指定的使用者不是執行個體建立者,則您必須將執行個體服務帳戶的服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予指定使用者。
  • 取消選取 VM 上的「使用預設 Compute Engine 服務帳戶」來呼叫 Google Cloud API
  • 輸入新建立的服務帳戶電子郵件地址,例如:user-managed-notebook-sa@my-project-id.iam.gserviceaccount.com

安全性選項

  • 取消選取執行個體的根存取權
  • 取消選取啟用 nbconvert
  • 取消選取「啟用從 JupyterLab UI 下載檔案」的功能
  • 啟用終端機 (如果是實際工作環境,請取消選取)

選取「繼續」

e19f3cd05a2c1b7f.png

  1. 在「系統健康狀態」部分中提供下列資訊

環境升級與系統健康狀態

  • 勾選「啟用環境自動升級」核取方塊。
  • 選擇「每週」或「每月」升級筆記本。

在「系統健康狀態與報告」中,勾選或取消勾選下列核取方塊:

  • 啟用系統健康狀態報表
  • 向 Cloud Monitoring 回報自訂指標
  • 安裝 Cloud Monitoring 代理程式

選取「建立」

10. 驗證

Vertex AI Workbench 會根據您指定的屬性建立由使用者管理的筆記本執行個體,並自動啟動執行個體。執行個體可供使用時,Vertex AI Workbench 會啟用「Open JupyterLab」連結,讓使用者存取筆記本。

11. 觀測能力

透過 Monitoring 監控系統和應用程式指標

如果是已安裝 Monitoring 的使用者自行管理的筆記本執行個體,您可以使用 Google Cloud 控制台監控系統和應用程式的指標:

  1. 前往 Google Cloud 控制台的「使用者自行管理的筆記本」頁面。
  2. 點選要查看系統和應用程式指標的執行個體名稱。
  3. 在「筆記本詳細資料」頁面中,按一下「監控」分頁標籤。查看執行個體的系統和應用程式指標。

12. 建立筆記本排程

執行個體排程功能可讓您自動啟動及停止虛擬機器 (VM) 執行個體。使用執行個體排程來自動部署 VM 執行個體,可協助您提高成本效益,並更有效率地管理 VM 執行個體。無論是週期性和一次性的工作負載,都能使用執行個體排程。舉例來說,您可以使用執行個體排程功能,只在工作時間內執行 VM 執行個體,或是為一次性活動提供容量。

如要使用執行個體排程,請建立說明啟動和停止行為的資源政策,然後將政策附加至一或多個 VM 執行個體。

本教學課程說明如何建立執行個體排程,以在早上 7 點為筆記本開啟電源,並於晚上 6 點關機。

如要建立執行個體排程,您必須具備 compute.instances.start 和 compute.instances.stop 權限,因此建議您由管理員授予您建立自訂角色。

建立完成之後,系統會將自訂角色指派給專案中的預設 Compute Engine 服務帳戶,讓執行個體排程能夠啟動及停止筆記本。

建立自訂角色

在 Cloud Shell 建立自訂角色「VmScheduler」,並納入必要權限。

gcloud iam roles create Vm_Scheduler --project=$projectid \
    --title=vm-scheduler-notebooks \
    --permissions="compute.instances.start,compute.instances.stop" --stage=ga

說明 Cloud Shell 中的自訂角色。

gcloud iam roles describe Vm_Scheduler --project=$projectid

範例:

$ gcloud iam roles describe Vm_Scheduler --project=$projectid
etag: BwX991B0_kg=
includedPermissions:
- compute.instances.start
- compute.instances.stop
name: projects/$projectid/roles/Vm_Scheduler
stage: GA
title: vm-scheduler-notebooks

更新預設服務帳戶

在下一節中,您將找出並更新以下格式包含的預設服務帳戶:PROJECT_NUMBER-compute@developer.gserviceaccount.com

在 Cloud Shell 中找出目前的專案編號。

gcloud projects list --filter=$projectid

在 Cloud Shell 中,將專案編號儲存為變數。

project_number=your_project_number
echo $project_number

在 Cloud Shell 中,將預設的運算服務帳戶更新為自訂角色 VM_Scheduler。

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:$project_number-compute@developer.gserviceaccount.com" --role="projects/$projectid/roles/Vm_Scheduler"

建立執行個體排程

在 Cloud Shell 中建立開始和停止排程。

gcloud compute resource-policies create instance-schedule optimize-notebooks \
    --region=us-central1 \
    --vm-start-schedule='0 7 * * *' \
    --vm-stop-schedule='0 18 * * *' \
        --timezone=America/Chicago

在 Cloud Shell 中儲存筆記本名稱。

gcloud compute instances list
notebook_vm=your_notebookvm_name
echo $notebook_vm

您可以將執行個體排程附加至任何與執行個體排程位於相同區域的現有 VM 執行個體。

在 Cloud Shell 中,將排程連結至筆記本。

gcloud compute instances add-resource-policies $notebook_vm \
--resource-policies=optimize-notebooks \
--zone=us-central1-a

13. 清除所用資源

從控制台中刪除使用者自行管理的筆記本,依序前往「Vertex AI」→「Workbench」,然後選取及刪除筆記本。

在 Cloud Shell 中刪除虛擬私有雲元件。

gcloud compute routers delete cloud-router-us-central1 --region=us-central1 --quiet

gcloud compute routers nats delete cloud-nat-us-central1 --region=us-central1 --router=cloud-router-us-central1 --quiet

gcloud compute instances remove-resource-policies $notebook_vm \
--resource-policies=optimize-notebooks \
--zone=us-central1-a --quiet

gcloud compute resource-policies delete optimize-notebooks --region=us-central1 --quiet

gcloud compute instances delete $notebook_vm --zone=us-central1-a --quiet

gcloud compute networks subnets delete securevertex-subnet-a --region=us-central1 --quiet 

gcloud iam service-accounts delete user-managed-notebook-sa@$projectid.iam.gserviceaccount.com --quiet 

gcloud projects remove-iam-policy-binding $projectid --member="serviceAccount:$project_number-compute@developer.gserviceaccount.com" --role="projects/$projectid/roles/Vm_Scheduler"

gcloud iam roles delete Vm_Scheduler --project=$projectid

gcloud compute networks delete securevertex-vpc --quiet 

14. 恭喜

非常好!您已成功透過代管筆記本的安全性強化最佳做法建立自訂的獨立虛擬私有雲,並實作執行個體排程來最佳化支出,進而成功設定並驗證使用者自行管理的安全筆記本。

後續步驟

快來看看一些教學課程...

其他資訊與影片

參考文件