396 lines
11 KiB
Markdown
396 lines
11 KiB
Markdown
# API Design Template for vLLM-omni Modules
|
|||
|
|
|
||
|
|
This template provides a standardized structure for designing APIs for core, engine, executor, and worker modules in vLLM-omni. Use this template to ensure consistency and completeness across all modules.
|
||
|
|
|
||
|
|
## Template Structure
|
||
|
|
|
||
|
|
### 1. Module Overview
|
||
|
|
- **Purpose**: What this module does
|
||
|
|
- **Responsibilities**: Key responsibilities of the module
|
||
|
|
- **Dependencies**: What other modules this depends on
|
||
|
|
- **Integration Points**: How it integrates with other modules
|
||
|
|
|
||
|
|
### 2. Core Classes/Interfaces
|
||
|
|
- **Base Classes**: Abstract base classes and interfaces
|
||
|
|
- **Implementation Classes**: Concrete implementations
|
||
|
|
- **Data Structures**: Key data structures and models
|
||
|
|
|
||
|
|
### 3. Public API Methods
|
||
|
|
- **Initialization**: Constructor and setup methods
|
||
|
|
- **Core Operations**: Main functionality methods
|
||
|
|
- **Configuration**: Configuration and parameter methods
|
||
|
|
- **Lifecycle Management**: Start, stop, cleanup methods
|
||
|
|
- **Monitoring**: Status, metrics, and debugging methods
|
||
|
|
|
||
|
|
### 4. Configuration
|
||
|
|
- **Configuration Classes**: Dataclasses or config objects
|
||
|
|
- **Required Parameters**: Must-have configuration
|
||
|
|
- **Optional Parameters**: Optional configuration with defaults
|
||
|
|
- **Validation**: Parameter validation rules
|
||
|
|
|
||
|
|
### 5. Error Handling
|
||
|
|
- **Custom Exceptions**: Module-specific exceptions
|
||
|
|
- **Error Codes**: Standardized error codes
|
||
|
|
- **Recovery Strategies**: How to handle and recover from errors
|
||
|
|
|
||
|
|
### 6. Examples
|
||
|
|
- **Basic Usage**: Simple usage examples
|
||
|
|
- **Advanced Usage**: Complex scenarios
|
||
|
|
- **Integration Examples**: How to use with other modules
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Example: Core Module Template
|
||
|
|
|
||
|
|
### 1. Module Overview
|
||
|
|
|
||
|
|
**Purpose**: The core module provides fundamental scheduling and caching functionality for vLLM-omni.
|
||
|
|
|
||
|
|
**Responsibilities**:
|
||
|
|
- Request scheduling and prioritization
|
||
|
|
- DiT cache management
|
||
|
|
- Resource allocation and coordination
|
||
|
|
- Inter-module communication
|
||
|
|
|
||
|
|
**Dependencies**:
|
||
|
|
- `vllm_omni.request` - Request handling
|
||
|
|
- `vllm_omni.config` - Configuration management
|
||
|
|
- `vllm_omni.utils` - Utility functions
|
||
|
|
|
||
|
|
**Integration Points**:
|
||
|
|
- Receives requests from entrypoints
|
||
|
|
- Coordinates with engine modules
|
||
|
|
- Manages worker allocation
|
||
|
|
- Provides status to monitoring systems
|
||
|
|
|
||
|
|
### 2. Core Classes/Interfaces
|
||
|
|
|
||
|
|
```python
|
||
|
|
from abc import ABC, abstractmethod
|
||
|
|
from typing import List, Optional, Dict, Any
|
||
|
|
from dataclasses import dataclass
|
||
|
|
from enum import Enum
|
||
|
|
|
||
|
|
class SchedulerType(Enum):
|
||
|
|
"""Types of schedulers available."""
|
||
|
|
FIFO = "fifo"
|
||
|
|
PRIORITY = "priority"
|
||
|
|
MULTIMODAL = "multimodal"
|
||
|
|
DIFFUSION = "diffusion"
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class SchedulerConfig:
|
||
|
|
"""Configuration for scheduler."""
|
||
|
|
scheduler_type: SchedulerType = SchedulerType.FIFO
|
||
|
|
max_queue_size: int = 1000
|
||
|
|
priority_weights: Dict[str, float] = None
|
||
|
|
timeout_seconds: int = 300
|
||
|
|
|
||
|
|
class BaseScheduler(ABC):
|
||
|
|
"""Abstract base class for all schedulers."""
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def schedule_request(self, request: OmniRequest) -> bool:
|
||
|
|
"""Schedule a request for processing."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def get_next_request(self) -> Optional[OmniRequest]:
|
||
|
|
"""Get the next request to process."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def remove_request(self, request_id: str) -> bool:
|
||
|
|
"""Remove a request from the queue."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
class DiTCacheManager:
|
||
|
|
"""Manages DiT cache for diffusion models."""
|
||
|
|
|
||
|
|
def __init__(self, config: DiTCacheConfig):
|
||
|
|
self.config = config
|
||
|
|
self.cache = {}
|
||
|
|
self.cache_stats = {}
|
||
|
|
|
||
|
|
async def get_cache(self, cache_key: str) -> Optional[Any]:
|
||
|
|
"""Retrieve cached data."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
async def set_cache(self, cache_key: str, data: Any) -> None:
|
||
|
|
"""Store data in cache."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
async def invalidate_cache(self, cache_key: str) -> None:
|
||
|
|
"""Invalidate cached data."""
|
||
|
|
pass
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Public API Methods
|
||
|
|
|
||
|
|
#### Initialization
|
||
|
|
```python
|
||
|
|
class CoreScheduler:
|
||
|
|
def __init__(self, config: SchedulerConfig):
|
||
|
|
"""Initialize the core scheduler."""
|
||
|
|
self.config = config
|
||
|
|
self.scheduler = self._create_scheduler()
|
||
|
|
self.cache_manager = DiTCacheManager(config.dit_cache_config)
|
||
|
|
self._running = False
|
||
|
|
|
||
|
|
def _create_scheduler(self) -> BaseScheduler:
|
||
|
|
"""Factory method to create appropriate scheduler."""
|
||
|
|
if self.config.scheduler_type == SchedulerType.FIFO:
|
||
|
|
return FIFOScheduler(self.config)
|
||
|
|
elif self.config.scheduler_type == SchedulerType.PRIORITY:
|
||
|
|
return PriorityScheduler(self.config)
|
||
|
|
# ... other scheduler types
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Core Operations
|
||
|
|
```python
|
||
|
|
async def schedule_request(self, request: OmniRequest) -> bool:
|
||
|
|
"""
|
||
|
|
Schedule a request for processing.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
request: The request to schedule
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
bool: True if successfully scheduled, False otherwise
|
||
|
|
|
||
|
|
Raises:
|
||
|
|
SchedulerError: If scheduling fails
|
||
|
|
QueueFullError: If queue is at capacity
|
||
|
|
"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
async def get_next_request(self) -> Optional[OmniRequest]:
|
||
|
|
"""
|
||
|
|
Get the next request to process.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
OmniRequest or None: Next request to process
|
||
|
|
|
||
|
|
Raises:
|
||
|
|
SchedulerError: If retrieval fails
|
||
|
|
"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
async def process_request(self, request: OmniRequest) -> Any:
|
||
|
|
"""
|
||
|
|
Process a request through the appropriate pipeline.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
request: The request to process
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
Any: Processing result
|
||
|
|
|
||
|
|
Raises:
|
||
|
|
ProcessingError: If processing fails
|
||
|
|
"""
|
||
|
|
pass
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Configuration
|
||
|
|
```python
|
||
|
|
def update_config(self, new_config: SchedulerConfig) -> None:
|
||
|
|
"""Update scheduler configuration."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
def get_config(self) -> SchedulerConfig:
|
||
|
|
"""Get current configuration."""
|
||
|
|
pass
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Lifecycle Management
|
||
|
|
```python
|
||
|
|
async def start(self) -> None:
|
||
|
|
"""Start the scheduler."""
|
||
|
|
self._running = True
|
||
|
|
# Start background tasks
|
||
|
|
|
||
|
|
async def stop(self) -> None:
|
||
|
|
"""Stop the scheduler gracefully."""
|
||
|
|
self._running = False
|
||
|
|
# Cleanup resources
|
||
|
|
|
||
|
|
async def shutdown(self) -> None:
|
||
|
|
"""Force shutdown the scheduler."""
|
||
|
|
# Immediate cleanup
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Monitoring
|
||
|
|
```python
|
||
|
|
def get_status(self) -> Dict[str, Any]:
|
||
|
|
"""Get current scheduler status."""
|
||
|
|
return {
|
||
|
|
"running": self._running,
|
||
|
|
"queue_size": self.scheduler.queue_size(),
|
||
|
|
"processed_requests": self.scheduler.processed_count(),
|
||
|
|
"cache_hit_rate": self.cache_manager.get_hit_rate()
|
||
|
|
}
|
||
|
|
|
||
|
|
def get_metrics(self) -> Dict[str, float]:
|
||
|
|
"""Get performance metrics."""
|
||
|
|
pass
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Configuration
|
||
|
|
|
||
|
|
```python
|
||
|
|
@dataclass
|
||
|
|
class CoreModuleConfig:
|
||
|
|
"""Configuration for the core module."""
|
||
|
|
|
||
|
|
# Scheduler configuration
|
||
|
|
scheduler: SchedulerConfig = field(default_factory=SchedulerConfig)
|
||
|
|
|
||
|
|
# Cache configuration
|
||
|
|
dit_cache: DiTCacheConfig = field(default_factory=DiTCacheConfig)
|
||
|
|
|
||
|
|
# Resource limits
|
||
|
|
max_memory_gb: float = 16.0
|
||
|
|
max_gpu_utilization: float = 0.8
|
||
|
|
|
||
|
|
# Timeouts
|
||
|
|
request_timeout: int = 300
|
||
|
|
worker_timeout: int = 60
|
||
|
|
|
||
|
|
def validate(self) -> None:
|
||
|
|
"""Validate configuration parameters."""
|
||
|
|
if self.max_memory_gb <= 0:
|
||
|
|
raise ValueError("max_memory_gb must be positive")
|
||
|
|
if not 0 < self.max_gpu_utilization <= 1:
|
||
|
|
raise ValueError("max_gpu_utilization must be between 0 and 1")
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. Error Handling
|
||
|
|
|
||
|
|
```python
|
||
|
|
class CoreModuleError(Exception):
|
||
|
|
"""Base exception for core module errors."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
class SchedulerError(CoreModuleError):
|
||
|
|
"""Scheduler-related errors."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
class QueueFullError(SchedulerError):
|
||
|
|
"""Queue is at capacity."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
class CacheError(CoreModuleError):
|
||
|
|
"""Cache-related errors."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
class ResourceError(CoreModuleError):
|
||
|
|
"""Resource allocation errors."""
|
||
|
|
pass
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6. Examples
|
||
|
|
|
||
|
|
#### Basic Usage
|
||
|
|
```python
|
||
|
|
from vllm_omni.core import CoreScheduler, CoreModuleConfig
|
||
|
|
from vllm_omni.request import create_text_request
|
||
|
|
|
||
|
|
# Create configuration
|
||
|
|
config = CoreModuleConfig(
|
||
|
|
scheduler=SchedulerConfig(scheduler_type=SchedulerType.FIFO),
|
||
|
|
max_memory_gb=8.0
|
||
|
|
)
|
||
|
|
|
||
|
|
# Initialize scheduler
|
||
|
|
scheduler = CoreScheduler(config)
|
||
|
|
await scheduler.start()
|
||
|
|
|
||
|
|
# Create and schedule a request
|
||
|
|
request = create_text_request(
|
||
|
|
request_id="req_001",
|
||
|
|
prompt="Hello, world!",
|
||
|
|
sampling_params=sampling_params
|
||
|
|
)
|
||
|
|
|
||
|
|
success = await scheduler.schedule_request(request)
|
||
|
|
if success:
|
||
|
|
result = await scheduler.process_request(request)
|
||
|
|
print(f"Result: {result}")
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Advanced Usage
|
||
|
|
```python
|
||
|
|
# Custom scheduler with priority handling
|
||
|
|
config = CoreModuleConfig(
|
||
|
|
scheduler=SchedulerConfig(
|
||
|
|
scheduler_type=SchedulerType.PRIORITY,
|
||
|
|
priority_weights={"high": 2.0, "normal": 1.0, "low": 0.5}
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
scheduler = CoreScheduler(config)
|
||
|
|
await scheduler.start()
|
||
|
|
|
||
|
|
# Monitor scheduler status
|
||
|
|
status = scheduler.get_status()
|
||
|
|
print(f"Queue size: {status['queue_size']}")
|
||
|
|
print(f"Cache hit rate: {status['cache_hit_rate']:.2%}")
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Module-Specific Guidelines
|
||
|
|
|
||
|
|
### Core Module
|
||
|
|
- Focus on scheduling, caching, and resource management
|
||
|
|
- Provide clear interfaces for other modules
|
||
|
|
- Handle concurrency and thread safety
|
||
|
|
- Implement comprehensive monitoring
|
||
|
|
|
||
|
|
### Engine Module
|
||
|
|
- Handle model loading and inference
|
||
|
|
- Support both AR and diffusion models
|
||
|
|
- Provide unified interface for different model types
|
||
|
|
- Implement efficient memory management
|
||
|
|
|
||
|
|
### Executor Module
|
||
|
|
- Coordinate between different engines
|
||
|
|
- Handle request routing and load balancing
|
||
|
|
- Manage execution pipelines
|
||
|
|
- Provide error recovery mechanisms
|
||
|
|
|
||
|
|
### Worker Module
|
||
|
|
- Handle actual model execution
|
||
|
|
- Manage GPU resources
|
||
|
|
- Implement batching strategies
|
||
|
|
- Provide performance optimization
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Checklist for API Design
|
||
|
|
|
||
|
|
- [ ] **Clear Purpose**: Module purpose is well-defined
|
||
|
|
- [ ] **Complete Interface**: All public methods are documented
|
||
|
|
- [ ] **Error Handling**: Comprehensive error handling strategy
|
||
|
|
- [ ] **Configuration**: Flexible configuration system
|
||
|
|
- [ ] **Examples**: Basic and advanced usage examples
|
||
|
|
- [ ] **Type Hints**: All methods have proper type hints
|
||
|
|
- [ ] **Documentation**: Comprehensive docstrings
|
||
|
|
- [ ] **Testing**: Unit tests for all public methods
|
||
|
|
- [ ] **Integration**: Clear integration points with other modules
|
||
|
|
- [ ] **Performance**: Performance considerations documented
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Submission Guidelines
|
||
|
|
|
||
|
|
1. Create a new file: `docs/api/[module_name]_api.md`
|
||
|
|
2. Follow the template structure exactly
|
||
|
|
3. Include all required sections
|
||
|
|
4. Provide working code examples
|
||
|
|
5. Ensure all methods have proper docstrings
|
||
|
|
6. Include error handling strategies
|
||
|
|
7. Submit for review before implementation
|
||
|
|
|
||
|
|
This template ensures consistency and completeness across all vLLM-omni modules.
|