Ray和vLLM职责边界
目录
一句话结论(先记住)
Ray 管理的最小调度单元是「资源(resource)」——通常是“服务器里的某张 GPU”,不是整台 GPU 服务器。
但它运行在服务器之上,两者不是对立关系。
一、Ray 的资源模型(核心概念)
Ray 把整个集群抽象成:
Ray Cluster
├── Node(一台服务器)
│ ├── CPU: 64
│ ├── GPU: 8
│ └── Memory
├── Node(一台服务器)
│ ├── CPU: 32
│ ├── GPU: 4
│ └── Memory
Node = 服务器
Resource = 服务器里的 CPU / GPU / 自定义资源
二、Ray 实际调度的是“服务器里的哪张 GPU”
1️⃣ GPU 在 Ray 中的表示
假设一台服务器:
Server A
- GPU 0
- GPU 1
- GPU 2
- GPU 3
Ray 看到的是:
Node A:
GPU: 4
当你写:
@ray.remote(num_gpus=1)
class Worker:
pass
Ray 的行为是:
- 在某个 Node 上
- 分配 1 个 GPU slot
- 设置
CUDA_VISIBLE_DEVICES - 启动 Worker 进程
👉 本质是“锁定一张具体 GPU”
2️⃣ Ray 不会把一整个服务器“绑死”
错误理解 ❌:
Ray 一调度就是一整台 GPU 服务器
正确理解 ✅:
Ray 会在服务器内部做 GPU 级别的资源切分
三、Ray 管理粒度总结
| 层级 | Ray 是否感知 | 是否调度 |
|---|---|---|
| 集群 | ✅ | ❌ |
| 服务器(Node) | ✅ | 间接 |
| GPU(单卡) | ✅ | ✅ 最小调度单位 |
| GPU 内 SM | ❌ | ❌ |
四、Ray 与 vLLM 的“职责边界”(非常重要)
当 Ray + vLLM 一起用时
Ray
├── 把 GPU 分给 vLLM Worker
└── 管理 Worker 生命周期
vLLM
├── 用到哪几张 GPU
├── Tensor Parallel / Pipeline Parallel
├── 请求 batching / KV cache
也就是说:
- Ray 决定“哪几张 GPU 给这个模型服务”
- vLLM 决定“这几张 GPU 怎么一起算一个模型”
五、为什么你现在完全不需要 Ray
你当前场景:
- 单机
- 双卡
- 模型固定
- GPU 不抢占
在这种情况下:
CUDA_VISIBLE_DEVICES=0,1
--tensor-parallel-size 2
就已经完成了 100% 所需调度。
Ray 在这里只会:
- 多一层进程管理
- 多一层通信
- 没有吞吐收益
六、什么时候 Ray 的 GPU 级调度才“有价值”
Ray 真正发挥价值的典型场景:
1️⃣ 一台机器跑多个模型
GPU 0–1 → 模型 A
GPU 2–3 → 模型 B
GPU 4–7 → 模型 C
Ray 可以动态分配 GPU 给不同模型服务。
2️⃣ 异构 GPU 集群
Node1: A100 ×8
Node2: L40S ×4
Node3: 3090 ×2
Ray 可以:
- 根据模型大小选择 GPU
- 控制 worker placement
3️⃣ 弹性伸缩 / 抢占式 GPU
- AutoDL / K8s
- Spot 实例
- GPU 会上下线
七、一句“工程级总结”(面试用)
Ray 的调度粒度是服务器内的 GPU 资源,而不是整台服务器。
在单机多卡、模型固定的推理场景中,vLLM 自身已经完成了 GPU 级调度,因此不需要引入 Ray。
Ray 更适合多节点、异构 GPU 和弹性资源管理场景。
如果你愿意,下一步我可以帮你:
- 画一张 Ray vs vLLM GPU 调度分层图
- 给你一个 Ray + vLLM 的典型多机生产架构
- 或直接告诉你 什么时候“上 Ray 会显著提升吞吐,什么时候一定不会”
你选一个即可。

浙公网安备 33010602011771号