Files
vllm-omni/docs/features/sleep_mode.md
T

244 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Sleep Mode & ACK Protocol
vLLM-Omni’s **Sleep Mode** allows you to temporarily release most GPU memory used by a model—such as model weights and key-value (KV) caches—**without stopping the server or unloading the Docker container**.
This feature is inherited from [vLLM’s Sleep Mode](https://blog.vllm.ai/2025/10/26/sleep-mode.html) and extended with the **Omni ACK Protocol** to support multi-stage pipelines and heterogeneous hardware backends (NVIDIA, AMD, Intel, Huawei). It is especially useful in **RLHF**, **dynamic model switching**, or **cost-saving scenarios**.
---
## 1. Feature Documentation
### Overview
Omni Sleep Mode provides a mechanism to "sleep" specific model stages. When a stage enters sleep, its physical VRAM is reclaimed by the system, while the process state is preserved for rapid "wake-up" without full re-initialization.
### Sleep Levels
We support two levels of hibernation to balance recovery speed and memory efficiency:
| Level | Name | Mechanism | Recovery Speed | Memory Freed |
| :--- | :--- | :--- | :--- | :--- |
| **Level 1** | **Weight Offloading** | Offloads weights to Host CPU RAM. | **Fast** (DMA) | Substantial |
| **Level 2** | **Full De-mapping** | Physically releases memory pages via VRAM scavenging. | **Moderate** | **Maximum** (up to 95%+) |
### Supported Platforms
Omni Sleep Mode is optimized for high-performance computing backends:
* **NVIDIA**: Supported via Virtual Memory Management (VMM).
* **AMD (ROCm)**: Fully supported with physical page de-mapping.
* **Intel XPU**: Supported via Level Zero memory management.
* **Huawei NPU**: Supported via Ascend memory scavenging.
### Hardware Requirements
* **Memory Considerations**: System RAM must be sufficient to hold offloaded weights during sleep.
* **TP Support**: Tensor Parallel groups synchronize sleep/wake transitions across all workers.
---
## 2. Usage Examples
### Python API Example
You can programmatically control the lifecycle of stages using the `AsyncOmni` engine.
```python
import asyncio
from vllm_omni.entrypoints.async_omni import AsyncOmni
async def run_sleep_demo():
# 1. initialization
engine = AsyncOmni(
model="ByteDance-Seed/BAGEL-7B-MoT",
enable_sleep_mode=True
)
# 2. sleep mode level2
acks = await engine.sleep(stage_ids=[0], level=2)
print(f"Freed {acks[0].freed_bytes / 1024**3:.2f} GiB on Stage 0")
# 3. wake up
await engine.wake_up(stage_ids=[0])
if __name__ == "__main__":
asyncio.run(run_sleep_demo())
```
### server command Example
Start the server with sleep mode enabled:
The first method
```
vllm serve ByteDance-Seed/BAGEL-7B-MoT \
--omni \
--enable-sleep-mode \
--trust-remote-code \
--gpu-memory-utilization 0.7
```
The second method
```
python3 -m vllm_omni.entrypoints.openai.api_server \
--model ByteDance-Seed/BAGEL-7B-MoT \
--omni \
--enable-sleep-mode \
--trust-remote-code \
--gpu-memory-utilization 0.7
```
### Test Scenarios & Commands
#### Scenario 1: LLM Engine Sleep
Objective: Verify VRAM reclamation for Stage 0 (Thinker).
Trigger sleep (Level 1 or Level 2) via client:
```
curl -X POST http://localhost:8000/v1/omni/sleep \
-H "Content-Type: application/json" \
-d '{"stage_ids": [0], "level": 2}'
```
Tip: Open a new terminal and run rocm-smi or nvidia-smi or to observe the immediate drop in VRAM usage.
#### Scenario 2: Diffusion Sleep
Objective: Verify VRAM reclamation for Stage 1 (Diffusion).
Trigger sleep (Level 1 or Level 2) via client:
```
curl -X POST http://localhost:8000/v1/omni/sleep \
-H "Content-Type: application/json" \
-d '{"stage_ids": [1], "level": 2}'
```
#### Scenario 3: Multi-Stage Coordinated Stress Test
Objective: Test concurrent sleep and rapid wake-up across multiple stages.
Concurrent Sleep (Stage 0 & 1):
```
curl -X POST http://localhost:8000/v1/omni/sleep \
-H "Content-Type: application/json" \
-d '{"stage_ids": [0, 1], "level": 2}'
```
Rapid Wake-up:
```
curl -X POST http://localhost:8000/v1/omni/wakeup \
-H "Content-Type: application/json" \
-d '{"stage_ids": [0, 1]}'
```
#### Scenario 4: Full Lifecycle Memory Audit & Functional Integrity
Objective: Audit the complete flow from Sleep to Wake-up followed by an Inference validation.
Check Initial State: Observe baseline VRAM usage.
Trigger Deep Sleep (Level 2):
```
curl -X POST http://localhost:8000/v1/omni/sleep \
-H "Content-Type: application/json" \
-d '{"stage_ids": [0], "level": 2}'
```
Wake-up Model:
```
curl -X POST http://localhost:8000/v1/omni/wakeup \
-H "Content-Type: application/json" \
-d '{"stage_ids": [0]}'
```
Verify Functional Integrity (Inference):
Ensure the model still generates valid output after reloading weights.
```
curl -X POST http://localhost:8000/v1/images/generations \
-H "Content-Type: application/json" \
-d '{
"prompt": "A huge swimming pool, with many people swimming.",
"model": "ByteDance-Seed/BAGEL-7B-MoT",
"response_format": "b64_json",
"extra_body": {"sampling_params": {"num_inference_steps": 4, "seed": 42}}
}' > post.json
```
## 3. API Reference
### Methods
| Method | Arguments | Return Type | Description |
| :--- | :--- | :--- | :--- |
| **sleep** | `stage_ids: List[int], level: int` | `List[OmniACK]` | Triggers hibernation for specified stages. |
| **wake_up** | `stage_ids: List[int]` | `List[OmniACK]` | Reloads weights and re-maps memory. |
### OmniACK Dataclass Fields
| Field | Type | Description |
| :--- | :--- | :--- |
| **task_id** | `str` | Unique identifier for the operation. |
| **status** | `str` | `SUCCESS` or `ERROR`. |
| **stage_id** | `int` | The ID of the stage that responded. |
| **rank** | `int` | The rank ID within the Tensor Parallel group. |
| **freed_bytes** | `int` | Actual amount of physical VRAM reclaimed. |
| **metadata** | `dict` | Additional platform-specific metrics. |
Metadata Field Analysis
The metadata field is a dynamic dictionary containing hardware-specific telemetry and audit data, primarily used for verifying memory reclamation on various backends (e.g., AMD ROCm, NVIDIA CUDA).
```
"metadata": {
"source": "Platform_AMD_Instinct_MI300X",
"total_freed_gib": "78.57",
"rank_residual_gib": "2.07"
}
```
#### Core Utility:
**VRAM Reclamation Audit (total_freed_gib)**: Converts raw freed_bytes into human-readable GiB. It serves as the primary metric to verify that Level 2 sleep has successfully purged model weights from VRAM.
**Residual & Fragmentation Monitoring (rank_residual_gib)**: Reports the remaining VRAM footprint after memory de-mapping. A low residual value (e.g., 2.07 GiB) confirms a successful "clean" state, ensuring the device is ready for high-memory co-located tasks like training or diffusion pipelines.
**Backend Traceability (source)**: Identifies the underlying hardware driver or audit source. This is critical for debugging synchronization issues in multi-stage, distributed environments.
**Performance Analytics (Roadmap)**: Future updates will include latency_ms (context-switch overhead) and cuda_graph_recalled (graph engine status) to optimize performance in high-frequency sleep/wake scenarios.