大规模集群部署的最佳实践#

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

网络配置#

终端用户应只需直接与集群的头节点进行交互。特别是,有两个服务应向用户开放:

  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将在必要时将对象溢出到磁盘。这在数据处理工作负载中最常见。

配置主节点#

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

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

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

  • 在头节点上设置 resources: {"CPU": 0}。(对于使用 KubeRay 部署的 Ray 集群,设置 rayStartParams: {"num-cpus": "0"}。请参阅 KubeRay 集群的配置指南。)由于网络负载较重(以及 GCS 和仪表盘进程),我们建议将头节点上的逻辑 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,你可能需要考虑使用较旧的实例。

  • 如果你在进行训练(机器学习或强化学习),你应该使用P实例。如果你在进行推理,你应该使用G实例。区别在于处理:VRAM比例(训练需要更多内存)。

什么类型的CPU?

  • 再次强调使用最新一代的产品,它们通常更便宜且更快。

  • 如果有疑问,请使用 M 实例,它们通常具有最高的可用性。

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

  • 如果你的应用程序是CPU密集型的,选择C实例

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

有多少CPU/GPU?

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

  • 确切的比率将非常依赖于你的工作量。

  • 一旦你找到一个合适的比例,你应该能够扩大规模并保持相同的比例。

  • 你不能无限扩展。最终,随着你添加更多机器,性能提升将变得次线性/不值得。此时可能没有一个通用的策略。

备注

如果你在使用 RLlib,请查看 RLlib 扩展指南 以获取 RLlib 特定的建议。