SGLang 多模态请求生命周期:以 Qwen2.5-VL 为例的架构级深度解析 本文档以 为参考模型,提供对 SGLang 框架内多模态请求处理流程的终极详细剖析,深入到关键函数、数据结构转换和并发模型层面,旨在为开发者提供白板级的清晰理解。 核心流程图 服务与适配层 ( ) 作用:系统入口,将外部 OpenAI API 格式请求转换为 SGLang 内部数据结构。 输入:原始 HTTP POST 请求。 输出: 对象。 流程: 接收请求,调用 应用聊天模板。 文本和媒体占位符(如 )被统一格式化。 原始媒体数据(如 URL 或 Base64 编码)完整保存在 字段。 Tokenizer 与多模态处理器 ( , ) 作用:数据准备与模型适配的核心阶段。 输入: 对象。
本文档以 Qwen2.5-VL 为参考模型,提供对 SGLang 框架内多模态请求处理流程的终极详细剖析,深入到关键函数、数据结构转换和并发模型层面,旨在为开发者提供白板级的清晰理解。
serving_chat.py)GenerateReqInput 对象。OpenAIServingChat 接收请求,调用 _process_messages 应用聊天模板。<|vision_start|>...<|vision_end|>)被统一格式化。GenerateReqInput.image_data 字段。tokenizer_manager.py, qwen_vl.py)GenerateReqInput 对象。input_ids、mm_items、mrope_positions 的字典。smart_resize 对图像进行缩放,满足模型输入尺寸要求。<|vision_start|>...<|image_pad|>...<|vision_end|>),即 Token 扩展在 Tokenizer 阶段已完成。input_ids 后,调用 MRotaryEmbedding.get_rope_index,依据输入 Token 和图像网格尺寸,计算精确的 mrope_positions,为后续文本与视觉特征融合提供基础。input_ids、包含 pixel_values 的 MultimodalDataItem 列表,以及 mrope_positions 一同打包,发送给调度器。scheduler.py)input_ids、mm_items、mrope_positions 的字典。ScheduleBatch 对象。Req 与 MultimodalInputs 对象,跟踪状态。pad_input_ids,将 input_ids 中的 <|image_pad|> 等特殊 Token 替换为对应 pixel_values 的哈希值。该哈希值作为缓存关键标识,实现相同图片请求的高效前缀匹配与缓存命中,即使文本内容不同。model_runner.py, qwen2_5_vl.py)ForwardBatch 对象。logits。ModelRunner 创建的 ForwardBatch,包含 input_ids 及 mrope_positions。model.forward(),将 mrope_positions 作为关键参数传入。general_mm_embed_routine 获取整个 input_ids(含 <|vision_start|> 等特殊 Token)的常规词嵌入,并用 mrope_positions 应用 RoPE(旋转位置编码),确保文本和视觉部分获得精确位置信息。<|image_pad|> 区域,调用 get_image_feature。Qwen2.5_VisionTransformer 将 pixel_values 转为高维视觉特征,VisionPatchMerger 对齐到语言模型嵌入维度。<|image_pad|> Token 对应的词嵌入位置,构建融合文本与视觉信息的完整输入序列。logits,采样输出 Token,最终解码为文本返回用户。