运行 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、调用方取结果。
如果继续扩展
如果你把它继续做成独立项目,可以按这个顺序扩展:
- 增加任务重试:
@ray.remote(max_retries=3)。 - 增加任务取消:让 pending 任务可以被取消。
- 增加显式任务队列:把提交和执行调度分离。
- 增加对象引用计数:没有引用时释放对象。
- 增加 Actor Pool:实现负载均衡。
- 用
multiprocessing替换线程:体验序列化和进程隔离。 - 增加本地 HTTP Dashboard:展示 metrics、对象和 Actor。
结课检查
如果你能回答下面问题,就已经抓住了 Ray Core 的主线:
- 为什么
.remote()返回ObjectRef而不是直接返回值? - 为什么
ray.get放在循环里会破坏并行性? ray.put解决了什么问题?- Actor 和 Task 的本质区别是什么?
- 资源声明是操作系统限制还是调度约束?
- 一次 Task 从 Driver 到 Worker 大概经过哪些组件?
- 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 拆成独立章节来做。