vLLM (2) - 架构总览

诗林  金牌会员 | 2024-11-14 22:05:52 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 516|帖子 516|积分 1548

系列文章目次

vLLM (1) - Qwen2推理&摆设
vLLM (2) - 架构总览
vLLM (3) - Sequence & SequenceGroup
vLLM (4) - LLMEngine上篇
vLLM (5) - LLMEngine下篇
vLLM (6) - Scheduler & BlockSpaceManager


  

媒介

上一篇通过Qwen2的vllm推理和摆设,对vllm有了简单直观的相识,但是我们尚未涉及到它的工作原理。接下来我们将以vllm源码为底子,渐渐解析。本篇重要是对vllm架构的总览。

一、官方资料

repo:https://github.com/vllm-project/vllm
文档:https://docs.vllm.ai/en/latest/
论文:https://arxiv.org/abs/2309.06180
二、原理简述

原理部分已经有不少文章已经讲解了,比如这篇文章。此末节的目标是:解释一些重要概念,简述PagedAttention大概vLLM原理,为后续架构和代码的分析做准备,毕竟本系列的偏重点是源码解析。


  • KV Cache:这是一种提升推理效率的技能;简单来说就是,每次foward推理天生下一个token时,都要用到之前token对应的key和value,因而可以把它们都缓存起来,这样就能节省推理时间;
  • Prefill & Decode:LLM推理分为Prefill和Decode两个阶段;Prefill(预添补)是将prompt的所有token一起喂给模型,这部分由于不需要采样,认为是可以并行的;Decode(解码)是不停采样天生新的token,由于是逐个天生,因此该阶段效率较低;
  • KV cache性能问题:1)此前很多推理系统是为每一个request申请一块连续内存,此时只能选择所有requests中大概输出的最大长度来预分配KV cache,这显然造成了资源浪费,因为短句用不了这么多KV cache;2)现实情况下大概requests比较多,某一时刻某个request解码尚未完成,但始终完全占据为它预分配的连续内存,此中未使用的部分不能为新的request所用,占着茅坑不拉屎;3)存在内存碎片,非连续内存也没办法被利用起来;
  • PagedAttention办理性能问题:使用类似虚拟内存分页管理的思想,简单来说就是,将申请的内存按照指定的巨细block_size划分成很多个block,这些block可以动态的分配给有需要的request,极大减少了资源浪费;
  • Physical blocks & Logical blocks:Physical blocks相当于物理内存,Logical blocks相当于虚拟内存,两者之间有映射关系,KV cache在Physical blocks不连续,但是在Logical blocks上是连续的。
    上图是vLLM同时处理惩罚两个请求时的KV cache处理惩罚,对于一个请求来说,我只管问Logical blocks要内存块,Physical blocks上怎么存储我不管,Physical blocks和Logical blocks之间的映射关系会处理惩罚这个问题。
三、架构图


上图来源于vLLM First SF Meetup Slides(官方repo中),它较为直观的展示了vllm的整体架构,让我来简单介绍一下:


  • 直接处理惩罚用户请求的类是LLMEngine,它需要完成两部分内容,分别是(多个)请求的调度,以及模型的执行;
  • Scheduler是LLMEngine的重要构成部分,它就是根据设定的调度策略,完成对用户请求的调度,以便调高吞吐,更快的响应;
  • Scheduler调度重要用到了虚拟内存分页管理的思想,将显存/内存划分成了很多个block,那么这些block的管理就由BlockSpaceManager完成;
  • 另一边,Worker在模型执行和KV cache缓存上发挥偏重要作用,此中ModelRunner重要负责模型加载和执行等,而CacheEngine就负责KV cache的初始化和更新。
四、项目结构

为了让大家更加清晰的明白vllm的架构,我还列出了其项目结构(项目结构能直观反映它的架构),并给出了必要的注释,如下面所示。由于文件比较多,这边只展开到一级子目次。
这此中好些部分是我们暂不涉及的,我在注释中标注了(暂不涉及)字样,这能减轻我们很大的压力。重点关注对象包罗core/、engine/、executor/和worker/。
  1. vllm/
  2. ├── attention/                 # 注意力
  3. │   ├── backends/              # 注意力各种后端实现,比如flash attention
  4. │   ├── ops/
  5. │   ├── layer.py
  6. │   ├── selector.py   
  7. │   └── __init__.py
  8. ├── core/                      # 核心,vllm最关键的部分
  9. │   ├── block/                 # 块,为指定的序列管理物理块
  10. │   ├── block_manager_v1.py    # 块管理器v1,管理逻辑块和物理块之间的映射关系等
  11. │   ├── block_manager_v2.py    # 块管理器v2
  12. │   ├── embedding_model_block_manager.py     # 针对embedding模型的块管理器
  13. │   ├── evictor_v1.py          # 驱逐器v1,驱逐长时间未使用的物理块缓存,腾出空间
  14. │   ├── evictor_v2.py          # 驱逐器v2
  15. │   ├── interfaces.py
  16. │   ├── policy.py              # 调度策略,比如fcfs(first come first serve)
  17. │   ├── scheduler.py           # 调度器,当多个请求到来时,需要调度以高效的方式完成推理,给到用户响应
  18. │   └── __init__.py
  19. ├── distributed/               # 分布式设备相关内容(暂不涉及)
  20. │   ├── device_communicators/
  21. │   ├── communication_op.py
  22. │   ├── parallel_state.py
  23. │   ├── utils.py
  24. │   └── __init__.py
  25. ├── engine/                    # 推理引擎
  26. │   ├── output_processor/      # 输出处理器,后处理
  27. │   ├── arg_utils.py           # 管理输入参数
  28. │   ├── async_llm_engine.py    # 异步llm_engine,用于部署,不支持batch推理
  29. │   ├── llm_engine.py          # llm_engine,线下推理,可以batch
  30. │   ├── metrics.py             # 指标,记录kv_cache的使用,延迟等
  31. │   └── __init__.py
  32. ├── entrypoints/               # 部署server相关(暂不涉及)
  33. │   ├── openai/
  34. │   ├── api_server.py
  35. │   ├── llm.py
  36. │   └── __init__.py
  37. ├── executor/                         # 执行器
  38. │   ├── cpu_executor.py               
  39. │   ├── distributed_gpu_executor.py
  40. │   ├── executor_base.py              # 执行器基类
  41. │   ├── gpu_executor.py               # gpu执行器,比如我们使用的Nvidia单卡gpu
  42. │   ├── multiproc_gpu_executor.py
  43. │   ├── multiproc_worker_utils.py
  44. │   ├── neuron_executor.py
  45. │   ├── ray_gpu_executor.py
  46. │   ├── ray_utils.py
  47. │   ├── tpu_executor.py
  48. │   └── __init__.py
  49. ├── logging/                          # 日志
  50. │   ├── formatter.py
  51. │   └── __init__.py
  52. ├── lora/                             # lora相关(暂不涉及)
  53. │   ├── fully_sharded_layers.py
  54. │   ├── layers.py
  55. │   ├── lora.py
  56. │   ├── models.py
  57. │   ├── punica.py
  58. │   ├── request.py
  59. │   ├── utils.py
  60. │   ├── worker_manager.py
  61. │   └── __init__.py
  62. ├── model_executor/                   # 模型执行器,主要是管理模型相关部分的         
  63. │   ├── guided_decoding.py
  64. │   ├── layers.py
  65. │   ├── models.py
  66. │   ├── custom_op.py
  67. │   ├── pooling_metadata.py
  68. │   ├── sampling_metadata.py          # 采样元数据
  69. │   ├── utils.py
  70. │   └── __init__.py
  71. ├── multimodal/                       # 多模态部分(暂不涉及)
  72. │   ├── base.py
  73. │   ├── image.py
  74. │   ├── registry.py
  75. │   ├── utils.py
  76. │   └── __init__.py
  77. ├── sepc_decode/                      # 投机采样(暂不涉及)
  78. │   ├── batch_expansion.py
  79. │   ├── interfaces.py
  80. │   ├── metrics.py
  81. │   ├── multi_step_worker.py
  82. │   ├── ngram_worker.py
  83. │   ├── proposer_worker_base.py
  84. │   ├── spec_decode_worker.py
  85. │   ├── top1_proposer.py
  86. │   ├── utils.py
  87. │   └── __init__.py
  88. ├── transformers_utils/               # transformers相关的工具
  89. │   ├── configs/
  90. │   ├── tokenizers/
  91. │   ├── tokenizer_group/
  92. │   ├── config.py
  93. │   ├── detokenizer.py
  94. │   ├── image_processor.py
  95. │   ├── tokenizer.py
  96. │   └── __init__.py
  97. ├── usage/
  98. │   ├── usage_lib.py
  99. │   └── __init__.py
  100. ├── worker/                           # worker,是executor的重要组成部分
  101. │   ├── cache_engine.py
  102. │   ├── cpu_model_runner.py
  103. │   ├── cpu_worker.py
  104. │   ├── embedding_model_runner.py
  105. │   ├── model_runner.py               # 负责加载和执行模型,准备输入张量等
  106. │   ├── neuron_model_runner.py
  107. │   ├── neuron_worker.py
  108. │   ├── tpu_model_runner.py
  109. │   ├── tpu_worker.py
  110. │   ├── worker.py                     # worker,使用的是gpu
  111. │   ├── worker_base.py                # worker基类
  112. │   └── __init__.py
  113. ├── block.py             # 块(逻辑块,物理块)定义
  114. ├── config.py            # 配置,输入参数按照功能区分构成多个配置
  115. ├── envs.py              # 环境变量相关
  116. ├── inputs.py            # 输入类定义
  117. ├── logger.py            # 日志
  118. ├── outputs.py           # 输出类定义
  119. ├── pooling_params.py     
  120. ├── py.typed
  121. ├── sampling_params.py   # 采样参数类定义
  122. ├── sequence.py          # 序列Sequence和序列组SequenceGroup等的定义
  123. ├── utils.py
  124. ├── version.py           # vllm版本
  125. ├── _C.abi3.so
  126. ├── _custom_ops.py
  127. ├── _moe_C.abi3.so
  128. ├── _punica_C.abi.so
  129. └── __init__.py
复制代码

总结

本篇通过原理简述、架构图和项目结构展示这几个部分对vllm原理和架构做相识析,相信大家对vllm有了更深入的认识,也为后续源码分析清晰了一些停滞。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表