大规模集群部署的最佳实践#
本节旨在记录大规模部署Ray集群的最佳实践。
网络配置#
终端用户应只需直接与集群的头节点进行交互。特别是,有两个服务应向用户开放:
仪表盘
Ray 客户端服务器
系统配置#
在使用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 特定的建议。