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