当前位置: 首页 > news >正文

vLLM v1源码阅读 : 整体流程梳理(详细debug)

vLLM v1整体流程梳理:offline inference

在阅读了知乎猛猿小姐姐的图解Vllm V1系列1后,为了更好的和实际代码结合,因此debug了vLLM的0.8.4版本的源码,从源码上结合来学习v1的设计会更加深入和具体。
前言:强烈建议先看一下知乎猛猿小姐姐的图解Vllm V1系列1解读,先知道原理再看代码比较好理解!

介绍

这篇blog主要针对vLLM v1的离线推理的模块设计进行源码级别的讲解,我们会从一个入口开始debug,从用户的prompt输入开始,一直到返回模型输出结束。这里会包含大量的源码截图,出于篇幅考虑,本篇blog不会详细介绍每一行代码,只会对模块进行大致的介绍,读者可以根据截图自己对源码进行详细调试。

overview

下图摘自猛猿小姐姐的图解Vllm V1系列1,本篇blog用这张图作为overview,会对vLLM源码debug图中讲解的所有模块,因此读者可以结合猛猿小姐姐的图解Vllm V1系列1一起学习。
在这里插入图片描述

debug入口:vllm/examples/offline_inference/basic/basic.py

在这里插入图片描述

  • step in并跳过装饰器后进入了LLM类的__init__函数中:

在这里插入图片描述

  • 打断点跳转到LLMEngine的创建入口:

在这里插入图片描述

  • 进入这个from_engine_args函数后,可以看到:

在这里插入图片描述

  • vLLM默认是启用VLLM_USE_V1环境变量的,因此默认会使用v1的LLMEngine实现
  • 我们接着step in(from_vllm_config函数):

在这里插入图片描述

  • 按照上图继续step in,就进入了v1 LLMEngine的构造函数中:

在这里插入图片描述

  • 接着往下看,会看到:

在这里插入图片描述

  • 继续往下看:

在这里插入图片描述

  • 看图:

在这里插入图片描述

  • make_client函数根据是否启用多进程和 asyncio,创建适合的 EngineCoreClient 子类实例:

在这里插入图片描述

  • 离线推理是同步+多进程,我们从这里继续step in:

在这里插入图片描述

  • 这里就到了overview中的SyncMPClient模块中,这里调用super().init(), 我们step in进去:

在这里插入图片描述

  • 继续debug

在这里插入图片描述

  • 进入到CoreEngine类中:

在这里插入图片描述

  • 这里就要创建进程了,target_fn=EngineCoreProc.run_engine_core,因此现在这个函数里面打个断点,防止追不到:

在这里插入图片描述

  • 我们在BackgroundProcHandle跳过之后可以观察到调用堆栈中创建了一个新的进程:

在这里插入图片描述

  • 点击之后就会停在刚刚我们打的断点处:

在这里插入图片描述

  • 往下看,接着打断点:

在这里插入图片描述

  • 进入这个EngineCoreProc的实例化方法后:

在这里插入图片描述

  • 我们接着debug进入上图中的super().init()中:

在这里插入图片描述

  • 看过vLLM v0代码的读者,看到这个EngineCore构造函数中的内容应该会觉得很熟悉(至少我觉得)

在这里插入图片描述

  • 我们再进入调度器实现看看:

在这里插入图片描述

  • 下图就是调度器模块了,v1中调度器是prefill和decode混合的,而且没有cpu offload了,这要和v0调度器区分一下:

在这里插入图片描述

  • debug到这里,其实overview中所有的模块都包含了,具体细节读者可以边debug,边print。
  • 我们直接step out到最初始的离线推理入口函数中:

在这里插入图片描述

  • 进入到LLM的generate()函数中:

在这里插入图片描述

  • 进入run_engine():

在这里插入图片描述

  • 进入step之后,可以看到:

在这里插入图片描述

  • 可以看到:

在这里插入图片描述

  • 这个get_output是直接使用了SyncMPClient中的outputs_queue获取了,因为我们前面以前添加了request(可以自行debug),进程已经运行了推理。
  • 然后进程process 0 会反复进行setp的操作,直到全部请求都推理完成:

在这里插入图片描述

  • 推理结束:

在这里插入图片描述
笔者已经尽量详细,但还是觉得写的不太好,多多包涵!

相关文章:

  • CAU人工智能class3 优化器
  • java 集合总结
  • 【Vue3】Vue3工程的创建 及 开发者工具的安装
  • 运维Web服务器核心知识与实战指南
  • 时源芯微|π型LC滤波电路
  • Vue3使用DataV报错无法使用的解决方案
  • 手术机器人行业新趋势:Kinova多机械臂协同系统如何突破复杂场景适应性瓶颈?
  • el-radio-group 与 el-dropdown 组合使用的注意事项
  • torch.matmul() VS torch.einsum()
  • 独占内存访问指令LDXR/STXR
  • Linux nbd 网络块设备(2)-内核实现
  • Universal Media Server (UMS)部署指南
  • 如何做好一份技术文档?
  • docker面试题(3)
  • 学习路之uniapp--unipush2.0推送功能--使用
  • Python包管理工具uv 国内源配置
  • XCOSnTh-fatfsShell
  • 使用Gemini, LangChain, Gradio打造一个书籍推荐系统 (第一部分)
  • 友思特方案 | 光示原形:高精度晶圆缺陷检测的高功率UVLED方案
  • SOC-ESP32S3部分:4-参数配置可视化menuconfig
  • 做网站PAAS系统/百度关键词怎么设置
  • 怎么用域名做邮箱网站/网站搭建需要什么技术
  • 网站平台专题如何制作/自己建网站怎么弄
  • 哪里有做响应式网站的/网站模板下载