使用 XPK 在 GKE 上预配 Managed Lustre

本文档介绍了如何将 Managed Lustre 与 GKE 集成,以创建优化的环境来处理要求严苛的数据密集型工作负载,例如人工智能 (AI)、机器学习 (ML) 和高性能计算 (HPC)。

在本文档中,您将使用 XPK 配置 GKE 集群,创建 Managed Lustre 实例,并将其附加到集群。如需测试此配置,您可以在灵活启动配置的节点上运行工作负载。

本文档适用于有兴趣探索由托管式 Lustre 实例提供支持的 Kubernetes 容器编排功能的机器学习 (ML) 工程师以及数据和 AI 专家。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

背景

本部分介绍本文档中使用的关键技术:

XPK

XPK 是一种工具,可简化 GKE 集群和工作负载的预配和管理,尤其适用于 AI/机器学习任务。XPK 有助于生成预配置的、经过训练优化的基础架构,因此非常适合概念验证和测试环境。

您可以使用 Google Cloud CLI 或加速处理套件 (XPK) 创建使用 TPU 的集群。

  • 使用 gcloud CLI 手动创建 GKE 集群实例,以便精确自定义或扩展现有生产 GKE 环境。
  • 使用 XPK 快速创建 GKE 集群并运行工作负载,以进行概念验证和测试。如需了解详情,请参阅 XPK 自述文件

本文档专门使用 XPK 来预配和管理资源。

如需了解详情,请参阅加速处理套件 (XPK) 文档。

灵活启动

灵活启动可让您只需为所需的资源付费,从而优化 TPU 预配。如果您的工作负载需要根据需要动态配置资源(最多 7 天)且可经济高效地访问,建议使用灵活启动。

本文档以灵活启动为例来说明使用选项,但您也可以使用其他选项,例如预留或 Spot。如需了解详情,请参阅 GKE 中 AI/机器学习工作负载的加速器使用选项简介

Managed Lustre

Managed Lustre 是一种高性能并行文件系统服务,专为要求严苛的工作负载而设计。借助 Managed Lustre CSI 驱动程序,您可以使用标准 Kubernetes 永久性卷声明 (PVC) 和永久性卷 (PV) 将 Managed Lustre 实例与 GKE 集成。此驱动程序尤其适合需要持久、可伸缩和高吞吐量存储的 AI、机器学习和 HPC 工作负载。

如需了解详情,请参阅 Managed Lustre CSI 驱动程序简介

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Cloud Managed Lustre API 和 Google Kubernetes Engine API。
  • 启用 API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

准备环境

本部分将介绍如何准备集群环境。

  1. 在新终端窗口中,创建虚拟环境:

    VENV_DIR=~/venvp4;python3 -m venv $VENV_DIR;source $VENV_DIR/bin/activate
    
  2. 按照 XPK 安装文件中的步骤安装 XPK。使用 pip install,而不是从源克隆。

  3. 设置默认环境变量:

    gcloud config set project PROJECT_ID
    gcloud config set billing/quota_project PROJECT_ID
    export PROJECT_ID=$(gcloud config get project)
    export LOCATION=LOCATION
    export CLUSTER_NAME=CLUSTER_NAME
    export GKE_VERSION=VERSION
    export NETWORK_NAME=NETWORK_NAME
    export IP_RANGE_NAME=IP_RANGE_NAME
    export FIREWALL_RULE_NAME=FIREWALL_RULE_NAME
    export ACCELERATOR_TYPE=v6e-16
    export NUM_SLICES=1
    

    替换以下值:

    • PROJECT_ID:您的 Google Cloud 项目 ID
    • LOCATION:GKE 集群的可用区。为弹性启动实例和 Managed Lustre 实例选择可用区。例如 us-west4-a。如需了解有效的吞吐量值,请参阅使用灵活启动预配模式进行 GPU 和 TPU 预配简介
    • CLUSTER_NAME:GKE 集群的名称。
    • VERSION:GKE 版本。 确保此版本至少是支持 Managed Lustre 的最低版本。例如,1.33.2-gke.1111000。
    • NETWORK_NAME:您创建的网络的名称。
    • IP_RANGE_NAME:IP 地址范围的名称。
    • FIREWALL_RULE_NAME:防火墙规则的名称。

    上述命令配置了 v6e-16 加速器类型。此配置包含以下变量:

    • ACCELERATOR_TYPE=v6e-16:对应于采用 4x4 拓扑的 TPU Trillium。 此 TPU 版本会指示 GKE 预配多主机切片节点池。v6e-16 映射到 GKE 中的 ct6e-standard-4t 机器类型。
    • NUM_SLICES=1:XPK 为您选择的 ACCELERATOR_TYPE 创建的 TPU 切片节点池的数量。

    如果您想自定义 ACCELERATOR_TYPENUM_SLICES 变量,请参阅以下文档,了解可用的组合:

    • 如需确定要使用的 TPU 版本、GKE 的机器类型、拓扑和可用区,请参阅规划 GKE 中的 TPU
    • 如需将 GKE 机器类型与 Cloud TPU API 中的加速器类型相关联,请参阅 TPU Trillium (v6e) 文档

准备 VPC 网络

为您的托管 Lustre 实例和 GKE 集群准备虚拟私有云网络。

  1. 启用 Service Networking API:

    gcloud services enable servicenetworking.googleapis.com \
            --project=${PROJECT_ID}
    
  2. 创建 VPC 网络:

    gcloud compute networks create ${NETWORK_NAME} \
            --subnet-mode=auto --project=${PROJECT_ID} \
            --mtu=8896
    
  3. 为 VPC 对等互连创建 IP 地址范围:

    gcloud compute addresses create ${IP_RANGE_NAME} \
            --global \
            --purpose=VPC_PEERING \
            --prefix-length=20 \
            --description="Managed Lustre VPC Peering" \
            --network=${NETWORK_NAME} \
            --project=${PROJECT_ID}
    
  4. 获取 IP 地址范围的 CIDR 范围:

    CIDR_RANGE=$(
        gcloud compute addresses describe ${IP_RANGE_NAME} \
                --global  \
                --format="value[separator=/](address, prefixLength)" \
                --project=${PROJECT_ID}
    )
    
  5. 创建一条防火墙规则,以允许来自相应 IP 地址范围的 TCP 流量:

    gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \
            --allow=tcp:988,tcp:6988 \
            --network=${NETWORK_NAME} \
            --source-ranges=${CIDR_RANGE} \
            --project=${PROJECT_ID}
    
  6. 连接 VPC 对等互连。

    gcloud services vpc-peerings connect \
            --network=${NETWORK_NAME} \
            --project=${PROJECT_ID} \
            --ranges=${IP_RANGE_NAME} \
            --service=servicenetworking.googleapis.com
    

创建 Managed Lustre 存储实例

创建 Managed Lustre 存储实例。

  1. 设置存储实例变量:

    export STORAGE_NAME=STORAGE_NAME
    export STORAGE_THROUGHPUT=STORAGE_THROUGHPUT
    export STORAGE_CAPACITY=STORAGE_CAPACITY_GIB
    export STORAGE_FS=lfs
    

    替换以下值:

    • STORAGE_NAME:您的 Managed Lustre 实例的名称。
    • STORAGE_THROUGHPUT:Managed Lustre 实例的吞吐量,以 MiB/s 每 TiB 为单位。如需了解有效的吞吐量值,请参阅计算新容量
    • STORAGE_CAPACITY_GIB:Managed Lustre 实例的容量(以 GiB 为单位)。如需了解有效的容量值,请参阅允许的容量和吞吐量值
  2. 创建 Managed Lustre 实例:

    gcloud lustre instances create ${STORAGE_NAME} \
            --per-unit-storage-throughput=${STORAGE_THROUGHPUT} \
            --capacity-gib=${STORAGE_CAPACITY} \
            --filesystem=${STORAGE_FS} \
            --location=${LOCATION} \
            --network=projects/${PROJECT_ID}/global/networks/${NETWORK_NAME} \
            --project=${PROJECT_ID} \
            --async # Creates the instance asynchronously
    

    --async 标志会异步创建实例,并提供一个操作 ID 来跟踪其状态。

  3. 检查操作的状态:

    gcloud lustre operations describe OPERATION_ID  \
            --location=${LOCATION} \
            --project=${PROJECT_ID}
    

    OPERATION_ID 替换为上一个异步命令的输出中的 ID。如果您没有 ID,可以列出所有操作:

    gcloud lustre operations list \
            --location=${LOCATION} \
            --project=${PROJECT_ID}
    

    当命令输出显示 done: true 时,表示实例已准备就绪。

使用 XPK 创建 GKE 集群

使用 XPK 创建具有节点池的 GKE 集群。

创建 GKE 集群:

xpk cluster create --cluster ${CLUSTER_NAME} \
        --num-slices=${NUM_SLICES} \
        --tpu-type=${ACCELERATOR_TYPE} \
        --zone=${LOCATION} \
        --project=${PROJECT_ID} \
        --gke-version=${GKE_VERSION} \
        --custom-cluster-arguments="--network=${NETWORK_NAME}" \
        --enable-lustre-csi-driver \
        --flex

此命令使用 XPK 创建 GKE 集群。集群已配置为使用灵活启动进行节点预配,并且已启用 Managed Lustre CSI 驱动程序。

将存储实例附加到集群

为了配置 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC),本部分将使用 XPK 存储空间附加命令 (xpk storage attach) 和清单文件。本部分使用 XPK 源代码中的示例清单

完成以下步骤,将 Managed Lustre 存储实例附加到 GKE 集群:

  1. 示例清单文件下载到当前工作目录,并将其另存为 lustre-manifest-attach.yaml

  2. 使用 Managed Lustre 实例的信息更新清单文件:

    1. PersistentVolume 部分中,替换以下值:

      • STORAGE_SIZE:Managed Lustre 实例的大小(以 GiB 为单位)。
      • PROJECT_ID/ZONE/INSTANCE_NAME:Managed Lustre 实例的完整资源路径。
      • IP_ADDRESS:Managed Lustre 实例的 IP 地址。
      • FILE_SYSTEM:文件系统类型,即 lfs
    2. PersistentVolumeClaim 部分中,替换以下值:

      • STORAGE_SIZE:PersistentVolumeClaim 的大小(以 GiB 为单位)。
  3. 将存储实例附加到集群:

    xpk storage attach ${STORAGE_NAME} \
            --cluster=${CLUSTER_NAME} --project=${PROJECT_ID} --zone=${LOCATION} \
            --type=lustre \
            --mount-point='/lustre-data' \
            --readonly=false \
            --auto-mount=true \
            --manifest='./lustre-manifest-attach.yaml'
    
  4. 验证您是否已为集群关联存储空间:

    xpk storage list \
            --cluster=${CLUSTER_NAME} --project=${PROJECT_ID} --zone=${LOCATION}
    

运行工作负载

运行附加了 Managed Lustre 实例的工作负载。以下示例命令会列出可用磁盘,并在 Managed Lustre 实例的目录中创建一个“hello”文件。

创建并运行工作负载:

xpk workload create --workload test-lustre \
--cluster=${CLUSTER_NAME} --project=${PROJECT_ID} --zone=${LOCATION} \
--command="df -h && echo 'hello' > /lustre-data/hello.txt && cat /lustre-data/hello.txt" \
--tpu-type=${ACCELERATOR_TYPE} \
--num-slices=1 \
--flex

清理

完成本文档中的步骤后,为防止您的账号产生不必要的费用,请删除集群:

  xpk cluster delete --cluster ${CLUSTER_NAME} \
        --zone ${LOCATION} \
        --project ${PROJECT_ID}

后续步骤