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

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

网络配置#

最终用户通常只需要直接与集群的 head 节点进行交互。特别是,有两个服务应该暴露给用户:

  1. 仪表板

  2. Ray 客户端服务器

注意

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

有关详细列表,请参阅 Ray 端口配置

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

系统配置#

在使用 Ray 进行大规模部署时,有几个系统级别的配置应该被设置。

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

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

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

配置 head 节点#

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

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

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

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

配置自动扩展器#

对于大型、长时间运行的集群,有几个参数可以进行调整。

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

  • 对于长时间运行的集群,将 AUTOSCALER_MAX_NUM_FAILURES 环境变量设置为一个很大的数字(或 inf),以避免意外的自动扩展器崩溃。可以通过在 head 节点的 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),其性能 outweighs 价格。(实例价格可能更高,但您使用实例的时间更短。)

  • 如果您正在进行开发工作并且实际上不会完全利用 GPU,则可以考虑使用较旧的实例。

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

哪种类型的 CPU?

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

  • 如果不确定,请使用 M 实例,它们通常可用性最高。

  • 如果您知道您的应用程序是内存密集型的(内存利用率已满,但 CPU 未满),请选择 R 实例

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

  • 如果您有一个大集群,请将 head 节点配置为具有 n(r5dn 或 c5n)的实例

有多少 CPU/GPU?

  • 首先关注您的 CPU:GPU 比率并查看利用率(Ray 仪表板应该对此有帮助)。如果您的 CPU 利用率很低,则添加 GPU,反之亦然。

  • 确切的比率将非常取决于您的工作负载。

  • 找到好的比率后,您应该能够扩展并保持相同的比率。

  • 您无法无限地扩展。最终,随着您添加更多机器,您的性能改进将变得不那么线性/不值得。此时可能没有一种适合所有情况的策略。

注意

如果您正在使用 RLlib,请查看 RLlib 可伸缩性指南 以获取 RLlib 特定的建议。