【vLLM 源码解析】引擎 Front
VLLM 架构LLMEngineLLMEngine类是 vLLM 引擎的核心组件。它负责接收来自客户端的请求并调度模型生成输出。LLMEngine包括输入处理、模型执行可能分布在多个主机和/或GPU上、调度和输出处理。Input Processing使用指定的分词器处理输入文本的分词。Scheduling选择每一步要处理的请求。Model Execution管理模型的执行包括跨多个GPU的分布式执行。Output Processing处理模型输出将 Token 解码为人类可读取的文本。LLMEngine源码vllm/engine/llm_engine.pyInputProcessordefmain():llmLLM(modelgpt2,trust_remote_codeTrue)sampling_paramsSamplingParams(temperature0.8,top_p0.95,max_tokens100)prompts[The future of artificial intelligence,Once upon a time in a galaxy far away]print(正在生成文本...)outputsllm.generate(prompts,sampling_params)# 打印结果fori,outputinenumerate(outputs):print(f\n{*50})print(f提示{i1}:{output.prompt})print(f生成文本:{output.outputs[0].text})print(f{*50})if__name____main__:main()推理请求入口llm.generate()Prompt - EngineCoreRequestInputPreProcessor 模块支持多种 prompt 输入格式string, TextPrompt, TokensPrompt, or EmbedsPromptPrompt 处理核心逻辑InputPreProcessor.parse_singleton_prompt(prompt)。LLMEngine 会在服务启动时同步初始化 InputPreProcessor因此该模块是全局的。tokenizer 随之初始化用于分词编码 prompt。支持的 tokenizer如下v0.12.0以输入 prompt ‘The future of artificial intelligence’为例经过 InputProcessor 模块处理后生成的 prompt_token_ids [464, 2003, 286, 11666, 4430]。input_socket 转发数据请求经过InputProcessor处理所产生的 EngineCoreRequest 会交由OutputProcessor维护请求状态request_states字典结构dict[str, RequestState] {}以 request_id 粒度存储请求 RequestState。 模型自回归每次生成的 token 和 text 都会根据 request_id 更新至对应的 RequestState。然后请求会通过 SyncMPClient 发送至 input_socket供 EngineCore 异步调度处理。SyncMPClient 初始化时基于ZMQ socket创建 (launch_core_engines()) 配对的地址addresses.inputs 和 addresses.outputs 是预设的通信通道。addresses 为 vLLM 引擎的全局共享地址作为异步传输通道。ZMQ Socket 类型* ROUTER (input_socket)路由模式可接收来自多个客户端的消息* PULL (output_socket)拉取模式聚合来自多个上游的消息def_send_input(self,request_type:EngineCoreRequestType,request:Any):self.ensure_alive()self.free_pending_messages()# (Identity, RequestType, SerializedRequest)msg(self.core_engine,request_type.value,*self.encoder.encode(request))iflen(msg)3:# No auxiliary buffers no tensor backing buffers in request.self.input_socket.send_multipart(msg,copyFalse)returntrackerself.input_socket.send_multipart(msg,copyFalse,trackTrue)self.add_pending_message(tracker,request)EngineCoreProcEngineCoreProc 推送请求至调度器 waiting 队列请求 EngineCoreRequest 通过 (Sync)MPClient 推送 Socket 后需要被处理引擎如何感知MPClient 实例初始化时会启动 EngineCoreProc 异步线程 input_thread从 input_sockets 中 poll 数据。这里的数据就来源于 OutputProcessor 添加的请求 EngineCoreRequest最终会转换为Request。那么其实可以看出 input_thread 的核心逻辑是从 input_socket 中读取数据并转换数据类型它会通过队列 input_queue 将 Request 加入 Scheduler 的waiting调度队列供调度器分发请求。调度队列类型先到先服务FCFSRequestQueue / 优先级PriorityRequestQueue队列classSchedulingPolicy(Enum):Enum for scheduling policies.FCFSfcfsPRIORITYpriorityEngineCore 调度请求并获取结果schedule()方法是 vLLM 调度器的核心负责在每个调度步骤中决定哪些请求应该被执行并返回包含所有调度信息的 SchedulerOutput 对象。其核心工作流程就是根据 token 数量来分配 kv_cache_block。调度器会从 waiting 队列中取出任务判断其是否可以分配资源如果资源允许则将其移至running 队列。调度不区分 prefill 和 decoding 阶段每个请求有num_computed_tokens已计算和num_tokens_with_spec需要计算含推测目标让num_computed_tokens追上num_tokens_with_spec以输入 prompt_token_ids [464, 2003, 286, 11666, 4430] 为例经 scheduler 调度并由 ModelExecutor 执行后生成的输出sampled_token_ids [[13]]OutputProcessor请求被调度执行生成 token 后需要做进一步消费和解析核心逻辑由 OutputProcessor 模块执行。SyncMPClient 初始化时会启动异步线程output_queue_thread循环监听 output_sockettoken 由 EngineCore 调度 Model 生产并发送至 output_socket然后将数据放入output_queue队列由 OutputProcessor 异步消费。 值得注意的是模型自回归单次生成一个 token那么最终的 token 以及输出文本如何组装prompt 请求初次进入 OutputProcessor 时会被封装为RequestState实例以 req_id 为索引维护该请求在模型推理时的状态。这里的状态就包括已生成的 token / text维护在 RequestState 实例属性 Detokenizer 中。fornew_token_idinnew_token_ids:self.token_ids.append(new_token_id)self.output_textself.decode_next(new_token_id)如果遇到终止符标识或者输出文本中匹配停止字符串则输出最终的结果AsyncLLMEngineAsyncLLMEngine类是LLMEngine类的异步包装器。它使用asyncio创建一个后台循环持续处理传入的请求。AsyncLLMEngine专为在线服务设计能够处理多个并发请求并向客户端流式传输输出。AsyncLLMEngine源码vllm/engine/async_llm_engine.pyWorkerWoker是运行模型推理的进程。vLLM 遵循使用一个进程控制一个加速设备如GPU的常规做法。例如如果我们使用大小为 2 的张量并行和大小为 2 的流水线并行那么总共会有 4 个工作进程。工作进程通过rank和local_rank来标识。rank用于全局编排而local_rank主要用于分配加速设备以及访问本地资源如文件系统和共享内存。Model Runner每个Woker都有一个Model Runner负责加载和运行模型。大部分模型执行逻辑都位于此处例如准备输入张量和捕获 CUDA Graph。Model每个Model Runner对象都有一个Model对象该对象是实际的torch.nn.Module实例。有关各种配置如何影响最终实现类见 huggingface_integration。类层次结构

相关新闻

Windows Server 2022/2025 启用图片缩略图、预览窗格和照片查看器

Windows Server 2022/2025 启用图片缩略图、预览窗格和照片查看器

作者:非凡大爹|版本:v1.0|日期:2026-08-05 DocID:WIN-SERVER-2026-PHOTO-PREVIEW-V1.0 适用环境:Windows Server 2022 / Windows Server 2025(桌面体验) 原创声明&#x…

2026/9/28 19:13:21 阅读更多 →
本地部署开源大模型与图像生成:ChatGPT-5.6 Sol项目实践指南

本地部署开源大模型与图像生成:ChatGPT-5.6 Sol项目实践指南

这次我们来看一个名为“ChatGPT-5.6 Sol”的项目,它声称可以免费、无限制地使用。同时,项目还附带了“GPT-Image2”功能。对于关注AI应用,尤其是希望低成本或本地化体验类GPT对话和图像生成能力的开发者来说,这类信息总是充满吸引…

2026/9/26 15:18:55 阅读更多 →
RabbitMQ分片插件:突破单队列性能瓶颈的分布式消息队列解决方案

RabbitMQ分片插件:突破单队列性能瓶颈的分布式消息队列解决方案

1. 项目概述:为什么我们需要关注RabbitMQ分片?在构建现代分布式系统的过程中,消息队列早已成为不可或缺的基石。RabbitMQ凭借其成熟、稳定和协议友好的特性,在众多场景中扮演着“数据高速公路”的角色。然而,随着业务规…

2026/10/9 21:08:01 阅读更多 →

最新新闻

JWT弱口令风险剖析:弱密钥爆破与Token伪造防御指南

JWT弱口令风险剖析:弱密钥爆破与Token伪造防御指南

“JWT还谈得上弱口令?”第一次听到这话的人多半是这种反应。毕竟在不少开发者眼里,JWT是“签名过的凭证”,是安全的代名词。结果没想到这类“安全凭证”里最常见的问题之一,恰恰是签名密钥太弱。所谓JWT弱口令,更准确地…

2026/10/14 22:36:03 阅读更多 →
零基础AI编程实战:需求翻译、工具链组装与信任校验

零基础AI编程实战:需求翻译、工具链组装与信任校验

1. 这不是编程课,是“用AI当手”的认知重启很多人点开标题的第一反应是:“不会写代码也能开发?那还叫开发吗?”——这恰恰暴露了我们对“开发”这个词的刻板印象。过去十年,“开发”被默认绑定在IDE、语法报错、Git提交…

2026/10/14 22:36:03 阅读更多 →
社科生的工具箱:从问卷设计到数据分析,汇写把研究链路接上了

社科生的工具箱:从问卷设计到数据分析,汇写把研究链路接上了

做问卷、跑回归、写分析报告,社科研究生终于不用在五个软件之间反复横跳社科研究生的日常是这样的:在问卷星上发问卷,回收数据导出Excel;打开SPSS跑信效度和回归;把结果复制到Word里写分析;参考文献用Zoter…

2026/10/14 22:36:03 阅读更多 →
AI接单闷声赚钱:普通人用AI工具服务甲方的高效玩法

AI接单闷声赚钱:普通人用AI工具服务甲方的高效玩法

上个月我去上海跑了三天,日程排得像在赶集。见的人里有一大半,朋友圈常年不更新,微博几年前就注销了,公众号注销得干干净净,网上搜他们的名字,出来的全是别人的同名信息。就是这样一群人,靠着AI…

2026/10/14 22:36:03 阅读更多 →
【企业级全景会议记录怎么落地】从全天评审到跨部门例会,一套可复用的AI记录方案

【企业级全景会议记录怎么落地】从全天评审到跨部门例会,一套可复用的AI记录方案

开一整天的职级评审会,手机录了五个小时,回到工位才发现录音文件损坏打不开;跨部门项目例会开了三轮,关键结论散落在三个人的笔记里,谁也没法还原当时的决议;客户面谈聊得很顺畅,一周后想复盘&a…

2026/10/14 22:36:03 阅读更多 →
AI渗透工具闭源背后的责任边界与语义安全挑战

AI渗透工具闭源背后的责任边界与语义安全挑战

1. 事件还原:从公开漏洞披露到闭源决策的完整时间线事情的起点其实很普通——一个叫ARTEX的AI驱动型渗透测试工具,在GitHub上以MIT许可证开源了近三年。它不像传统扫描器那样依赖规则库匹配,而是用轻量级微调模型对HTTP流量、API请求模式和常…

2026/10/14 22:35:02 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →