Skip to content

Commit 1a56f29

Browse files
author
Yunong He
committed
[Core] Simplify snapshot resource policies
Assisted-by: AI coding assistant Signed-off-by: Yunong He <ali_yuno@linux.alibaba.com>
1 parent 5ed0d42 commit 1a56f29

6 files changed

Lines changed: 37 additions & 33 deletions

File tree

docs/features/sleep_mode.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,17 @@ VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen3-0.6B \
123123
--enable-engine-snapshot \
124124
--enable-sleep-mode \
125125
--engine-snapshot-provider=criu_cuda \
126-
--engine-snapshot-resource-policy=l2_prepared \
126+
--engine-snapshot-resource-policy=minimized \
127127
--engine-snapshot-dir=/snapshots \
128128
--port 8000
129129
```
130130

131+
Engine snapshots expose two resource policies. The default `full` policy keeps
132+
weights, KV cache, and runtime state in the CUDA process image. The `minimized`
133+
policy removes weights and KV cache before capture, then reloads the weights
134+
from the configured model files and recreates the KV cache after restore.
135+
Intermediate resource combinations are not user-configurable.
136+
131137
Use `POST /sleep?level=3&mode=wait` to capture the EngineCore and
132138
`POST /wake_up` to restore it. `GET /snapshot/status` reports the checkpoint
133139
state. The snapshot directory contains process-image and model/runtime state;

tests/entrypoints/openai/test_cli_args.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -313,19 +313,15 @@ def test_engine_snapshot_resource_policy(serve_parser):
313313
assert args.engine_snapshot_resource_policy == "full"
314314

315315
args = serve_parser.parse_args(
316-
args=["--engine-snapshot-resource-policy", "discard_kv"]
316+
args=["--engine-snapshot-resource-policy", "minimized"]
317317
)
318-
assert args.engine_snapshot_resource_policy == "discard_kv"
318+
assert args.engine_snapshot_resource_policy == "minimized"
319319

320-
args = serve_parser.parse_args(
321-
args=["--engine-snapshot-resource-policy", "l2_prepared"]
322-
)
323-
assert args.engine_snapshot_resource_policy == "l2_prepared"
324-
325-
args = serve_parser.parse_args(
326-
args=["--engine-snapshot-resource-policy", "l1_prepared"]
327-
)
328-
assert args.engine_snapshot_resource_policy == "l1_prepared"
320+
for unsupported in ("discard_kv", "host_backup", "reload_weights"):
321+
with pytest.raises(SystemExit):
322+
serve_parser.parse_args(
323+
args=["--engine-snapshot-resource-policy", unsupported]
324+
)
329325

330326
with pytest.raises(SystemExit):
331327
serve_parser.parse_args(

tests/snapshot/test_worker.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def _checkpoint_worker(worker_class, backend="uni"):
1515
return worker
1616

1717

18-
def test_l2_prepared_worker_lifecycle_order(monkeypatch):
18+
def test_reload_weights_worker_lifecycle_order(monkeypatch):
1919
import vllm.v1.worker.gpu_worker as gpu_worker
2020
from vllm.v1.worker.gpu_worker import Worker
2121

@@ -139,7 +139,7 @@ class UnsupportedExecutor(Executor):
139139
assert worker._checkpoint_prepare_state is None
140140

141141

142-
def test_l2_prepared_worker_rolls_back_failed_discard(monkeypatch):
142+
def test_reload_weights_worker_rolls_back_failed_discard(monkeypatch):
143143
import vllm.v1.worker.gpu_worker as gpu_worker
144144
from vllm.v1.worker.gpu_worker import Worker
145145

@@ -194,7 +194,7 @@ def wake_up(self, tags):
194194
assert worker._checkpoint_prepare_state is not None
195195

196196

197-
def test_l2_prepared_worker_checks_discard_capability_before_side_effects(
197+
def test_reload_weights_worker_checks_discard_capability_before_side_effects(
198198
monkeypatch,
199199
):
200200
import vllm.v1.worker.gpu_worker as gpu_worker
@@ -226,7 +226,7 @@ def unsupported_allocator():
226226
assert worker._checkpoint_prepare_state is None
227227

228228

229-
def test_l2_prepared_worker_rejects_active_lora():
229+
def test_reload_weights_worker_rejects_active_lora():
230230
from vllm.v1.worker.gpu_worker import Worker
231231

232232
worker = object.__new__(Worker)
@@ -238,7 +238,7 @@ def test_l2_prepared_worker_rejects_active_lora():
238238
Worker._validate_checkpoint_weight_reload(worker)
239239

240240

241-
def test_l2_prepared_worker_rejects_online_weight_updates():
241+
def test_reload_weights_worker_rejects_online_weight_updates():
242242
from vllm.v1.worker.gpu_worker import Worker
243243

244244
worker = object.__new__(Worker)
@@ -250,7 +250,7 @@ def test_l2_prepared_worker_rejects_online_weight_updates():
250250
Worker._validate_checkpoint_weight_reload(worker)
251251

252252

253-
def test_l1_prepared_worker_lifecycle_order(monkeypatch):
253+
def test_host_backup_worker_lifecycle_order(monkeypatch):
254254
import vllm.v1.worker.gpu_worker as gpu_worker
255255
from vllm.v1.worker.gpu_worker import Worker
256256

@@ -308,7 +308,7 @@ def allocation_diagnostics(self):
308308
assert worker._checkpoint_prepare_state is None
309309

310310

311-
def test_l1_prepared_worker_rolls_back_failed_backup(monkeypatch):
311+
def test_host_backup_worker_rolls_back_failed_backup(monkeypatch):
312312
import vllm.v1.worker.gpu_worker as gpu_worker
313313
from vllm.v1.worker.gpu_worker import Worker
314314

vllm/entrypoints/openai/cli_args.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,8 @@ class BaseFrontendArgs:
190190
"""Enable launcher-managed EngineCore snapshots for Sleep Mode level 3."""
191191
engine_snapshot_provider: Literal["fake", "criu_cuda"] = "criu_cuda"
192192
"""Engine snapshot provider. The fake provider is for lifecycle testing."""
193-
engine_snapshot_resource_policy: Literal[
194-
"full", "discard_kv", "l1_prepared", "l2_prepared"
195-
] = "full"
196-
"""Internal Engine snapshot resource policy."""
193+
engine_snapshot_resource_policy: Literal["full", "minimized"] = "full"
194+
"""Engine snapshot state captured in the process image."""
197195
engine_snapshot_persistence: Literal["durable", "page_cache"] = "durable"
198196
"""Durability mode for Engine snapshot artifacts."""
199197
engine_snapshot_integrity: Literal["optimistic", "strict"] = "optimistic"

vllm/snapshot/resources.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,19 @@ def to_wire(self) -> SnapshotResourcePolicyWire:
4040
"full": SnapshotResourcePolicy(
4141
weights="cuda_image", kv="cuda_image", runtime="cuda_image"
4242
),
43-
"discard_kv": SnapshotResourcePolicy(
43+
"minimized": SnapshotResourcePolicy(
44+
weights="discard", kv="discard", runtime="cuda_image"
45+
),
46+
}
47+
48+
_SUPPORTED_RESOURCE_POLICIES = {
49+
*_RESOURCE_POLICIES.values(),
50+
SnapshotResourcePolicy(
4451
weights="cuda_image", kv="discard", runtime="cuda_image"
4552
),
46-
"l1_prepared": SnapshotResourcePolicy(
53+
SnapshotResourcePolicy(
4754
weights="host_backup", kv="discard", runtime="cuda_image"
4855
),
49-
"l2_prepared": SnapshotResourcePolicy(
50-
weights="discard", kv="discard", runtime="cuda_image"
51-
),
5256
}
5357

5458

@@ -73,6 +77,6 @@ def decode_snapshot_resource_policy(
7377
kv=cast(KVResourcePolicy, value["kv"]),
7478
runtime=cast(RuntimeResourcePolicy, value["runtime"]),
7579
)
76-
if policy not in _RESOURCE_POLICIES.values():
80+
if policy not in _SUPPORTED_RESOURCE_POLICIES:
7781
raise ValueError("unsupported snapshot resource policy")
7882
return policy

vllm/v1/worker/gpu_worker.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,20 +298,20 @@ def _validate_checkpoint_weight_reload(self) -> None:
298298

299299
if self.get_draft_model() is not None:
300300
raise NotImplementedError(
301-
"l2_prepared does not support speculative draft models"
301+
"reload_weights does not support speculative draft models"
302302
)
303303
if self.vllm_config.lora_config is not None and self.list_loras():
304304
raise NotImplementedError(
305-
"l2_prepared does not support active LoRA adapters"
305+
"reload_weights does not support active LoRA adapters"
306306
)
307307
if self.weight_transfer_engine is not None:
308308
raise NotImplementedError(
309-
"l2_prepared does not support online weight updates"
309+
"reload_weights does not support online weight updates"
310310
)
311311
model_loader = get_model_loader(self.model_runner.load_config)
312312
if not hasattr(model_loader, "get_all_weights"):
313313
raise NotImplementedError(
314-
"l2_prepared requires a model loader with get_all_weights"
314+
"reload_weights requires a model loader with get_all_weights"
315315
)
316316

317317
@staticmethod

0 commit comments

Comments
 (0)