Skip to content

Mini Ray 机制预览:目标与边界

这里的 Mini Ray 是一个教学附件,不是 Ray 的替代品。它只做一件事:用少量 Python 代码把 Ray Core 的几个抽象跑起来,让你把前面章节学到的概念(Task、ObjectRef、Actor、对象存储、调度)落到可执行的代码上。

这是一个机制预览版,不是完整实现课。更深入的 Mini Ray 实现系列会放到独立站点 mini-ray.llm101.moe,那个系列会更接近真实系统的边界。

代码位置:

text
examples/mini_ray_runtime/
├── mini_ray/
│   ├── __init__.py
│   └── core.py
├── demos/
└── tests/

这个预览版能跑什么

目标 API:

python
import mini_ray as ray

ray.init(num_workers=4)

@ray.remote
def square(x):
    return x * x

refs = [square.remote(i) for i in range(8)]
print(ray.get(refs))

Actor:

python
@ray.remote
class Counter:
    def __init__(self):
        self.value = 0

    def incr(self):
        self.value += 1
        return self.value

counter = Counter.remote()
print(ray.get(counter.incr.remote()))

功能清单

能力Mini Ray 是否支持说明
@ray.remote 函数支持包装普通函数,提交异步任务
ObjectRef支持代表未来可获取的对象
put/get/wait支持模拟对象存储
资源声明支持num_cpusnum_gpusresources
Actor支持每个 Actor 一个线程和队列
异常传播支持get 时抛出 MiniRayTaskError
多进程不支持用线程模拟 Worker
多节点不支持只有本地运行时
共享内存不支持用 Python 字典保存对象
容错重试不支持只记录异常

为什么只做到这里

真实 Ray 的复杂性主要来自这些生产级要求:

  • 跨进程和跨节点通信。
  • 对象共享内存与零拷贝。
  • 节点故障和任务重建。
  • 集群级资源调度。
  • Dashboard、Jobs、runtime_env。

在入门教程里同时处理这些问题,会让读者信息过载。所以这个预览版只保留一条运行时主线:

这条路径跑通之后,再看真实 Ray 的 Raylet、Core Worker、Object Store 和 GCS 会容易很多。

运行测试

bash
uv run python -m unittest discover -s examples/mini_ray_runtime/tests

直接运行 Demo:

bash
uv run python examples/mini_ray_runtime/demos/01_tasks.py
uv run python examples/mini_ray_runtime/demos/03_actor_counter.py
uv run python examples/mini_ray_runtime/demos/05_scheduler_resources.py

推荐阅读方式

先通读 examples/mini_ray_runtime/mini_ray/core.py,不要急着优化。它的类顺序就是运行时结构:

  1. ObjectRefObjectStore
  2. ResourceScheduler
  3. Runtime
  4. RemoteFunction
  5. RemoteActorClassActorHandleActorMethod
  6. 顶层 API:initremotegetputwait

如果你想继续做一个更接近真实系统边界的小型 Ray runtime,可以看本章最后的“继续学习 Mini Ray”。

面向学习目的的 Ray Core 中文导读与 Mini Ray 机制预览。