kizumi_header_banner_img

夜晚 未来 永远 恐惧 梦见 终结

加载中

文章导读

vLLM学习-000项目架构概览


avatar
Gouki 2025年10月11日 288

1. 项目架构概览

🌟 用一个通俗的类比来理解vLLM

想象一下高速公路上的智能调度系统:

  • • 收费站(Entrypoints):用户的请求从这里进入系统,就像车辆进入高速公路
  • • 交通指挥中心(Scheduler):智能地决定哪些车先走、怎么组队、走哪条车道,让整体通行效率最高
  • • 分页停车场(PagedAttention):这是vLLM的”独门绝技”!就像操作系统的虚拟内存,把KV Cache分成小块灵活管理,再也不用担心”停车位”不够用了
  • • 高速车道(Workers):实际的GPU计算单元,负责”跑模型”
  • • 调度引擎(LLM Engine):整个系统的大脑,协调一切

这不是一个简单的”请求-响应”系统,而是一个持续优化吞吐量的智能调度系统。它的设计哲学是:让GPU始终处于高负载状态,绝不浪费一个计算周期

🎯 核心设计特征

vLLM的架构有几个”与众不同”的闪光点:

  1. 1. PagedAttention – 内存管理的革命 📄这是vLLM最核心的创新!传统的LLM推理会预先分配固定大小的内存给KV Cache,就像你订酒店必须订整个房间,哪怕只住一晚。而PagedAttention就像Airbnb,按需分配”房间”(内存块),极大提高了内存利用率。技术要点:
    • • KV Cache被分成固定大小的块(类似操作系统的分页)
    • • 支持内存共享(Prefix Caching),相同的prompt前缀可以共享KV Cache
    • • 显著减少内存碎片,提升吞吐量
  2. 2. Continuous Batching – 永不停歇的批处理 ⚡不像传统的静态批处理(等一批请求都结束了再处理下一批),vLLM采用连续批处理:
    • • 一个请求完成了?立刻用新请求补上它的位置!
    • • GPU永远在满负荷工作,不会因为某个长请求而闲置
    • • 就像餐厅的”翻台率”优化,座位永远不空着
  3. 3. CUDA Graph优化 – 减少启动开销 🚄把重复的计算图”录制”下来,之后直接回放,减少Python和CUDA之间的交互开销。
  4. 4. 多样化的量化支持 🎨支持GPTQ、AWQ、INT4/8、FP8等多种量化方式,让你在精度和速度之间灵活权衡。
🏗️ 架构风格定位

vLLM采用的是分层的执行器-工作器架构,清晰地分离了调度逻辑和执行逻辑:

用户请求
    ↓
Entrypoints (LLM / AsyncLLMEngine / OpenAI-compatible API)
    ↓
LLMEngine (核心引擎:调度、内存管理、输出处理)
    ↓
Executor (执行器:管理分布式工作器)
    ↓
Workers (工作器:在GPU上实际运行模型)
    ↓
CUDA/HIP Kernels (高度优化的底层内核)

每一层都有明确的职责边界,这种设计让系统既灵活(容易扩展新特性)又高效(每层都针对性优化)。

🆚 与其他推理引擎的对比

vLLM相比其他推理引擎(如TensorRT-LLM、SGLang、LMDeploy)的主要优势:

  • • 开箱即用:无需复杂的模型转换,直接支持HuggingFace模型
  • • 内存效率:PagedAttention带来的内存利用率提升显著
  • • 社区活跃:已成为PyTorch生态的一部分,更新快,问题响应及时
  • • 灵活性高:支持多种硬件(NVIDIA、AMD、Intel、TPU)和多种部署模式

vLLM的”人设”:一个追求极致性能、同时保持易用性的”实用主义者”。

🌐 技术栈分析

让我们看看vLLM的”装备清单”:

核心依赖:

  • • PyTorch 2.6.0:深度学习框架基础,负责模型加载和张量操作
  • • Python 3.9-3.12:主要编程语言
  • • C++/CUDA/HIP:高性能内核实现(csrc目录下有大量CUDA代码)
  • • CMake:构建系统,负责编译C++/CUDA扩展

关键库:

  • • xformers:提供优化的Attention实现
  • • FlashAttention/FlashInfer:高性能Attention内核
  • • Ray:分布式计算框架,支持流水线并行
  • • Numba:用于N-gram推测解码

为什么选择这些技术?

  1. 1. PyTorch而非TensorFlow:因为HuggingFace生态都是基于PyTorch
  2. 2. 自研CUDA内核:通用框架难以达到极致性能,vLLM在关键路径上自己写内核
  3. 3. Ray做分布式:成熟、灵活,支持复杂的并行策略
  4. 4. CMake构建:跨平台,灵活配置不同硬件后端

🔗 外部系统集成

vLLM作为推理引擎,需要与多种外部系统交互:

上游集成:

  • • HuggingFace Hub:直接加载模型和分词器
  • • OpenAI API:提供兼容的API接口(vllm.entrypoints.openai)
  • • Prometheus:暴露监控指标

下游依赖:

  • • GPU驱动:CUDA(NVIDIA)、ROCm(AMD)、oneAPI(Intel)
  • • 存储系统:可选的tensorizer、fastsafetensors用于快速模型加载

配置管理:

  • • 通过环境变量(VLLM_*)和命令行参数配置
  • • 支持YAML配置文件(用于serving模式)

📊 架构流程描述

让我们跟踪一个用户请求的完整生命周期:

场景:用户通过LLM类做离线批量推理

from vllm import LLM, SamplingParams

llm = LLM(model=”facebook/opt-125m”)
outputs = llm.generate([“Hello world”], SamplingParams(max_tokens=20))

流程图:

关键步骤解析:

  1. 1. 请求接收 (LLM.generate)
    • • 用户调用generate()方法
    • • 内部调用LLMEngine.add_request()将请求加入待处理队列
    • • 每个请求被封装成SequenceGroup对象
  2. 2. 调度 (Scheduler.schedule)
    • • 决定本次迭代处理哪些请求(running, swapped, waiting)
    • • 使用PagedAttention算法为每个序列分配KV Cache块
    • • 生成SequenceGroupMetadata(包含位置信息、块映射表等)
    • • 返回SchedulerOutputs
  3. 3. 模型执行 (Worker.execute_model)
    • • 准备输入张量(input_ids, positions)
    • • 准备KV Cache映射关系
    • • 调用模型的forward()方法
    • • 使用高度优化的Attention内核计算
    • • 采样得到下一个token
  4. 4. 输出处理 (Engine.process_model_outputs)
    • • 更新每个序列的状态(添加新token)
    • • 检查是否满足停止条件(EOS、max_tokens等)
    • • 对于完成的序列,生成RequestOutput返回给用户
    • • 对于未完成的序列,继续下一轮迭代
  5. 5. 循环迭代
    • • 这个过程会持续循环,直到所有请求都完成
    • • 每次迭代可能处理不同的请求组合(Continuous Batching的体现)

核心文件实现索引:

  • • 用户入口:vllm/entrypoints/llm.py (LLM类)
  • • 引擎核心:vllm/engine/llm_engine.py (LLMEngine类)
  • • 调度器:vllm/core/scheduler.py (Scheduler类)
  • • 执行器:vllm/executor/gpu_executor.py (GPUExecutor类)
  • • 工作器:vllm/worker/worker.py (Worker类)
  • • 模型运行器:vllm/worker/model_runner.py (ModelRunner类)
  • • Attention实现:vllm/attention/backends/ (各种后端实现)
  • • CUDA内核:csrc/attention/ (高性能内核代码)

 



评论(0)

查看评论列表

暂无评论


发表评论

个人信息

avatar

面向kpi编程,python的狗。

15
文章
0
评论
1
用户

分类

最新评论

    广告 10-11