Skip to content

运行 Mini Ray 预览版

这一章只负责把当前仓库里的 Mini Ray 预览版跑起来。它能帮助你观察 Ray Core 的几条执行路径,但不承担深入实现课的任务。

运行测试

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

测试覆盖:

  • 远程函数执行。
  • put 和依赖解析。
  • wait 返回最先完成的引用。
  • Actor 方法串行执行。
  • 远程异常传播。

运行 Demo

bash
uv run python examples/mini_ray_runtime/demos/01_tasks.py
uv run python examples/mini_ray_runtime/demos/02_objects_and_wait.py
uv run python examples/mini_ray_runtime/demos/03_actor_counter.py
uv run python examples/mini_ray_runtime/demos/04_map_reduce.py
uv run python examples/mini_ray_runtime/demos/05_scheduler_resources.py
uv run python examples/mini_ray_runtime/demos/06_failures.py

代码走读

从这个例子开始:

python
@ray.remote
def slow_square(x):
    time.sleep(0.2)
    return x * x

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

对应实现链路:

这个流程是 Ray Core 的最小教学版:提交任务、返回引用、调度执行、对象 ready、调用方取结果。

和真实 Ray 的差距

能力Mini Ray真实 Ray
执行单元线程多进程 Worker
集群单进程多节点
对象存储Python 字典共享内存对象存储、对象管理器
调度本地资源计数分布式调度、数据局部性、Placement Group
容错异常传播重试、Actor 重启、GCS 容错、对象重建
观测metrics()Dashboard、State API、Metrics、日志

差距很大,但主线一致:提交任务、返回引用、运行时调度、对象 ready、调用方取结果。

如果继续扩展

如果你把它继续做成独立项目,可以按这个顺序扩展:

  1. 增加任务重试:@ray.remote(max_retries=3)
  2. 增加任务取消:让 pending 任务可以被取消。
  3. 增加显式任务队列:把提交和执行调度分离。
  4. 增加对象引用计数:没有引用时释放对象。
  5. 增加 Actor Pool:实现负载均衡。
  6. multiprocessing 替换线程:体验序列化和进程隔离。
  7. 增加本地 HTTP Dashboard:展示 metrics、对象和 Actor。

结课检查

如果你能回答下面问题,就已经抓住了 Ray Core 的主线:

  1. 为什么 .remote() 返回 ObjectRef 而不是直接返回值?
  2. 为什么 ray.get 放在循环里会破坏并行性?
  3. ray.put 解决了什么问题?
  4. Actor 和 Task 的本质区别是什么?
  5. 资源声明是操作系统限制还是调度约束?
  6. 一次 Task 从 Driver 到 Worker 大概经过哪些组件?
  7. Mini Ray 和真实 Ray 最大的差距在哪里?

下一步

如果目标是继续使用和理解真实 Ray,建议按顺序看:

  • Ray Core 官方文档。
  • Ray Core internals 的 Task lifecycle。
  • Ray Dashboard 和 State API。
  • Ray Data、Train、Serve 中你最关心的一条上层库。
  • Ray 源码中的 Python API 层和 Core Worker。

如果目标是亲手做一个更像 nano-vLLM、mini-sglang 那样的小型系统项目,下一站应该是 mini-ray.llm101.moe。那里会把多进程 Worker、任务队列、对象存储、Actor、调度器和简易 Dashboard 拆成独立章节来做。

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