部署大型集群的最佳实践#

本节旨在记录大规模部署 Ray 集群的最佳实践。

网络配置#

终端用户只需要直接与集群的头节点交互。特别地,有两个服务应该暴露给用户

  1. Dashboard

  2. Ray Client Server

注意

虽然用户只需要 2 个端口即可连接到集群,但集群内的节点需要更广泛的端口范围进行通信。

有关完整列表,请参阅 Ray 端口配置

应用程序(例如 Ray Serve)可能还需要额外的端口才能正常工作。

系统配置#

在大规模使用 Ray 时,应设置一些系统级配置。

  • 确保 ulimit -n 设置为至少 65535。Ray 在 worker 进程之间打开许多直接连接以避免瓶颈,因此它可以快速使用大量文件描述符。

  • 确保 /dev/shm 足够大。大多数 ML/RL 应用 heavily 依赖 plasma store。默认情况下,Ray 会尝试使用 /dev/shm 作为对象存储,但如果它不够大(即 --object-store-memory > /dev/shm 的大小),Ray 将转而将 plasma store 写入磁盘,这可能会导致严重的性能问题。

  • 如果可能,请使用 NVMe SSD(或其他高性能存储)。如果启用了对象溢写,Ray 会在必要时将对象溢写到磁盘。这在数据处理工作负载中最为常见。

配置头节点#

除了上述更改之外,部署大型集群时,Ray 的架构意味着头节点由于运行着 GCS 等额外的系统进程而承受额外的压力。

  • 头节点的一个良好起始硬件配置是 8 核 CPU 和 32GB 内存。实际硬件配置取决于工作负载和集群的大小。用于决定硬件配置的有用指标包括 CPU 使用率、内存使用率和网络带宽使用率。

  • 确保头节点具有足够的带宽。头节点上压力最大的资源是出站带宽。对于大型集群(请参阅可扩展性范围),我们建议使用至少与 AWS EC2 上的 r5dn.16xlarge 具有同等网络性能的机器。

  • 在头节点上设置 resources: {"CPU": 0}。(对于使用 KubeRay 部署的 Ray 集群,设置 rayStartParams: {"num-cpus": "0"}。请参阅KubeRay 集群配置指南。)由于网络负载较大(以及 GCS 和 dashboard 进程),我们建议将头节点的逻辑 CPU 资源数量设置为 0,以避免在其上调度额外的任务。

配置自动扩缩容器#

对于大型、长时间运行的集群,有一些参数可以进行调优。

  • 确保你的节点类型配额设置正确。

  • 对于长时间运行的集群,将 AUTOSCALER_MAX_NUM_FAILURES 环境变量设置为一个大数(或 inf),以避免自动扩缩容器意外崩溃。可以在头节点的 Ray 启动命令前加上 export AUTOSCALER_MAX_NUM_FAILURES=inf; 来设置该变量。(注意:你可能需要一个单独的机制来检测自动扩缩容器是否经常出错)。

  • 对于大型集群,考虑调优 upscaling_speed 以加快自动扩缩容速度。

选择节点#

以下是一些关于如何为集群设置 available_node_types 的技巧,以 AWS 实例类型为例进行具体说明。

AWS 实例类型的一般建议

何时使用 GPU

  • 如果你正在使用某种 RL/ML 框架

  • 你正在使用 tensorflow/pytorch/jax(某种能很好地利用 GPU 的框架)

哪种类型的 GPU?

  • 最新一代 GPU 几乎总是最具性价比的选择(p3 > p2, g4 > g3),对于大多数精心设计的应用而言,性能优势超过了价格劣势。(实例价格可能更高,但你使用实例的时间更少。)

  • 不过,如果你是在进行开发工作且不会充分利用 GPU,则可以考虑使用旧型号实例。

  • 如果你进行训练(ML 或 RL),应使用 P 实例。如果你进行推理,应使用 G 实例。区别在于处理能力与显存 (VRAM) 的比例(训练需要更多内存)。

哪种类型的 CPU?

  • 同样,请坚持使用最新一代,它们通常更便宜、更快。

  • 拿不准时使用 M 实例,它们的可用性通常最高。

  • 如果你知道你的应用是内存密集型的(内存使用率很高,但 CPU 使用率不高),请选择 R 实例

  • 如果你知道你的应用是 CPU 密集型的,请选择 C 实例

  • 如果你有一个大型集群,将头节点设置为带有 'n'(r5dn 或 c5n)的实例

需要多少 CPU/GPU?

  • 首先关注你的 CPU:GPU 比例并查看利用率(Ray dashboard 应该能帮到你)。如果你的 CPU 利用率低,增加 GPU,反之亦然。

  • 确切的比例将非常依赖于你的工作负载。

  • 一旦找到合适的比例,你应该能够按比例扩展集群。

  • 你不能永远无限地扩展。最终,随着你增加更多机器,性能提升将变得低于线性/不值得。此时可能没有一刀切的策略。

注意

如果你正在使用 RLlib,请查看RLlib 扩缩容指南获取 RLlib 的具体建议。