背景
批量工作负载通常设计为一个具有开始点和完成点的过程。如果您的架构涉及注入、处理和输出数据(而不是使用原始数据),则应考虑使用 GKE 上的批量工作负载。机器学习、人工智能和高性能计算 (HPC) 等领域涉及不同类型的批量工作负载,例如离线模型训练、批量预测、数据分析、物理系统模拟和视频处理。
通过设计容器化的批量工作负载,您可以利用以下 GKE 优势:
- 开放标准、社区庞大的托管式服务。
- 有效的工作负载和基础架构编排以及专用计算资源带来的成本效益。
- 容器化隔离和可移植性,允许将云用作溢出容量,同时保持数据安全。
- GKE 集群的爆发容量和随后的快速缩减。
目标
本教程适用于希望学习如何在 GKE 上(采用以下经济实惠且可扩缩的架构)运行批处理机器学习工作负载的机器学习工程师或数据科学家:
本教程介绍以下步骤:
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示:
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, GKE, and Filestore APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, GKE, and Filestore APIs.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
准备环境
克隆本教程中使用的示例代码库:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/batch/aiml-workloads
创建 GKE Autopilot 集群:
gcloud container clusters create-auto batch-aiml \ --region=us-central1
此步骤可能需要长达 5 分钟才能完成。
使用网络文件系统 (NFS) 设置数据集存储
机器学习工作负载需要数据集和输出文件的存储解决方案。在本部分中,您将创建一个 Filestore 实例,并使用 PersistentVolume 和 PersistentVolumeClaim 提供对该实例的访问权限。
如需了解详情,请参阅如何设计出色的存储策略以及如何从 GKE 集群访问 Filestore 实例。
创建一个 Filestore 实例
创建 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
:所需的卷大小。请使用资源数量中介绍的受支持的单位来指定存储值。
验证 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
请记下
IP_ADDRESS
字段中的值,在下一部分中会用到。
创建一个 PersistentVolume
Kubernetes PersistentVolume 规范允许 GKE 集群连接到 Filestore 实例。
使用 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 地址。部署 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.yaml
和 kubernetes-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 应用。
部署 Redis 服务器规范。
kubectl apply -f kubernetes-manifests/redis-pod.yaml
可使用以下命令验证 Pod 是否正在运行:
kubectl get pods
输出内容类似如下:
NAME READY STATUS RESTARTS AGE redis-leader 1/1 Running 0 118s
Pod 最多可能需要两分钟才能开始运行。
将包含训练数据集和测试数据集的文件转移到 NFS 卷。
sh scripts/transfer-datasets.sh
此脚本会将示例代码库中的文件复制到
redis-leader
Pod 上的/mnt/fileserver/datasets/
目录。填充 Redis 队列。
sh scripts/queue-jobs.sh
此脚本将训练数据集的文件路径推送到 Redis 数据库中名为
datasets
的列表。工作负载将使用此队列来查找要处理的下一个数据集。部署 Service 以使 Redis 服务器在 GKE 集群中可被发现。
kubectl apply -f ./kubernetes-manifests/redis-service.yaml
运行批处理工作负载
至此,您已准备好 GKE 集群、Redis 作业队列和文件共享。现在,您可以运行批量工作负载。
在本部分中,您将使用示例工作负载的容器映像和批量金融交易数据来训练欺诈检测模型。训练过程可总结如下:
Redis 客户端声明 Redis 队列中的作业(数据集的文件路径),并在作业完成后将其从队列中移除。
模型训练管理器类
FraudDetectionModelTrainer
会加载新一批数据以及(可选的)机器学习模型的保存状态。数据集用于优化模型(此过程称为“温启动”训练)。模型的新状态以及批量详细信息和性能分数的报告保存在 Filestore NFS 卷中,可使用 PersistentVolumeClaim 在 GKE 集群中访问。
如需了解详情,请浏览源代码。
定义作业
以下清单描述了批量工作负载映像的 Kubernetes 作业。
部署工作负载
部署作业:
kubectl apply -f ./kubernetes-manifests/workload.yaml
检查
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
检查来自
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 卷中创建文件,其他批量作业或在线应用可以跨集群访问这些文件。
列出工作负载创建的文件:
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
目录中创建的。检查模型性能报告:
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 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
移除各个资源
如需移除为本教程创建的各个资源,请运行以下命令。
删除集群:
gcloud container clusters delete batch-aiml \ --region=us-central1
删除 Filestore 实例:
gcloud filestore instances delete batch-aiml-filestore \ --zone=us-central1-b
删除项目
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
后续步骤
查看 GKE 文档。
详细探索永久性卷。
详细了解 GKE 上的作业。
浏览其他 Kubernetes Engine 教程。
探索有关 Google Cloud 的参考架构、图表和最佳实践。查看我们的 Cloud 架构中心。