Ray Train XGBoostTrainer 在 Kubernetes 上#

备注

要学习Ray在Kubernetes上的基础知识,我们建议先查看 入门指南

在本指南中,我们将向您展示如何在 Kubernetes 基础设施上运行一个 Ray 机器学习工作负载的示例。

我们将使用100GB的训练集运行Ray的XGBoost训练基准测试。要了解更多关于使用Ray的XGBoostTrainer的信息,请查看XGBoostTrainer文档

在 GCP 上设置 Kubernetes 基础设施#

本文档提供了在GCP上创建Kubernetes集群的说明,但类似的设置也适用于任何主要的云提供商。如果你想在其他云提供商上设置Kubernetes集群,请查看入门指南。如果你已经有一个Kubernetes集群,可以忽略此步骤。

# Set up a cluster on Google Kubernetes Engine (GKE)
gcloud container clusters create autoscaler-ray-cluster \
    --num-nodes=10 --zone=us-central1-c --machine-type e2-standard-16 --disk-size 1000GB

# (Optional) Set up a cluster with autopilot on Google Kubernetes Engine (GKE).
# The following command creates an autoscaling node pool with a 1 node minimum and a 10 node maximum.
# The 1 static node will be used to run the Ray head pod. This node may also host the KubeRay
# operator and Kubernetes system components. After the workload is submitted, 9 additional nodes will
# scale up to accommodate Ray worker pods. These nodes will scale back down after the workload is complete.
gcloud container clusters create autoscaler-ray-cluster \
    --num-nodes=1 --min-nodes 1 --max-nodes 10 --enable-autoscaling \
    --zone=us-central1-c --machine-type e2-standard-16 --disk-size 1000GB

确保你已连接到你的 Kubernetes 集群。对于 GCP,你可以通过以下方式进行连接:

  • 导航到您的 GKE 集群页面,并点击“连接”按钮。然后,复制“命令行访问”。

  • gcloud container clusters get-credentials <your-cluster-name> --region <your-region> --project <your-project> (链接)

  • kubectl config use-context (链接)

对于本指南中的工作负载,建议使用具有以下属性的 Kubernetes 节点池或节点组:

  • 总共10个节点

  • 每个节点的容量为 16 个 CPU 和 64 Gi 内存。对于主要的云服务提供商,合适的实例类型包括

    • m5.4xlarge (亚马逊网络服务)

    • Standard_D5_v2 (Azure)

    • e2-standard-16 (Google Cloud)

  • 每个节点应配置1000千兆字节的磁盘空间(用于存储训练集)。

部署 KubeRay 操作员#

一旦你设置好了 Kubernetes 集群,部署 KubeRay 操作员。请参考 入门指南 获取此步骤的说明。

部署一个 Ray 集群#

现在我们准备好部署将执行我们工作负载的 Ray 集群。

小技巧

我们将部署的 Ray 集群配置为每个 16-CPU 的 Kubernetes 节点调度一个 Ray pod。每个 Kubernetes 节点一个 Ray pod 的模式是推荐的,但不是必需的。总的来说,使用几个大的 Ray pod 比使用许多小的 Ray pod 更高效。

我们建议查看以下命令中应用的 [配置文件][ConfigLink]。

kubectl apply -f https://raw.githubusercontent.com/ray-project/ray/releases/2.0.0/doc/source/cluster/kubernetes/configs/xgboost-benchmark.yaml

将创建一个 Ray 主节点 pod 和 9 个 Ray 工作节点 pod。

可选:部署一个自动扩展的 Ray 集群

如果你已经设置了一个自动扩展的节点组或池,你可能希望通过应用配置 [xgboost-benchmark-autoscaler.yaml][ConfigLinkAutoscaling] 来部署一个自动扩展的集群。一个 Ray 头节点将被创建。一旦工作负载开始,Ray 自动扩展器将触发 Ray 工作节点的创建。然后,Kubernetes 自动扩展将创建节点来放置 Ray 节点。

运行工作负载#

要观察 Ray 头节点的启动进度,请运行以下命令。

# If you're on MacOS, first `brew install watch`.
watch -n 1 kubectl get pod

一旦 Ray 头节点进入 Running 状态,我们就可以执行 XGBoost 工作负载了。我们将使用 Ray 作业提交 来启动工作负载。

连接到集群。#

在本指南中,我们使用端口转发作为一种简单的方式来试验 Ray 集群的服务。有关生产用例,请参阅 网络说明

# Run the following blocking command in a separate shell.
kubectl port-forward service/raycluster-xgboost-benchmark-head-svc 8265:8265

提交工作负载。#

我们将使用 Ray Job Python SDK 来提交 XGBoost 工作负载。

from ray.job_submission import JobSubmissionClient

client = JobSubmissionClient("http://127.0.0.1:8265")

kick_off_xgboost_benchmark = (
    # Clone ray. If ray is already present, don't clone again.
    "git clone https://github.com/ray-project/ray || true; "
    # Run the benchmark.
    "python ray/release/train_tests/xgboost_lightgbm/train_batch_inference_benchmark.py"
    " xgboost --size=100G --disable-check"
)


submission_id = client.submit_job(
    entrypoint=kick_off_xgboost_benchmark,
)

print("Use the following command to follow this Job's logs:")
print(f"ray job logs '{submission_id}' --follow")

要提交工作负载,请运行上述 Python 脚本。该脚本可在 [Ray 仓库][XGBSubmit] 中找到。

# Download the above script.
curl https://raw.githubusercontent.com/ray-project/ray/releases/2.0.0/doc/source/cluster/doc_code/xgboost_submit.py -o xgboost_submit.py
# Run the script.
python xgboost_submit.py

观察进度。#

基准测试可能需要长达60分钟的时间来运行。使用以下工具来观察其进度。

作业日志#

要查看作业的日志,请使用上述提交脚本打印的命令。

# Substitute the Ray Job's submission id.
ray job logs 'raysubmit_xxxxxxxxxxxxxxxx' --follow --address http://127.0.0.1:8265

Kubectl#

观察集群中的 Pod

# If you're on MacOS, first `brew install watch`.
watch -n 1 kubectl get pod

Ray 仪表盘#

在浏览器中访问 localhost:8265 以查看 Ray 仪表板。

Ray 状态#

观察自动扩展状态和 Ray 资源使用情况

# Substitute the name of your Ray cluster's head pod.
watch -n 1 kubectl exec -it raycluster-xgboost-benchmark-head-xxxxx -- ray status

备注

在某些情况下,对于特定的云服务提供商,Kubernetes API 服务器可能在 Kubernetes 集群调整大小时短暂不可用。

如果发生这种情况,请不要担心——Ray 工作负载应该不会中断。对于本指南中的示例,请等待 API 服务器重新启动,重新启动端口转发过程,并重新运行作业日志命令。

任务完成#

基准测试结果#

一旦基准测试完成,作业日志将显示结果:

Results: {'training_time': 1338.488839321999, 'prediction_time': 403.36653568099973}

基准测试的性能对底层云基础设施敏感——你可能无法匹配 基准测试文档中引用的数字

模型参数#

Ray head pod 中的文件 model.json 包含了训练模型的参数。其他结果数据将在 head pod 的目录 ray_results 中可用。详情请参阅 XGBoostTrainer 文档

缩小

如果启用了自动扩展,Ray 工作节点将在 60 秒后缩减。在 Ray 工作节点消失后,您的 Kubernetes 基础设施应缩减托管这些节点的节点。

清理#

使用以下命令删除您的 Ray 集群:

kubectl delete raycluster raycluster-xgboost-benchmark

如果你在公共云上,别忘了清理底层节点组和/或Kubernetes集群。