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

1. 简介

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

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

构建内容

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

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

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

图 1

2292244ba0b11f71.png

学习内容

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

所需条件

  • Google Cloud 项目

IAM 权限

2. VPC 网络

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

独立 VPC

图 2 显示了一个独立全局 VPC 的示例,该 VPC 除了包含 Cloud Router 和 Cloud NAT 之外,还包含一个区域子网 (us-central1),用于允许用户管理的笔记本安全地建立与互联网的连接。

图 2

2292244ba0b11f71.png

共享 VPC

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

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

图 3

1354a9323c8e5787.png

独立 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)。
  • 停用以下选项:
  • root 访问权限
  • nbconvert
  • 从 JupyterLab 界面下载文件
  • 系统将使用 Cloud NAT,而不是为用户管理的笔记本分配外部 IP 地址。
  • 选择以下计算选项:
  • 安全启动
  • 虚拟可信平台模块 (vTPM)
  • 完整性监控

4. 准备工作

更新项目以支持本教程

本教程使用 $变量来帮助在 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 软件包的下载,请使用 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 从云端 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.png

  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 更新默认的 Compute Engine 服务账号。

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,并实现实例调度以优化支出。

后续操作

查看下列教程…

深入阅读和视频

参考文档