Skip to content

执行器与Worker — 概念

Executor 抽象层

Executor 定义了模型执行的抽象接口,支持三种部署模式:

UniProcExecutor

单进程执行器,所有操作在同一进程中完成:

  • 适合开发和调试
  • 没有 IPC 开销
  • 不受 GIL 影响的 CUDA 操作仍然可以并行

MultiProcExecutor

多进程执行器,每个 GPU 对应一个 Worker 进程:

  • 通过 multiprocessing.Process 创建 Worker
  • 使用 pipe 进行进程间通信
  • 支持 张量并行

RayExecutor

基于 Ray 的分布式执行器:

Worker 生命周期

关键步骤

  1. init_device():设置 CUDA 设备,初始化 NCCL 通信组
  2. load_model():从 HuggingFace checkpoint 加载权重到 GPU
  3. profile_run():运行一次虚拟前向传播,测量实际显存使用量
  4. allocate_kv_cache():根据剩余显存分配 KV 缓存块
  5. warmup():捕获 CUDA Graph,预热 CUDA kernel

CuMemAllocator

CuMemAllocator 现在作为独立功能(enable_cumem_allocator),不再与 enable_sleep_mode 耦合。它管理 CUDA 内存池,允许在 sleep/pause 模式下释放和重新分配显存。

ModelRunner

ModelRunner 是 Worker 的核心组件(vllm/v1/worker/gpu_model_runner.py,约 7400 行 / 324KB),负责:

前向传播执行

CUDA Graph 管理

CUDA Graph 在 decode 阶段提供显著的性能提升:

  1. 预热阶段:用小批量输入执行一次前向传播
  2. 捕获图:记录所有 CUDA 操作为图
  3. 重放:用新输入重放图,避免 kernel launch 开销

输入批处理

ModelRunner 将调度器的输出转换为 GPU 可执行的输入:

python
# 简化示意
class InputBatch:
    token_ids: torch.Tensor      # [num_seqs, max_len]
    position_ids: torch.Tensor    # [num_seqs, max_len]
    block_tables: torch.Tensor    # [num_seqs, max_blocks]
    seq_lens: torch.Tensor        # [num_seqs]
    sampling_params: list[SamplingParams]

硬件平台支持

vLLM 通过 Platform 抽象支持多种硬件:

平台文件Worker
NVIDIA CUDAplatforms/cuda.pyGPUWorker
AMD ROCmplatforms/rocm.pyGPUWorker
x86/ARM CPUplatforms/cpu.pyCPUWorker
Intel XPU/Gaudiplatforms/xpu.pyXPUWorker
Google TPUplatforms/tpu.pyTPUWorker

相关概念