Vertex AI 创建用户管理的安全笔记本

1. 简介

借助 Vertex AI Workbench 用户管理的笔记本实例,您可以创建和管理预封装了 JupyterLab 的深度学习虚拟机 (VM) 实例。

用户管理的笔记本实例预安装了一套深度学习软件包,包括支持 TensorFlow 和 PyTorch 框架。您可以配置仅限 CPU 的实例或支持 GPU 的实例。

构建内容

本教程根据“网络和安全”最佳实践,介绍部署安全的用户管理的笔记本的过程。具体步骤如下:

  1. 创建 VPC
  2. 创建 Cloud Router 路由器和 Cloud NAT
  3. 使用适当的安全设置配置笔记本实例

本教程提供了每个步骤的详细说明。还提供了有关保护用户管理的笔记本的提示和最佳做法。图 1 展示了使用独立 VPC 的部署。

图 1

2292244ba0b11f71

学习内容

  • 如何确定独立 VPC 的共享是否适合您的组织
  • 如何创建独立 VPC
  • 如何创建 Cloud Router 路由器和 Cloud NAT
  • 如何创建用户管理的笔记本
  • 如何访问用户管理的笔记本
  • 如何监控用户管理的笔记本健康状况
  • 如何创建和应用实例时间表

所需条件

  • Google Cloud 项目

IAM 权限

2. VPC 网络

您可以像看待物理网络一样看待 VPC 网络,区别是前者在 Google Cloud 中进行了虚拟化。VPC 网络是一种全球性资源,由区域子网组成。在 Google Cloud 中,VPC 网络在逻辑上彼此隔离。

独立 VPC

图 2 展示了一个独立的全局 VPC,其中不仅包含 Cloud Router 路由器和 Cloud NAT,还包含区域级子网 (us-central1),用户管理的笔记本用于安全地建立与互联网的连接。

图 2

2292244ba0b11f71

共享 VPC

通过共享 VPC,您可以将宿主项目 VPC 网络中的子网导出到同一组织中的服务项目。宿主项目包含与服务项目共享的网络资源,例如子网、Cloud NAT 和防火墙规则。服务项目包含利用宿主项目中的网络资源的应用级资源。

图 3 显示全球共享 VPC,其中网络和安全基础架构部署在宿主项目中,而工作负载部署在服务项目中。

图 3

1354a9323c8e5787

独立 VPC 与共享 VPC

单个 VPC 网络就足以满足许多简单的用例,因为与更复杂的替代方案相比,它更容易创建、维护和理解。对于具有多个团队的组织来说,共享 VPC 是非常有效的工具,因为借助共享 VPC,组织可以使用服务项目将单个 VPC 网络的架构简洁性扩展到多个工作组。

教程中使用的 VPC 最佳实践

  • 启用 Cloud NAT 以访问笔记本。
  • 创建子网时,请开启专用 Google 访问通道
  • 创建规范性防火墙规则以减少非请求流量,例如不要使用 0.0.0.0/0 tcp,而定义确切的子网或主机 IP 地址。
  • 利用防火墙政策深化入站规则范围(例如地理位置、威胁情报列表、来源域名等)。

3. 笔记本最佳实践

合理调整实例大小

  • 停止和/或删除未使用的实例
  • 使用较小的初始实例,并使用较少的样本数据进行迭代
  • 根据需要对实例进行纵向扩容
  • 使用较小的数据集进行实验

选择合适的机器类型

  • 费用优化的虚拟机
  • 更好地利用硬件资源,降低成本
  • 与 N1 相比,节省高达 31%
  • 1 年或 3 年期合约可节省 (20-50%) 的费用
  • 增加机器大小或添加 GPU 有助于提高性能和克服内存限制错误

安排实例关停

  • 在实例空闲时关闭实例(只需为磁盘存储空间付费)
  • 安排笔记本虚拟机实例在特定时间自动关停和启动

监控笔记本的运行状况

安全注意事项

以下是创建用户管理的笔记本时建议的安全注意事项:

  • 选择“仅限单个用户”选项笔记本访问权限。如果指定用户不是实例的创建者,您必须向指定用户授予实例服务账号的 Service Account User 角色 (roles/iam.serviceAccountUser)。
  • 停用以下选项:
  • 根访问权限
  • nbconvert
  • 从 JupyterLab 界面下载文件
  • 系统将使用 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. VPC 设置

创建独立 VPC

在 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 配置

本教程中使用 Cloud NAT 下载笔记本软件包,因为用户管理的笔记本实例没有外部 IP 地址。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. 创建存储分区

存储分区提供安全的文件上传/检索功能,在本教程中,云端存储空间将包含一个启动后脚本,用于在用户管理的笔记本中安装生成式 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. 创建启动后脚本

如需支持下载生成式 AI 软件包,请在 Cloud Shell 中使用 vinano 编辑器创建启动后脚本,并将其另存为 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 将启动后脚本上传到您的存储分区

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 Object Viewer 角色更新服务账号

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 User 角色更新服务账号

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. 环境部分中,提供以下信息:
  • 操作系统:选择您要使用的操作系统。
  • 选择您要使用的环境
  • 版本:选择您要使用的版本。
  • 启动后脚本(可选,使用之前创建的生成式 AI 脚本)选择“浏览”,以选择要在实例启动后运行的脚本。
  • 元数据:可选:为实例提供自定义元数据键。

选择继续

  1. 在“机器类型”部分中,提供以下内容:
  • 机器类型:为新实例选择 CPU 数量和 RAM 容量。Vertex AI Workbench 可为您选择的每种机器类型提供每月费用估算。
  • GPU 类型:为新实例选择 GPU 类型和 GPU 数量。如需了解不同的 GPU,请参阅 Compute Engine 上的 GPU
  • 选中“自动为我安装 NVIDIA GPU 驱动程序”复选框。

安全强化型虚拟机

  • 开启安全启动
  • 开启 vTPM
  • 开启完整性监控

选择继续

  1. 在“磁盘”部分中,提供以下内容:
  • 磁盘(可选):如需更改默认启动磁盘或数据磁盘设置,请选择所需的启动磁盘类型、启动磁盘大小(以 GB 为单位)、数据磁盘类型以及数据磁盘大小(以 GB 为单位)。如需详细了解磁盘类型,请参阅存储选项
  • 删除至回收站:可选:选中此复选框可使用操作系统的默认回收站行为。如果您使用默认的回收站行为,则使用 JupyterLab 界面删除的文件是可以恢复的,但这些已删除的文件会占用磁盘空间。
  • 备份:可选:如需将 Cloud Storage 位置与实例的数据磁盘同步,请选择“浏览”并指定 Cloud Storage 位置。如需了解存储费用,请参阅 Cloud Storage 价格
  • 加密:Google 管理的加密密钥

选择继续

  1. 在“网络”部分,提供以下内容:
  • 网络:选择“此项目中的网络”或“与我共享的网络”。如果您在宿主项目中使用共享 VPC,则还必须向服务项目中的 Notebooks Service Agent 授予 Compute Network User 角色 (roles/compute.networkUser)。
  • 在 网络 字段中,选择所需的网络。本教程使用的是 securevertex-vpc 网络。您可以选择 VPC 网络,只要该网络启用了专用 Google 访问通道或可以访问互联网。在“子网”字段中,选择所需的子网,本教程中使用子网 securevertex-subnet-a
  • 取消选择分配外部 IP 地址
  • 选择允许代理访问权限

选择继续

81bb7dbe31fbf587

  1. 在“IAM 和安全”部分,提供以下信息:
  • 选择单个用户,然后在“用户电子邮件地址”字段中输入您要授予访问权限的用户账号。如果指定用户不是实例的创建者,您必须向指定用户授予实例服务账号的 Service Account User 角色 (roles/iam.serviceAccountUser)。
  • 取消选择“在虚拟机上使用默认 Compute Engine 服务账号来调用 Google Cloud API”
  • 输入新创建的服务账号电子邮件地址,例如:user-managed-notebook-sa@my-project-id.iam.gserviceaccount.com

安全选项

  • 取消选择“启用对实例的根访问权限”
  • 取消选择启用 nbconvert
  • 取消选择“启用从 JupyterLab 界面下载文件”
  • 启用终端(生产环境为取消选中)

选择继续

e19f3cd05a2c1b7f.png

  1. 在“系统运行状况”部分,提供以下信息

环境升级和系统健康状况

  • 选中“启用环境自动升级”复选框。
  • 选择每周或每月升级笔记本。

在“系统运行状况和报告”中,选中或清除以下复选框:

  • 启用系统健康状况报告
  • 向 Cloud Monitoring 报告自定义指标
  • 安装 Cloud Monitoring 代理

选择创建

10. 验证

Vertex AI Workbench 会根据您指定的属性创建用户管理的笔记本实例,并自动启动该实例。当实例可供使用时,Vertex AI Workbench 会激活打开 JupyterLab 链接,允许最终用户访问笔记本。

11. 可观测性

通过 Monitoring 监控系统和应用指标

对于安装了 Monitoring 的用户管理的笔记本实例,您可以使用 Google Cloud 控制台来监控系统和应用指标:

  1. 在 Google Cloud 控制台中,前往用户管理的笔记本页面。
  2. 点击要查看其系统和应用指标的实例名称。
  3. 笔记本详情页面上,点击监控标签页。查看实例的系统和应用指标。

12. 创建笔记本时间表

通过实例时间表,您可以自动启动和停止虚拟机 (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

您可以将实例时间表挂接到与其位于同一区域的任何现有虚拟机实例。

在 Cloud Shell 中,将时间表与您的笔记本相关联。

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

13. 清理

从控制台中删除用户管理的笔记本,前往 Vertex AI → Workbench,选择并删除该笔记本。

从 Cloud Shell 中删除 VPC 组件。

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. 恭喜

太棒了!您已使用代管式笔记本的安全强化最佳实践创建了自定义独立 VPC,并成功配置并验证了安全的用户管理的笔记本,并实施了实例时间表来优化支出。

后续操作

请查看下面的一些教程...

补充阅读材料和视频

参考文档