创建带有 GPU 的机密虚拟机实例

如需将 GPU 与机密虚拟机搭配使用,您必须基于 a3-highgpu-1g 机器类型,使用基于 Spot 或灵活启动的预配模型创建机密虚拟机实例,并使用 Intel TDX。创建虚拟机实例后,您需要在所挂接的 GPU 上启用机密计算模式。

如需使用 Spot 或灵活启动模型创建虚拟机实例,请执行以下操作:

Spot 模型

gcloud

如需使用 gcloud CLI 创建加速器优化的 Spot 虚拟机实例,请使用带有 --provisioning-model 标志的 instances create 子命令。

  gcloud compute instances create VM_NAME \
      --provisioning-model=SPOT \
      --image-family=IMAGE_FAMILY_NAME \
      --image-project=IMAGE_PROJECT \
      --machine-type=a3-highgpu-1g \
      --zone=ZONE \
      --maintenance-policy=TERMINATE \
      --boot-disk-size=30G \
      --confidential-compute-type=TDX

请提供以下值:

  • VM_NAME:新虚拟机实例的名称。

  • IMAGE_PROJECT:包含受支持的操作系统映像的项目。我们建议使用 ubuntu-os-cloud 映像项目来创建 Ubuntu 映像。您可以选择使用 confidential-vm-images 映像项目来获取 Container-Optimized OS 映像。

  • IMAGE_FAMILY_NAME机密虚拟机支持的操作系统映像的系列。 使用 ubuntu-os-cloud 映像项目时,我们建议使用 ubuntu-2204-lts 映像系列。对于 confidential-vm-images 项目中的 Container-Optimized OS 映像,请使用 cos-tdx-113-lts 映像系列。

  • ZONE:要在其中创建虚拟机的支持的可用区

REST

如需创建 Spot 虚拟机实例,请发送以下 POST 请求,并提供相应的正文内容。

HTTP 方法和网址:

  POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

请求 JSON 正文:

  {
    "name": "VM_NAME",
    "confidentialInstanceConfig": {
      "confidentialInstanceType": "TDX"
    },
    "scheduling": {
      "onHostMaintenance": "TERMINATE",
      "provisioningModel": "SPOT"
    },
    "disks": [
      {
        "type": "PERSISTENT",
        "autoDelete": true,
        "index": 0,
        "boot": true,
        "kind": "compute#attachedDisk",
        "mode": "READ_WRITE",
        "initializeParams": {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/family/IMAGE_FAMILY_NAME",
          "diskSizeGb": "30"
        }
      }
    ],
    "networkInterfaces": [
      {
        "name": "nic0",
        "network": "projects/PROJECT_ID/global/networks/default",
        "accessConfigs": [
          {
            "name": "external-nat",
            "type": "ONE_TO_ONE_NAT",
            "kind": "compute#accessConfig",
            "networkTier": "PREMIUM"
          }
        ],
        "kind": "compute#networkInterface"
      }
    ],
    "machineType": "zones/ZONE/machineTypes/a3-highgpu-1g",
  }

请提供以下值:

  • VM_NAME:新虚拟机实例模板的名称。

  • IMAGE_PROJECT:包含受支持的操作系统映像的项目。我们建议使用 ubuntu-os-cloud 映像项目来创建 Ubuntu 映像。您可以选择使用 confidential-vm-images 映像项目来获取 Container-Optimized OS 映像。

  • IMAGE_FAMILY_NAME支持机密虚拟机的操作系统映像的系列。 使用 ubuntu-os-cloud 映像项目时,我们建议使用 ubuntu-2204-lts 映像系列。对于 confidential-vm-images 项目中的 Container-Optimized OS 映像,请使用 cos-tdx-113-lts 映像系列。

  • PROJECT_ID:可选。要在其中创建虚拟机的项目的 ID。

  • ZONE:要在其中创建虚拟机的支持的可用区

灵活启动模式

如需使用灵活启动模型,请先创建实例模板,然后使用该模板创建 MIG。然后,您可以使用调整大小请求将 GPU 虚拟机实例添加到 MIG。

将 MIG 调整大小请求与弹性启动预配模型结合使用可提高 GPU 虚拟机实例的获取率。如需了解详情,请参阅关于调整 MIG 中的请求大小

准备工作

  • 为确保您有足够的 GPU 配额可以用于请求的资源,请检查您的 GPU 配额。 对于具有 GPU 的机密虚拟机实例,请申请抢占式 GPU 配额以使用这些资源。申请 GPU 配额时,您必须为要在每个区域中创建的 GPU 型号申请一个配额,并根据所有区域中所有类型的 GPU 总数另外申请一个全球配额 (GPUs (all regions))。
  • 如需了解配额用量,请参阅 GPU 虚拟机和抢占式分配配额
  • 查看创建 MIG 的前提条件以及在 MIG 中创建调整大小请求的限制

创建具有 GPU 虚拟机实例的 MIG

如需创建实例模板,然后使用该模板创建 MIG,请完成以下步骤。

  1. 创建一个实例模板。

    gcloud

    gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
        --machine-type=a3-highgpu-1g \
        --image-project=IMAGE_PROJECT \
        --image-family=IMAGE_FAMILY_NAME \
        --maintenance-policy=TERMINATE \
        --reservation-affinity=none \
        --boot-disk-size=30G \
        --confidential-compute-type=TDX \
        --project=PROJECT_ID
    

    如需启用安全启动,您可以选择在虚拟机实例启动时使用 --shielded-secure-boot 标志。

    请提供以下值:

    • INSTANCE_TEMPLATE_NAME:新虚拟机实例模板的名称。

    • IMAGE_PROJECT:包含受支持的操作系统映像的项目。我们建议使用 ubuntu-os-cloud 映像项目来创建 Ubuntu 映像。您可以选择使用 confidential-vm-images 映像项目来获取 Container-Optimized OS 映像。

    • IMAGE_FAMILY_NAME支持机密虚拟机的操作系统映像的系列。 使用 ubuntu-os-cloud 映像项目时,我们建议使用 ubuntu-2204-lts 映像系列。对于 confidential-vm-images 项目中的 Container-Optimized OS 映像,请使用 cos-tdx-113-lts 映像系列。

    • PROJECT_ID:可选。要在其中创建虚拟机的项目的 ID。

    REST

    如需创建机密虚拟机实例模板,请发送以下 POST 请求并包含适当的正文内容。

    HTTP 方法和网址:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/ZONE_NAME/instanceTemplates
    

    请求 JSON 正文:

    {
      "name": "INSTANCE_TEMPLATE_NAME",
      "properties": {
        "confidentialInstanceConfig": {
          "confidentialInstanceType": "TDX"
        },
        "scheduling": {
          "onHostMaintenance": "TERMINATE",
          "provisioningModel": "STANDARD",
          "automaticRestart": true,
          "preemptible": false
        },
        "disks": [
          {
            "type": "PERSISTENT",
            "autoDelete": true,
            "index": 0,
            "boot": true,
            "kind": "compute#attachedDisk",
            "mode": "READ_WRITE",
            "initializeParams": {
              "sourceImage": "projects/IMAGE_PROJECT/global/images/family/IMAGE_FAMILY_NAME",
              "diskSizeGb": "30"
            }
          }
        ],
        "networkInterfaces": [
          {
            "name": "nic0",
            "network": "projects/PROJECT_ID/global/networks/default",
            "accessConfigs": [
              {
                "name": "external-nat",
                "type": "ONE_TO_ONE_NAT",
                "kind": "compute#accessConfig",
                "networkTier": "PREMIUM"
              }
            ],
            "kind": "compute#networkInterface"
          }
        ],
        "reservationAffinity": {
          "consumeReservationType": "NO_RESERVATION"
        },
        "canIpForward": false,
        "machineType": "a3-highgpu-1g",
        "metadata": {
          "fingerprint": "3y_uc6s9Qvs=",
          "kind": "compute#metadata"
        }
      }
    }
    

    如需启用安全启动,您可以选择性地为虚拟机实例启动添加以下对象。

      "shieldedInstanceConfig": {
        "enableIntegrityMonitoring": true,
        "enableSecureBoot": true,
        "enableVtpm": true
      }
    

    请提供以下值:

    • INSTANCE_TEMPLATE_NAME:新虚拟机实例模板的名称。

    • IMAGE_PROJECT:包含受支持的操作系统映像的项目。我们建议使用 ubuntu-os-cloud 映像项目来创建 Ubuntu 映像。您可以选择使用 confidential-vm-images 映像项目来获取 Container-Optimized OS 映像。

    • IMAGE_FAMILY_NAME机密虚拟机支持的操作系统映像的系列。 使用 ubuntu-os-cloud 映像项目时,我们建议使用 ubuntu-2204-lts 映像系列。对于 confidential-vm-images 项目中的 Container-Optimized OS 映像,请使用 cos-tdx-113-lts 映像系列。

    • PROJECT_ID:可选。要在其中创建虚拟机的项目的 ID。

    • ZONE:用于创建 MIG 的支持的可用区

  2. 创建 MIG 和调整大小请求,以便一次性添加所有 GPU 虚拟机实例。

  3. 列出 MIG 中的实例。

    gcloud

    gcloud compute instance-groups managed list-instances INSTANCE_GROUP_NAME \
        --zone=ZONE \
        --project=PROJECT_ID
    

    请提供以下值:

    • INSTANCE_GROUP_NAME:MIG 的名称。

    • ZONE:要从中获取虚拟机实例列表的支持的可用区

    • PROJECT_ID:可选。要从中获取虚拟机实例列表的项目的 ID。

    REST

    如需列出所有实例,请发送以下 GET 请求。

    HTTP 方法和网址:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates
    

    如需将实例列表缩小到特定可用区,请发送以下 GET 请求。

    HTTP 方法和网址:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/ZONE/instanceTemplates
    

    请提供以下值:

    • ZONE:要从中获取虚拟机实例列表的支持的可用区

    • PROJECT_ID:要从中获取虚拟机实例列表的项目的 ID。

在 GPU 上启用机密计算模式

  1. 使用 gcloud compute ssh 命令连接到 MIG 中的虚拟机实例。

    gcloud compute ssh
    
  2. 更新软件包列表并安装必要的工具和库。

    sudo apt-get update --yes
    sudo apt-get install linux-headers-$(uname -r)
    sudo apt install -y build-essential libxml2 libncurses5-dev pkg-config libvulkan1 gcc-12
    
  3. 在虚拟机实例上安装相应的 GPU 驱动程序。 对于已启用安全启动的虚拟机实例,请参阅安装 GPU 驱动程序(安全启动虚拟机)。 我们建议使用 nvidia-550-server-open 版驱动程序。

  4. 如需配置 GPU 与 GPU 驱动程序之间的安全通信,请启用 Linux 内核加密 API (LKCA)。

    echo "install nvidia /sbin/modprobe ecdsa_generic; /sbin/modprobe ecdh; /sbin/modprobe --ignore-install nvidia" | sudo tee /etc/modprobe.d/nvidia-lkca.conf
    sudo update-initramfs -u
    
  5. 为确保 GPU 与 GPU 驱动程序之间的安全安全协议和数据模型 (SPDM) 连接,请启用持久模式。

    sudo test -f /usr/lib/systemd/system/nvidia-persistenced.service && sudo sed -i "s/no-persistence-mode/uvm-persistence-mode/g" /usr/lib/systemd/system/nvidia-persistenced.service
    sudo systemctl daemon-reload
    
  6. 重新启动虚拟机实例以应用 LKCA 和持久性模式配置。

    sudo reboot
    
  7. (可选)安装以下 CUDA 示例。

    wget -O cuda-samples.tar.gz https://github.com/NVIDIA/cuda-samples/archive/refs/tags/v12.5.tar.gz
    tar xzvf cuda-samples.tar.gz
    

后续步骤