Ray-Learn(一):actor、资源账本与三个静默陷阱
主流 RL 框架里有一大半把控制面建在 Ray 上,但它们几乎都不用 Ray 的上层库。这一篇从 task / actor 的语义讲起,把资源账本的「账面数字」和物理占用拆开,并用三个可复现的实验说明:多机 RL 里最常见的故障,往往不报错。
Tag
6 posts · all tags
主流 RL 框架里有一大半把控制面建在 Ray 上,但它们几乎都不用 Ray 的上层库。这一篇从 task / actor 的语义讲起,把资源账本的「账面数字」和物理占用拆开,并用三个可复现的实验说明:多机 RL 里最常见的故障,往往不报错。
资源从「几张卡」推进到「卡落在哪」。Placement Group 的 gang 语义、 bundle 顺序为什么不可控、get_gpu_ids 如何翻译成 local rank,以及手工 rendezvous 怎样把 N 个 actor 收成一个 torch 进程组。
推理引擎为什么不能塞进 actor 的 event loop,ObjectRef 为什么会自动解引用,故障该分成哪三类,以及 ray.util.collective 在权重广播里的正确姿势。这一篇覆盖 RL 系统里最容易写出「看起来能跑」的那部分代码。
runtime_env 的覆盖顺序、具名服务与拓扑调度、作业生命周期;再把 slime、verl、 NeMo-RL、AReaL、prime-rl 放在同一张表上对比。抽象每加一层,代码量涨一个量级—— 选型问题到最后是预算问题。
前四篇把单机语义讲完了。这一篇补上多机上真正会疼的三块:节点角色怎么用自定义资源钉死、同一 actor 里长短任务怎么分池、以及 Ray 与子进程之间的责任边界。另附具名 actor 死亡后的调用语义。
把 slime / miles / verl / AReaL / NeMo-RL / prime-rl / TransferQueue 里真实用到的 Ray API 压成一张对账表:谁在用、为什么用、对应哪一篇。并给出按框架的阅读顺序,以及明确可以不学的部分。