部署大型集群的最佳实践#
本节旨在记录大规模部署 Ray 集群的最佳实践。
网络配置#
终端用户只需要直接与集群的头节点交互。特别地,有两个服务应该暴露给用户
Dashboard
Ray Client Server
系统配置#
在大规模使用 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 的具体建议。