部署批量机器学习工作负载


本教程演示了如何使用 Google Kubernetes Engine (GKE) 管理容错批量工作负载,同时降低费用。在本教程中,您将了解如何使用作业和费用优化的 Spot Pod,以及如何在 GKE 上配置集群内 Redis 作业队列。

背景

批量工作负载通常设计为一个具有开始点和完成点的过程。如果您的架构涉及注入、处理和输出数据(而不是使用原始数据),则应考虑使用 GKE 上的批量工作负载。机器学习、人工智能和高性能计算 (HPC) 等领域涉及不同类型的批量工作负载,例如离线模型训练、批量预测、数据分析、物理系统模拟和视频处理。

通过设计容器化的批量工作负载,您可以利用以下 GKE 优势:

  • 开放标准、社区庞大的代管式服务。
  • 有效的工作负载和基础架构编排以及专用计算资源带来的成本效益。
  • 容器化隔离和可移植性,允许将云用作溢出容量,同时保持数据安全。
  • GKE 集群的爆发容量和随后的快速缩减。

目标

本教程适用于希望学习如何在 GKE 上(采用以下经济实惠且可扩缩的架构)运行批处理机器学习工作负载的机器学习工程师或数据科学家:

本教程介绍以下步骤:

  1. 创建 GKE Autopilot 集群。在本教程中,您也可以选择使用 GKE Standard 集群。
  2. 创建 Filestore NFS 卷。
  3. 创建集群内 Redis 作业队列。
  4. 将数据集转移到 NFS 卷,并将其排入队列以供工作负载使用。
  5. 在 GKE 集群上运行示例批处理机器学习工作负载。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用


如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示

操作演示


准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Compute Engine, GKE, and Filestore API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Compute Engine, GKE, and Filestore API。

    启用 API

  8. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

准备环境

  1. 克隆本教程中使用的示例代码库:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/batch/aiml-workloads
    
  2. 创建 GKE Autopilot 集群:

    gcloud container clusters create-auto batch-aiml \
        --region=us-central1
    

    此步骤可能需要长达 5 分钟才能完成。

使用网络文件系统 (NFS) 设置数据集存储

机器学习工作负载需要数据集和输出文件的存储解决方案。在本部分中,您将创建一个 Filestore 实例,并使用 PersistentVolumePersistentVolumeClaim 提供对该实例的访问权限。

如需了解详情,请参阅如何设计出色的存储策略以及如何从 GKE 集群访问 Filestore 实例

创建一个 Filestore 实例

  1. 创建 Filestore 实例:

    gcloud filestore instances create batch-aiml-filestore \
        --zone=us-central1-b \
        --tier=BASIC_HDD \
        --file-share=name="NFSVol",capacity=1TB \
        --network=name="default"
    

    此命令指定了以下选项:

    • tier:Filestore 实例的服务层级。此示例使用基本层级。如需了解其他选项,请参阅服务层级

    • network=name:Filestore 实例的 Virtual Private Cloud (VPC) 网络的名称。GKE 集群必须与 Filestore 实例位于同一 VPC 网络中。

    • capacity:所需的卷大小。请使用资源数量中介绍的受支持的单位来指定存储值。

  2. 验证 Filestore 实例已部署:

    gcloud filestore instances list \
        --project=PROJECT_ID \
        --zone=us-central1-b
    

    PROJECT_ID 替换为您的 Google Cloud 项目 ID。

    输出内容类似如下:

    INSTANCE_NAME: batch-aiml-filestore
    LOCATION: us-central1-b
    TIER: BASIC_HDD
    CAPACITY_GB: 1024
    FILE_SHARE_NAME: NFSVol
    IP_ADDRESS: 203.0.113.54
    STATE: READY
    CREATE_TIME: 2022-03-15T18:23:51
    
  3. 请记下 IP_ADDRESS 字段中的值,在下一部分中会用到。

创建一个 PersistentVolume

Kubernetes PersistentVolume 规范允许 GKE 集群连接到 Filestore 实例。

  1. 使用 Filestore 实例 IP 地址更新 kubernetes-manifests/persistent-volume.yaml 文件:

    sed -i "\
      s/<FILESTORE_IP_ADDRESS>/IP_ADDRESS/g" \
      kubernetes-manifests/persistent-volume.yaml
    

    IP_ADDRESS 替换为您在上一部分中创建 Filestore 实例时记下的 IP 地址。

  2. 部署 PersistentVolume:

    kubectl apply -f kubernetes-manifests/persistent-volume.yaml
    

创建一个 PersistentVolumeClaim

Kubernetes PersistentVolumeClaim 允许 Kubernetes Pod 和作业访问 PersistentVolume 的存储资源。

部署 PersistentVolumeClaim:

kubectl apply -f kubernetes-manifests/persistent-volume-claim.yaml

使用 PersistentVolumeClaim

在 GKE 集群上设置 PersistentVolume 和 PersistentVolumeClaim 后,您可以配置 Redis 服务器和批量作业以使用 PersistentVolumeClaim。这显示为可装载的存储卷。

检查 kubernetes-manifests/redis-pod.yamlkubernetes-manifests/workload.yaml 文件。清单配置类似于以下内容:

  spec:
  …
  containers:
  - name: workload
    image: "us-central1-docker.pkg.dev/gke-batch-aiml/batch-aiml-docker-repo/workload"
    volumeMounts:
    - mountPath: /mnt/fileserver
      name: workload-pvc
  volumes:
  - name: workload-pvc
    persistentVolumeClaim:
      claimName: fileserver-claim
      readOnly: false

在此清单中:

  • spec.volumes 指定要使用的 PersistentVolumeClaim。
  • spec.containers.volumeMounts 指定 Pod 可以用于访问 Filestore 文件共享的本地文件路径。

设置 Redis 作业队列

工作负载批量处理数据,以迭代方式训练欺诈检测模型。要管理当前正在处理或仍在队列中的数据集,请将 Redis 服务器部署到 GKE 集群中。

在本教程中,您将启动单个 Redis 实例。如需以可扩缩和冗余的方式部署 Redis,请参阅使用 Redis 和 PHP 创建多层 Web 应用

  1. 部署 Redis 服务器规范。

    kubectl apply -f kubernetes-manifests/redis-pod.yaml
    
  2. 可使用以下命令验证 Pod 是否正在运行:

    kubectl get pods
    

    输出内容类似如下:

    NAME           READY   STATUS    RESTARTS   AGE
    redis-leader   1/1     Running   0          118s
    

    Pod 最多可能需要两分钟才能开始运行。

  3. 将包含训练数据集和测试数据集的文件转移到 NFS 卷。

    sh scripts/transfer-datasets.sh
    

    此脚本会将示例代码库中的文件复制到 redis-leader Pod 上的 /mnt/fileserver/datasets/ 目录。

  4. 填充 Redis 队列。

    sh scripts/queue-jobs.sh
    

    此脚本将训练数据集的文件路径推送到 Redis 数据库中名为 datasets 的列表。工作负载将使用此队列来查找要处理的下一个数据集。

  5. 部署 Service 以使 Redis 服务器在 GKE 集群中可被发现。

    kubectl apply -f ./kubernetes-manifests/redis-service.yaml
    

运行批处理工作负载

至此,您已准备好 GKE 集群、Redis 作业队列和文件共享。现在,您可以运行批量工作负载。

在本部分中,您将使用示例工作负载的容器映像和批量金融交易数据来训练欺诈检测模型。训练过程可总结如下:

  1. Redis 客户端声明 Redis 队列中的作业(数据集的文件路径),并在作业完成后将其从队列中移除。

  2. 模型训练管理器类 FraudDetectionModelTrainer 会加载新一批数据以及(可选的)机器学习模型的保存状态。数据集用于优化模型(此过程称为“温启动”训练)。

  3. 模型的新状态以及批量详细信息和性能分数的报告保存在 Filestore NFS 卷中,可使用 PersistentVolumeClaim 在 GKE 集群中访问。

如需了解详情,请浏览源代码

定义作业

以下清单描述了批量工作负载映像的 Kubernetes 作业。

apiVersion: batch/v1
kind: Job
metadata:
  name: workload
spec:
  parallelism: 1
  template:
    metadata:
      name: workload
    spec:
      nodeSelector:
        cloud.google.com/gke-spot: "true"
      containers:
      - name: workload
        image: "us-docker.pkg.dev/google-samples/containers/gke/batch-ml-workload"
        volumeMounts:
        - mountPath: /mnt/fileserver
          name: workload-pvc
      volumes:
      - name: workload-pvc
        persistentVolumeClaim:
          claimName: fileserver-claim
          readOnly: false
      restartPolicy: OnFailure

部署工作负载

  1. 部署作业:

    kubectl apply -f ./kubernetes-manifests/workload.yaml
    
  2. 检查 workload-XXX Pod 的状态是否为 Completed

    watch kubectl get pods
    

    此过程可能需要几秒钟的时间。您可以按 Ctrl+C 返回到命令行。

    输出内容类似如下:

    NAME             READY   STATUS      RESTARTS   AGE
    redis-leader     1/1     Running     0          16m
    workload-4p55d   0/1     Completed   0          83s
    
  3. 检查来自 workload 作业的日志:

    kubectl logs job/workload
    

    输出内容类似如下:

    Worker with sessionID: b50f9459-ce7f-4da8-9f84-0ab5c3233a72
    Initial queue state: empty=False
    Processing dataset: datasets/training/2018-04-04.pkl
    Processing dataset: datasets/training/2018-04-03.pkl
    Processing dataset: datasets/training/2018-04-02.pkl
    Processing dataset: datasets/training/2018-04-01.pkl
    Queue empty, exiting
    

    .pkl 文件是包含一批信用卡交易的序列化数据集,标记为有效或欺诈。workload 作业遍历这些文件,即解压缩数据集并使用它们来训练机器学习模型,然后从 Redis 队列中移除这些数据集。工作负载会继续批量处理数据,直到 Redis 队列清空,然后成功退出。

探索 NFS 卷

在运行期间,工作负载会在已装载的 NFS 卷中创建文件,其他批量作业或在线应用可以跨集群访问这些文件。

  1. 列出工作负载创建的文件:

    kubectl exec --stdin --tty redis-leader -- /bin/sh -c "ls -1 /mnt/fileserver/output"
    

    输出应如下所示:

    model_cpt_2018-04-01.pkl
    model_cpt_2018-04-02.pkl
    model_cpt_2018-04-03.pkl
    model_cpt_2018-04-04.pkl
    report.txt
    

    经过训练的模型的检查点(类似 model_cpt_XXX.pkl 这样的文件名)和模型性能报告 (report.txt) 是在 NFS 卷上的 /mnt/fileserver/output 目录中创建的。

  2. 检查模型性能报告:

    kubectl exec --stdin --tty redis-leader -- /bin/sh -c "cat /mnt/fileserver/output/report.txt"
    

    下面是输出中包含的一个代码段:

    Report generated on: 2022-02-09 14:19:42.303619
    Training dataset: 2018-04-04.pkl
    Model checkpoint: model_cpt_2018-04-04.pkl
    ---
    Accuracy on training data: 0.9981112277019937
    Accuracy on testing data: 0.9977204434773599
    

    该文件包含详细介绍训练时间、使用的数据集、获得的准确率以及与训练关联的模型检查点文件名的条目。

如需详细了解 NFS 卷,请参阅 Filestore 指南

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

移除各个资源

如需移除为本教程创建的各个资源,请运行以下命令。

  1. 删除集群:

    gcloud container clusters delete batch-aiml \
        --region=us-central1
    
  2. 删除 Filestore 实例:

    gcloud filestore instances delete batch-aiml-filestore \
        --zone=us-central1-b
    

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤