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

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

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

背景

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

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

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

目标

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

架构图

本教程介绍以下步骤:

  1. 创建具有标准和 Spot 虚拟机节点池的 GKE 集群。
  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. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

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

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,点击创建项目以开始创建新的 Google Cloud 项目。

    转到“项目选择器”

  6. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

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

    启用 API

设置环境

在本教程中,您将使用 Cloud Shell 来管理 Google Cloud 上托管的资源。Cloud Shell 预安装有 Docker、kubectl 和 gcloud CLI。

为了使用 Cloud Shell 设置您的环境,请执行以下操作:

  1. 在 Google Cloud Console 中,启动 Cloud Shell 实例。
    打开 Cloud Shell

  2. 下载此示例应用的源代码。

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
    cd kubernetes-engine-samples/batch/aiml-workloads
    
  3. 使用项目信息更新 scripts/variables.sh 文件:

    sed -i "\
      s/<YOUR_PROJECT_ID>/PROJECT_ID/g; \
      s/<YOUR_REGION>/REGION/g; \
      s/<YOUR_ZONE>/ZONE/g" \
      scripts/variables.sh
    

    替换以下内容:

  4. 设置必要的环境变量和 gcloud 默认值。

    source scripts/variables.sh
    gcloud config set project ${PROJECT_ID}
    gcloud config set compute/region ${REGION}
    gcloud config set compute/zone ${ZONE}
    gcloud config set filestore/zone ${ZONE}
    

创建 GKE 集群

创建一个包含两个节点池的 GKE 集群,其中 GKE 托管永久性卷并使用 Redis 作业队列运行工作负载。

  1. 创建标准 GKE 集群。此集群会使用默认配置初始化节点池。

    gcloud container clusters create ${CLUSTER_NAME} \
      --machine-type=e2-standard-2 --num-nodes=3
    
  2. 验证 GKE 集群正在运行:

    gcloud container clusters list
    

    对于 batch-aiml 集群,STATUS 值为 RUNNING

  3. 在 GKE 集群中创建将使用 Spot 虚拟机启用的第二个节点池:

    gcloud beta container node-pools create batch-node-pool \
      --cluster=${CLUSTER_NAME} --spot
    

    在本教程后面部分,您会将批处理工作负载部署到此 Spot 虚拟机节点池。

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

机器学习工作负载需要数据集和输出文件的存储解决方案。在本教程中,您将创建一个 Filestore 实例,可供 GKE 集群中的所有节点(读取和写入操作)通过永久性卷 (PV)永久性卷声明 (PVC) 访问。

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

创建 Filestore 实例

  1. 创建 Filestore 实例:

    gcloud filestore instances create ${FILESTORE_ID} \
      --tier=BASIC_HDD \
      --file-share=name="NFSVol",capacity=1TB \
      --network=name="default"
    

    其中:

    • tier 是 Filestore 实例的服务层级。本示例使用基本服务,但您可以在服务层级中了解其他选项。

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

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

  2. 验证 Filestore 实例已部署:

    gcloud filestore instances list --project=${PROJECT_ID} --zone=${ZONE}
    

    输出类似于以下内容,其中 batch-aiml-filestore 实例的 STATE 值为 READY

    INSTANCE_NAME: batch-aiml-filestore
    LOCATION: us-central1-b
    TIER: BASIC_HDD
    CAPACITY_GB: 1024
    FILE_SHARE_NAME: NFSVol
    IP_ADDRESS: 10.152.101.10
    STATE: READY
    CREATE_TIME: 2022-03-15T18:23:51
    
  3. 在输出中,记下 IP_ADDRESS 值;它将在下一部分使用。

创建永久性卷

Kubernetes 永久性卷 (PV) 规范允许 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 实例时记下的值。

  2. 部署 PV 规范:

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

创建永久性卷声明

Kubernetes 永久性卷声明 (PVC) 规范允许 Kubernetes Pod 和作业访问永久性卷的存储资源。

部署 PVC 规范:

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

使用永久性卷声明

在 GKE 集群上设置永久性卷和永久性卷声明后,您可以配置 Redis 服务器和批量作业以使用 PVC。这将显示为运行 Kubernetes 资源的虚拟机中的可装载存储卷。

检查 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 指定要使用的永久性卷声明。

  • spec.containers.volumeMounts 指定虚拟机上可以访问 Filestore 文件共享的本地文件路径。

设置 Redis 作业队列

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

为简单起见,在此示例中,您将启动单个 Redis 实例。如需查看以可扩缩的冗余方式部署 Redis 的示例,请参阅如何使用 Redis 和 PHP 创建留言板

  1. 部署 Redis 服务器规范。

    kubectl apply -f kubernetes-manifests/redis-pod.yaml
    
  2. 验证 Pod 正在运行,然后再进行下一步。在以下命令的输出中,redis-leader pod 的 STATUS 应为 Running

    kubectl get pods
    

    输出内容类似如下:

    NAME           READY   STATUS    RESTARTS   AGE
    redis-leader   1/1     Running   0          118s
    
  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 卷中,可通过永久性卷声明在 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 的状态是否为“已完成”。

    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 卷中创建文件,其他批量作业或在线应用可以跨集群访问这些文件。如需探索 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 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

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

sh scripts/cleanup.sh

后续步骤