ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【vLLM 源码解析】引擎 Front

2026/8/6 8:18:57 拓冰建站 浏览量
【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。类层次结构