在强化学习领域,Ray 是备受关注的开源分布式计算框架,OpenAI 声明使用了 Ray 作为 ChatGPT 大模型训练的底层平台;人工智能平台 PAI(Platform for Artificial Intelligence)是阿里云面向企业客户及开发者的一站式开发平台,为用户提供开箱即用、高性能、高稳定的企业级云原生 AI 工程化能力。
Ray 与 PAI 平台相结合,能够充分发挥两者优势,为用户带来更易用、调度能力更强、高可用的模型训练体验,本文将详细介绍 Ray 在训练服务 PAI-DLC 中的最佳实践,助力用户更好地利用这一组合,最大化模型训练效率和效果。
1. Ray 和 PAI 介绍
1.2 Ray
Ray 集成了多个 AI 库,拥有丰富的生态系统,包括 Ray Tune(超参数调优)、Ray RLlib(强化学习)、Ray Serve(模型部署)、RaySGD 的分布式运行环境,提供了全面的AI解决方案,使得 AI 并行训练更容易和高效。 OpenAI 声明使用了 Ray 作为 ChatGPT 大模型训练的底层平台(《How Does Ray, a Distributed AI System, Powers OpenAI’s ChatGPT?》)。
1.3 阿里云人工智能平台 PAI
人工智能平台 PAI(Platform for Artificial Intelligence)是阿里云面向企业客户及开发者的一站式开发平台,提供包括数据标注、模型开发、模型训练、模型推理在内的 AI 开发全链路服务,内置丰富的大模型最佳实践和行业场景插件,为用户提供开箱即用、高性能、高稳定的企业级云原生 AI 工程化能力。
2. Ray on PAI
Ray on PAI 是由 PAI 分布式训练产品 PAI-DLC 推出的一项全新任务类型,通过将 Ray 无缝集成到 PAI-DLC 中,用户可以将 Ray 框架的训练脚本直接提交至 PAI-DLC 进行训练,无需手动部署 Ray 集群,也无需关注底层 Kubernetes 基础设置的复杂配置。
一键提交 Ray 任务,开发人员真正实现上手0成本,并可享受到 PAI 平台提供高效调度、自愈和企业级的管理能力。
2.2 Ray+PAI:开箱即用,一键提交
PAI-DLC 提供直观的用户界面和易于理解的 API,对于用户,无需搭建 Ray 集群,一键提交 Ray 任务,支持 Ray 原生能力,实现了云上提交 Ray,免部署、免运维、上手0成本。
2.2 Ray+PAI:统一调度,高利用率
在 PAI-DLC 上提交 Ray 任务,将完整享受 PAI 统一调度引擎能力,包括自动支持网络拓扑感知、算力拓扑感知,智能、FIFO、遍历、均衡排队策略, 多级 Quota 的共享、抢占调度机制, 最终实现集群90%+的算力利用率。
除了 Ray,PAI-DLC 还支持 Megatron、Deepspeed、Pytorch、MPI、Slurm 等10+业内主流 AI 训练框架,使用 PAI-DLC,意味着一份算力,可以运行 Ray 任务,也可以一键提交其他任务,随时在多种 AI 场景切换和使用。
2.2 Ray+PAI:LLM 容错,稳定可靠
- RayNative 的容错机制:针对 Ray 框架,按照应用层面和系统层,分别提供优化容错机制,全面提升容错能力。支持某大模型团队,多个千卡 RL 任务,故障识别率90%+,Ray 的 RL 训练任务稳定运行超过一周。
- 高可用:通过 AIMaster 弹性容错引擎、 节点自愈引擎和 EasyCKPT 大模型 CKPT 引擎,实现故障节点分钟级自愈,任务分钟级恢复、CKPT 秒级保存, 保障 Ray 任务持续运行, 有效降低人力和避免算力的浪费。
- 可观测:构建覆盖多资源类型的精细化 Metric 体系,为训练稳定性监控、训练调优、算力管理等场景,提供可视化数据支撑。提供任务、POD、卡等多维度,数百个监控指标,支持 Ray Dashboard,并且对接云监控和 ARMS,满足客户云上多样的可观测需求。
2.2 Ray+PAI:企业级能力
针对大型客户,PAI 提供完整的企业级能力,实现 AI 算力、AI 任务、AI 资产、AI 数据的可管可控,具体来说:
- 工作空间:为企业和团队提供统一的计算资源管理及人员权限管理能力,为 AI 开发者提供支持团队协作的全流程开发工具以及 AI 资产管理能力。
- 用户管理:提供用户、角色、组织、权限、安全,企业用户访问控制,以及平台审计能力。
- 资源管理:精细化计算资源分配,资源观测与多维度指标监控能力。
- 任务管理:任务调度策略的配置,事件通知管理能力,任务状态异常告警。
- 资产管理:企业自有数据处理和存储,数据集、模型、镜像、代码配置、自定义组件的管理。
- 被集成:提供面向 MLOps 流程的 workflow 编排能力,PAIFlow;全链路标准 OpenAPI 及 SDK,实现与企业自有系统集成。
3. 使用案例
3.1 进入 PAI-DLC
登录 PAI 控制台,左侧目录选择 PAI-DLC,新建 PAI-DLC 任务,选择 Ray 框架。
3.2 参数配置
- 节点镜像
节点镜像会被同时用于 head 和 worker 节点容器。用户所用 Ray 镜像版本应 >= 2.6,可以使用 Ray 社区提供的 docker 镜像 ,目前的测试均基于2.9版本。Ray 社区还提供了镜像,内置了包括 pytorch、tensorflow 等机器学习框架的支持。使用 GPU 时需提供包含支持 cuda 的镜像。更多支持的镜像版本请参考官方 Docker镜像文档。(https://x.sm.cn/EA0wS1g)
- 运行时环境
目前 PAI-DLC 仅支持通过配置三方库配置的三方库列表(ThirdpartyLibs),后续会逐步开放通过框架高级配置(Settings.AdvancedSettings)来配置 Ray 的环境运行依赖(runtime_env)。在生产环境中,强烈建议使用已经打包好的镜像来执行任务,避免因为临时安装依赖库造成的任务失败。
- 启动命令
PAI-DLC 任务的启动命令会被用作 ray job submit 所提交的 entrypoint 命令,通常为运行一个 Python 脚本文件。例如:
python /root/code/sample.py
需注意,目前只有第一行命令会被 ray 提交至 ray cluster 运行,如果有多个命令请用 ; 或者 && 连接。如果需要在命令里直接放入 Python 脚本,可以采用参考下面的例子:
echo 'import ray import os import requests ray.init() @ray.remote class Counter: def __init__(self): # Used to verify runtimeEnv self.name = os.getenv("counter_name") # assert self.name == "ray" self.counter = 0 def inc(self): self.counter += 1 def get_counter(self): return "{} got {}".format(self.name, self.counter) counter = Counter.remote() for _ in range(50000): ray.get(counter.inc.remote()) print(ray.get(counter.get_counter.remote()))' >> sample.py && python sample.py
- 资源准备
任务节点
PAI-DLC 支持 Ray Cluster 的两种可配置的任务节点类型:Head 和 Worker。
配置资源数量时,Head 节点的数量必须为1。同时在 PAI-DLC 平台上,Head 节点只会被用于运行 entrypoint 脚本,不会被用作 Ray Worker 节点。
除此以外,每个 Ray 任务 PAI-DLC 会自动生成一个 Submitter 节点用于执行任务启动命令,同时用户可以通过 Submitter 节点的日志来浏览查看提交的 Ray 任务日志。在预付费任务中,该节点会共享占用极小部分用户资源用于启动任务;而在后付费任务中,会生成一个最小可用的资源类型节点。
资源数量
Ray Cluster worker 节点上的 Logical Resources(https://x.sm.cn/EtaHyvL)与用户在提交任务时配置的物理资源一致。例如,当用户配置了1个8卡的 GPU 节点时,Ray cluster worker 节点默认的资源大小也为 8 GPUs。如使用如下 @ray.remote 修饰函数或者类,会产生两个 Tasks 或者 Actors:
@ray.remote(num_gpus=4)
资源的配置需要符合任务的需求。一般而言,少而大的节点好过多而小的节点。通常每个节点建议的内存大小为至少 2 GiB,并且根据 Task/Actor 数量增长而增加,否则容易出现 OOM 错误。
3.3 实操案例
- Train PyTorch ResNet model with GPUs on PAI-DLC
1. 选择镜像地址,参考使用 ray-ml:2.9.3-py310-cu118。
2. 将代码克隆并上传至 PAI 代码配置,或直接本地上传。(https://x.sm.cn/2EKbzFc)
3. 输入任务启动命令。
4. 选择 Ray 框架,并配置 head 和 worker 资源。
5. 创建任务;等待任务完成,并查看任务日志。