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

vLLM - LLMEngine

LLMEngine是vLLM的核心,它接收输入,通过语言模型生成输出,并将结果返回给客户端。离线批量推理的LLM,在线服务的AsyncLLMEngine都通过封装LLMEngine对外提供推理服务。

LLMEngine有3个关键组成部分:

  • Processor(Tokenizer):将输入文本转换为tokens。
  • OutputProcessor(Detokenizer):将token转换为文本。
  • EngineCoreClient:模型代理,支持Language Model和Pooling Model,支持分布式部署。

LLMEngine有v0和v1两个版本的实现,目前主流是使用的v1版本,源代码位于:vllm/vllm/v1/engine/llm_engine.py

__init__

LLMEngine的__init__完成:

  • 调用stateless_init_dp_group初始化DP通信的Group
  • 调用init_tokenizer_from_configs初始化Tokenizer
  • 创建Processor,用于将Inputs转换为EngineCoreRequest(主要是Tokenize)。
  • 创建OutputProcessor,用于将EngineCoreOutput转换为RequestOutput(主要是Detokenize)。
  • 调用EngineCoreClient.make_client创建EngineCoreClient。
  • 调用reset_mm_cache重置Multi-Modal Cache。
class LLMEngine:def __init__(self,vllm_config: VllmConfig,executor_class: type[Executor],log_stats: bool,usage_context: UsageContext = UsageContext.ENGINE_CONTEXT,stat_loggers: Optional[list[StatLoggerFactory]] = None,mm_registry: MultiModalRegistry = MULTIMODAL_REGISTRY,use_cached_outputs: bool = False,multiprocess_mode: bool = False,) -> None:...parallel_config = vllm_config.parallel_configif not multiprocess_mode and parallel_config.data_parallel_size > 1:self.dp_group = parallel_config.stateless_init_dp_group()else:self.dp_group = Noneself.should_execute_dummy_batch = Falseself.tokenizer = init_tokenizer_from_configs(model_config=vllm_config.model_config,scheduler_config=vllm_config.scheduler_config,lora_config=vllm_config.lora_config)self.processor = Processor(vllm_config=vllm_config,tokenizer=self.tokenizer,mm_registry=mm_registry)self.output_processor = OutputProcessor(self.tokenizer,log_stats=self.log_stats)self.engine_core = EngineCoreClient.make_client(multiprocess_mode=multiprocess_mode,asyncio_mode=False,vllm_config=vllm_config,executor_class=executor_class,log_stats=self.log_stats,)if not multiprocess_mode:self.model_executor = self.engine_core.engine_core.model_executor  self.reset_mm_cache()

add_request

add_request实现添加一个新的request:

  • 调用self.processor.process_inputs将Inputs转换为EngineCoreRequest
  • 如果是Sampling场景,根据SamplingParams的输出序列数为n生成n个EngineCoreRequest;如果是Pooling场景,则只有1个EngineCoreRequest。
  • 将生成的所有EngineCoreRequest分别添加到self.output_processor和self.engine_core,用于后续step处理。
class LLMEngine:def add_request(self,request_id: str,prompt: PromptType,params: Union[SamplingParams, PoolingParams],arrival_time: Optional[float] = None,lora_request: Optional[LoRARequest] = None,tokenization_kwargs: Optional[dict[str, Any]] = None,trace_headers: Optional[Mapping[str, str]] = None,prompt_adapter_request: Optional[PromptAdapterRequest] = None,priority: int = 0,) -> None:prompt_str, request = self.processor.process_inputs(request_id, prompt, params, arrival_time, lora_request,tokenization_kwargs, trace_headers, prompt_adapter_request,priority)n = params.n if isinstance(params, SamplingParams) else 1if n == 1:self.output_processor.add_request(request, prompt_str, None, 0)self.engine_core.add_request(request)returnparent_req = ParentRequest(request_id, params)for idx in range(n):request_id, params = parent_req.get_child_info(idx)child_request = request if idx == n - 1 else copy(request)child_request.request_id = request_idchild_request.sampling_params = paramsself.output_processor.add_request(child_request, prompt_str,parent_req, idx)self.engine_core.add_request(child_request)

abort_request

abort_request用于中止请求:

  • 分别中止self.output_processor和self.engine_core中对应的请求。
class LLMEngine:def abort_request(self, request_ids: list[str]) -> None:request_ids = self.output_processor.abort_requests(request_ids)self.engine_core.abort_requests(request_ids)

step

step执行一次解码迭代:

  • 如果是dummy batch,则直接执行一次dummy_batch(通常用于DP Group同步等待)。
  • 调用self.engine_core.get_output()获取EngineCoreOutput列表
  • 调用self.output_processor.process_outputs将EngineCoreOutput列表转换为OutputProcessorOutput。
  • 如果请求需要中止,则调用self.engine_core.abort_requests中止对应的请求。
  • 返回processed_outputs.request_outputs,即RequestOutput/PoolingRequestOutput列表
class LLMEngine:def step(self) -> Union[list[RequestOutput], list[PoolingRequestOutput]]:if self.should_execute_dummy_batch:self.should_execute_dummy_batch = Falseself.engine_core.execute_dummy_batch()return []outputs = self.engine_core.get_output()iteration_stats = IterationStats() if self.log_stats else Noneprocessed_outputs = self.output_processor.process_outputs(outputs.outputs,engine_core_timestamp=outputs.timestamp,iteration_stats=iteration_stats)# 3) Abort any reqs that finished due to stop strings.self.engine_core.abort_requests(processed_outputs.reqs_to_abort)...return processed_outputs.request_outputs

OutputProcessorOutput定义:

@dataclass
class OutputProcessorOutput:request_outputs: list[Union[RequestOutput, PoolingRequestOutput]]reqs_to_abort: list[str]

文章转载自:

http://v3rOYuUQ.Lnmby.cn
http://aXANWX5Y.Lnmby.cn
http://Ksn7CX1u.Lnmby.cn
http://z5UOKW9Y.Lnmby.cn
http://t5p6Z91D.Lnmby.cn
http://mWJ1CdBy.Lnmby.cn
http://fuovs7Mz.Lnmby.cn
http://kyOaMlTP.Lnmby.cn
http://R02g36wo.Lnmby.cn
http://IlJOuiy3.Lnmby.cn
http://RLnotkfo.Lnmby.cn
http://iGBY7uws.Lnmby.cn
http://e1ejeoXh.Lnmby.cn
http://4GSnBb8g.Lnmby.cn
http://pJX6D4R3.Lnmby.cn
http://3Lk8nQFD.Lnmby.cn
http://5GeIiIzA.Lnmby.cn
http://df1TZlcZ.Lnmby.cn
http://cLgbIShu.Lnmby.cn
http://9YHhvrpU.Lnmby.cn
http://hxE79hoK.Lnmby.cn
http://arGUkSWu.Lnmby.cn
http://TDrid5Xb.Lnmby.cn
http://AixXm6gO.Lnmby.cn
http://aUgXfeBf.Lnmby.cn
http://RVCqfSAX.Lnmby.cn
http://A7OZTg5f.Lnmby.cn
http://UwgZiPHH.Lnmby.cn
http://7amuckVv.Lnmby.cn
http://6XzqDRlv.Lnmby.cn
http://www.dtcms.com/a/383031.html

相关文章:

  • 天猫返利app的多租户架构设计:数据隔离与资源共享方案
  • 数据库造神计划第六天---增删改查(CRUD)(2)
  • AI 赋能内容创作:从文案生成到视频剪辑,创作者的工具革命已至
  • 如何使用“线程级微内核架构”打造应用
  • [硬件电路-219]:自由电子与空穴导电的比较(异同)
  • 系统编程完结整理
  • 阿里云视觉多模态理解大模型开发训练部署
  • leetcode_21 合并两个有序链表
  • Node.js实时截屏实现方案
  • 01数据结构-01背包问题
  • 20250914-01: Langchain概念:流式传输(Streaming)
  • 初步认识 Spring Boot 自动装配
  • 《突破Unity+腾讯云联机瓶颈:多人游戏同步延迟与数据安全的双维度优化》
  • 计算机算术9-浮点乘法
  • 第24课:项目实战与总结
  • 【深度学习|学习笔记】从背景→公式→性质→梯度→何时用哪一个→数值稳定性与常见坑方面描述sigmoid和softmax函数!(一)
  • C++宽度优先搜索算法:队列与优先级队列
  • 同步降压转换器原理
  • 人工智能训练师三级备考笔记
  • <基于深度学习的条纹图分析及其不确定性估计>-论文总结
  • 【愚公系列】《人工智能70年》020-语音识别的历史性突破(深度学习带来历史性突破)
  • 网络操作系统与分布式操作系统的区别
  • Spring Cloud Alibaba 实战:从 0 到 1 构建可监控的微服务体系
  • 分布式推理与量化部署
  • Kafka 实现从网络层到日志与位点的“全景拆解”
  • Python入门教程之赋值运算符
  • 机器学习系统设计:从需求分析到模型部署的完整项目流程
  • SpringMVC架构解析:从入门到精通(1)
  • Why Language Models Hallucinate 论文翻译
  • 从 WPF 到 Avalonia 的迁移系列实战篇5:Trigger、MultiTrigger、DataTrigger 的迁移