【vllm】(Part 5)vLLM服务入口层
Part 5: 服务入口层
Part 5: vLLM 服务入口层架构分析
源码路径:
vllm/entrypoints/(154文件, ~34K行)
核心模块:openai(OpenAI兼容API)、serve(服务管理)、cli(命令行入口)、pooling(嵌入/分类)、sagemaker(SageMaker适配)
目录
- 整体架构概览
- OpenAI兼容API服务架构
- Chat Completion请求处理完整流程
- Completion与Responses端点
- 服务管理子系统
- 多模态与实时推理端点
- Pooling子模块(嵌入/分类/评分/重排)
- Anthropic兼容层与MCP工具服务
- CLI命令行入口
- 引擎客户端构建与生命周期
- 协议层与数据模型
- 中间件与安全机制
- 可观测性(监控/健康/指标)
- 关键设计模式总结
1. 整体架构概览
vLLM的服务入口层是连接外部请求与推理引擎的核心桥梁。它采用FastAPI + Uvicorn + uvloop技术栈,提供了从OpenAI兼容REST API到gRPC、从CLI交互到批量推理的多种接入方式。
入口层目录结构
vllm/entrypoints/
├── __init__.py
├── api_server.py # 旧版API服务器入口(兼容层)
├── chat_utils.py # 聊天模板/消息工具函数
├── constants.py # 常量定义
├── grpc_server.py # gRPC服务器(200行)
├── launcher.py # HTTP服务启动器(serve_http)
├── llm.py # 离线LLM推理入口(1957行)
├── logger.py # 请求日志器
├── ssl.py # SSL证书刷新
├── utils.py # 通用工具函数
│
├── openai/ # ★ OpenAI兼容API(核心)
│ ├── api_server.py # FastAPI主应用构建(733行)
│ ├── cli_args.py # CLI参数解析
│ ├── fingerprint.py # system_fingerprint生成
│ ├── orca_metrics.py # 端点负载指标
│ ├── run_batch.py # 批量推理
│ ├── server_utils.py # 中间件/异常处理/认证
│ ├── utils.py # 请求验证工具
│ ├── chat_completion/ # Chat Completion端点
│ ├── completion/ # Completion端点
│ ├── responses/ # Responses API端点
│ ├── speech_to_text/ # 语音转文本端点
│ ├── realtime/ # 实时WebSocket端点
│ ├── generate/ # 生成路由聚合
│ ├── generative_scoring/ # 生成式评分端点
│ ├── models/ # 模型列表/管理
│ ├── engine/ # 引擎协议与基础Serving类
│ └── parser/ # Harmony解析器工具
│
├── anthropic/ # Anthropic兼容层
├── cli/ # CLI子命令
├── mcp/ # MCP工具服务
├── pooling/ # 嵌入/分类/评分/重排
├── sagemaker/ # SageMaker适配
└── serve/ # ★ 服务管理子系统
├── __init__.py # 路由注册中心
├── cache/ # 缓存管理
├── disagg/ # 分离式推理
├── elastic_ep/ # 弹性并行
├── instrumentator/ # 监控/健康/指标
├── lora/ # LoRA动态管理
├── profile/ # 性能分析
├── render/ # 预渲染服务
├── rlhf/ # RLHF权重更新
├── rpc/ # 集群RPC
├── sleep/ # 睡眠/唤醒
└── tokenize/ # 分词/反分词
2. OpenAI兼容API服务架构
2.1 服务器启动流程
vLLM的API服务器通过api_server.py构建,启动流程如下:
关键函数说明:
| 函数 | 文件 | 职责 |
|---|---|---|
run_server() |
api_server.py | 单Worker服务器入口 |
run_server_worker() |
api_server.py | 单Worker运行逻辑 |
setup_server() |
api_server.py | 验证参数、绑定端口、设信号 |
build_async_engine_client() |
api_server.py | 创建AsyncLLM引擎客户端 |
build_app() |
api_server.py | 构建FastAPI应用+注册路由+中间件 |
init_app_state() |
api_server.py | 初始化所有Serving实例到app.state |
build_and_serve() |
api_server.py | 组装App→初始化状态→启动HTTP |
serve_http() |
launcher.py | Uvicorn启动封装 |
2.2 FastAPI应用构建(build_app)
build_app()函数是路由注册的核心,它根据supported_tasks动态挂载不同的API路由:
2.3 应用状态初始化(init_app_state)
init_app_state()将所有Serving实例挂载到app.state,这些实例在请求处理时被路由处理器引用:
# app.state 关键属性
state.engine_client = engine_client # 引擎客户端
state.vllm_config = vllm_config # 全局配置
state.openai_serving_models = ... # 模型管理(含LoRA)
state.openai_serving_render = ... # 预渲染服务
state.openai_serving_tokenization = ... # 分词/反分词服务
state.openai_serving_chat = ... # Chat Completion服务
state.openai_serving_chat_batch = ... # 批量Chat服务
state.openai_serving_completion = ... # Completion服务
state.openai_serving_responses = ... # Responses服务
state.anthropic_serving_messages = ... # Anthropic Messages服务
state.serving_tokens = ... # 分离式推理Tokens服务
state.serving_generative_scoring = ... # 生成式评分服务
state.server_load_metrics = 0 # 服务器负载指标
3. Chat Completion请求处理完整流程
Chat Completion是vLLM最核心的API端点,对应OpenAI的/v1/chat/completions。
3.1 请求处理链路
3.2 关键类与文件
3.3 流式输出处理详解
流式输出是Chat Completion最复杂的部分,涉及Harmony协议解析、工具调用流式检测、推理内容分离等:
3.4 Harmony协议与流式解析
vLLM集成了OpenAI的Harmony协议用于统一的流式输出解析:
stream_harmony.py:extract_harmony_streaming_delta()函数,从StreamableParser状态中提取DeltaMessageTokenState:命名元组(channel, recipient, text),跟踪每个token的通道状态- 通道系统:区分最终文本(
final)、工具调用、推理内容等不同通道 - recipient切换检测:检测工具调用之间的recipient变化,触发工具调用流式输出
3.5 工具调用处理
vLLM支持多种工具调用解析器,通过ToolParserManager和ParserManager动态注册:
# 工具解析器初始化(在OpenAIServingChat.__init__中)
self.tool_parser = ParserManager.get_tool_parser(
tool_parser_name=tool_parser,
enable_auto_tools=enable_auto_tools,
model_name=self.model_config.model,
)
self.parser_cls = ParserManager.get_parser(
tool_parser_name=tool_parser,
reasoning_parser_name=reasoning_parser,
enable_auto_tools=enable_auto_tools,
model_name=self.model_config.model,
)
工具调用选择模式:
auto:自动决定是否使用工具required:必须使用工具none:禁止工具使用(可配置是否从模板排除工具)- 指定函数:
ChatCompletionNamedToolChoiceParam
3.6 批量Chat Completion
/v1/chat/completions/batch端点支持批量请求处理,由OpenAIServingChatBatch处理:
@router.post("/v1/chat/completions/batch")
@with_cancellation
@load_aware_call
async def create_batch_chat_completion(
request: BatchChatCompletionRequest, raw_request: Request
):
handler = batch_chat(raw_request)
result = await handler.create_batch_chat_completion(request, raw_request)
4. Completion与Responses端点
4.1 Completion端点 (/v1/completions)
结构类似Chat Completion,但处理纯文本补全:
| 组件 | 文件 | 职责 |
|---|---|---|
api_router.py |
路由定义 + 请求分发 | |
protocol.py |
CompletionRequest/CompletionResponse协议 |
|
serving.py |
OpenAIServingCompletion处理逻辑 |
关键区别:Completion请求直接传递prompt字符串而非messages数组,使用render_for_completion()进行预渲染。
4.2 Responses端点 (/v1/responses)
OpenAI的新式Responses API,支持更丰富的交互模式:
特点:
- 支持SSE流式输出(
StreamingResponsesResponse) - 集成MCP工具服务器(
ToolServer接口 →MCPToolServer/DemoToolServer) - 使用Harmony协议进行输出解析
- 支持
enable_prompt_tokens_details和enable_force_include_usage
5. 服务管理子系统
vllm/entrypoints/serve/是vLLM的服务管理核心,通过register_vllm_serve_api_routers()统一注册到FastAPI应用。
5.1 路由注册中心
5.2 LoRA动态管理
端点: /v1/load_lora_adapter、/v1/unload_lora_adapter
安全限制: LoRA动态加载仅在VLLM_ALLOW_RUNTIME_LORA_UPDATING=true时启用,且仅建议本地开发使用。
LoRA适配器还在服务启动时通过process_lora_modules()处理静态LoRA模块,并合并default_mm_loras(来自lora_config)。
5.3 缓存管理
| 端点 | 方法 | 功能 |
|---|---|---|
/reset_prefix_cache |
POST | 重置前缀缓存(支持reset_external参数重置外部缓存) |
/reset_mm_cache |
POST | 重置多模态缓存 |
5.4 分离式推理(Disaggregated Serving)
分离式推理将预填充(prefill)与解码(decode)分离到不同服务:
核心类: ServingTokens继承自OpenAIServing,提供"Tokens IN → Tokens OUT"功能,接收tokenized输入而非原始文本。
多模态支持: mm_serde.py处理多模态数据的编码/解码,支持在分离式推理中传递多模态特征。
5.5 RLHF权重热更新
端点: /pause、/resume、/update_weights
暂停模式:
abort:立即中止所有进行中的请求wait:等待进行中的请求完成keep:冻结队列中的请求,resume后继续
5.6 弹性专家并行(Elastic EP)
端点: /scale_elastic_ep
动态调整数据并行度(data parallel size),适用于MoE模型的弹性专家并行:
@router.post("/scale_elastic_ep")
async def scale_elastic_ep(raw_request: Request):
new_data_parallel_size = body.get("new_data_parallel_size")
drain_timeout = body.get("drain_timeout", 120)
# 设置全局缩放状态 → ScalingMiddleware拦截新请求(503)
# 排空现有请求 → 调整并行度 → 恢复服务
ScalingMiddleware:全局中间件,当_scaling_elastic_ep=True时对所有HTTP请求返回503 Service Unavailable。
5.7 睡眠/唤醒机制
| 端点 | 方法 | 功能 |
|---|---|---|
/sleep |
POST | 让引擎进入睡眠状态(释放GPU资源),支持level参数和abort/wait/keep模式 |
/wake_up |
POST | 唤醒引擎,支持tags参数选择性唤醒 |
/is_sleeping |
GET | 查询引擎睡眠状态 |
5.8 性能分析
| 端点 | 方法 | 功能 |
|---|---|---|
/start_profile |
POST | 启动Profiler |
/stop_profile |
POST | 停止Profiler |
仅在profiler_config配置了profiler时注册路由。
5.9 集群RPC
端点: /collective_rpc
允许通过HTTP API调用引擎的分布式集体RPC方法,用于调试和管理:
@router.post("/collective_rpc")
async def collective_rpc(raw_request: Request):
method = body.get("method") # RPC方法名
args = body.get("args", []) # 序列化参数
kwargs = body.get("kwargs", {}) # 序列化关键字参数
results = await engine.collective_rpc(method, timeout, args, kwargs)
5.10 分词/反分词
| 端点 | 方法 | 功能 |
|---|---|---|
/tokenize |
POST | 将文本分词为token IDs |
/detokenize |
POST | 将token IDs反分词为文本 |
5.11 预渲染服务(Render)
OpenAIServingRender是一个关键组件,负责将Chat/Completion请求渲染为引擎输入:
重要特性:
- CPU-only模式:支持仅预渲染的无引擎模式(
build_and_serve_renderer()),用于分离式推理的预填充节点 - 工具定义注入:根据tool_choice自动注入工具定义到chat模板
- 自定义模板:支持
--chat-template和--trust-request-chat-template - 多模态序列化:
encode_mm_kwargs_item()/decode_mm_kwargs_item()处理多模态数据
6. 多模态与实时推理端点
6.1 语音转文本 (speech_to_text/)
| 端点 | 方法 | 功能 |
|---|---|---|
/v1/audio/transcriptions |
POST | 音频转录(支持流式输出) |
/v1/audio/translations |
POST | 音频翻译(支持流式输出) |
关键类:
OpenAIServingTranscription:音频转录处理OpenAIServingTranslation:音频翻译处理- 使用
Form解析器处理multipart上传(音频文件)
6.2 实时WebSocket (realtime/)
端点: /v1/realtime(WebSocket)
子模块:
connection.py:WebSocket连接管理serving.py:OpenAIServingRealtime实时推理服务metrics.py:WebSocket指标中间件protocol.py:实时协议消息定义
7. Pooling子模块(嵌入/分类/评分/重排)
pooling/子模块为非生成式任务提供API端点,采用工厂模式根据模型task类型动态注册:
统一基类:
PoolingBaseServing(base/serving.py):通用池化服务基类PoolingIOProcessor(base/io_processor.py):输入输出处理器PoolingRequest/PoolingResponse(base/protocol.py):协议定义
所有Pooling端点都通过register_pooling_api_routers(app, supported_tasks, model_config)在应用启动时根据模型支持的任务类型动态注册。
8. Anthropic兼容层与MCP工具服务
8.1 Anthropic兼容层
/v1/messages端点提供Anthropic Messages API兼容:
错误转换: translate_error_response()将vLLM的ErrorResponse转换为Anthropic格式的AnthropicErrorResponse。
8.2 MCP工具服务
mcp/子模块实现MCP(Model Context Protocol)工具服务器,为Responses API提供工具调用能力:
# 工具服务器类型
class ToolServer(Protocol):
async def list_tools(self) -> list[Tool]
async def call_tool(self, name: str, arguments: dict) -> Any
# 实现类
class MCPToolServer(ToolServer): # MCP协议工具服务器
async def add_tool_server(self, url: str)
class DemoToolServer(ToolServer): # 演示用工具服务器
async def init_and_validate(self)
配置方式:
--tool-server demo:启用演示工具服务器--tool-server <url>:连接MCP工具服务器
9. CLI命令行入口
9.1 CLI架构
9.2 各子命令详解
| 子命令 | 模块 | 功能 |
|---|---|---|
vllm serve <model> |
cli/serve.py | 启动OpenAI兼容API服务器(核心命令) |
vllm chat <url> |
cli/openai.py | 交互式Chat客户端,连接已运行的API |
vllm launch render |
cli/launch.py | 启动CPU-only预渲染组件 |
vllm bench * |
cli/benchmark/ | 性能基准测试套件 |
vllm collect-env |
cli/collect_env.py | 收集运行环境信息(调试用) |
vllm run-batch |
cli/run_batch.py | 批量推理 |
9.3 Serve子命令流程
9.4 Chat交互式客户端
vllm chat提供类似ChatGPT的交互式命令行:
def _interactive_cli(args):
openai_client = OpenAI(api_key=api_key, base_url=base_url)
# 自动获取可用模型
model_name = openai_client.models.list().data[0].id
# 流式输出
for chunk in stream:
delta = chunk.choices[0].delta
# 实时打印
10. 引擎客户端构建与生命周期
10.1 AsyncLLM引擎客户端
关键设计:
- 使用
@asynccontextmanager管理引擎生命周期 - 启动后自动重置多模态缓存(
reset_mm_cache()) - 支持多客户端配置(
client_count/client_index用于多API Server场景) - finally块确保引擎优雅关闭
10.2 多Worker模式
在cli/serve.py中,ServeSubcommand.cmd()支持启动多Worker:
class ServeSubcommand(CLISubcommand):
@staticmethod
def cmd(args):
# 1. 启动核心引擎进程(CoreEngineProcManager)
# 2. 启动多个API Server Worker(APIServerProcessManager)
# 3. 等待所有进程完成
core_procs = launch_core_engines(vllm_config, ...)
api_procs = APIServerProcessManager(args, ...)
wait_for_completion_or_failure(core_procs, api_procs)
11. 协议层与数据模型
11.1 协议层次
11.2 OpenAIBaseModel设计
OpenAIBaseModel是所有协议模型的基类,关键特性:
class OpenAIBaseModel(BaseModel):
model_config = ConfigDict(extra="allow") # 允许额外字段(OpenAI API兼容)
@model_validator(mode="wrap")
def __log_extra_fields__(cls, data, handler):
# 自动记录未识别的字段(调试用,不拒绝)
...
这种设计确保了与OpenAI API的完全兼容——即使OpenAI添加新字段,vLLM也不会报错。
11.3 system_fingerprint机制
fingerprint.py提供四种指纹模式:
| 模式 | 格式 | 说明 |
|---|---|---|
full(默认) |
vllm-<version>[-<tp>xpp>]-<hash8> |
包含并行度+配置hash |
hash |
vllm-<version>-<hash8> |
仅版本+配置hash |
custom |
用户自定义字符串 | 通过--fingerprint-value指定 |
none |
null |
不返回fingerprint |
指纹在Serving类初始化时计算一次,缓存在self.system_fingerprint中,流式chunk中省略以减少开销。
12. 中间件与安全机制
12.1 中间件栈
12.2 认证机制
# AuthenticationMiddleware (server_utils.py)
class AuthenticationMiddleware:
def __init__(self, app, tokens):
self.tokens = tokens # 来自 --api-key 或 VLLM_API_KEY
async def __call__(self, scope, receive, send):
# 检查Authorization: Bearer <token>
# 或 x-api-key header
API Key来源优先级: --api-key CLI参数 > VLLM_API_KEY 环境变量
12.3 请求生命周期装饰器
| 装饰器 | 功能 |
|---|---|
@with_cancellation |
监听客户端断开,自动取消引擎请求 |
@load_aware_call |
负载感知,跟踪GPU利用请求数 |
@validate_json_request |
FastAPI依赖,验证JSON请求体 |
13. 可观测性(监控/健康/指标)
13.1 监控端点
| 端点 | 类型 | 功能 |
|---|---|---|
/health |
GET | 健康检查(引擎存活则200,否则503) |
/ping |
GET | 轻量心跳检查 |
/metrics |
GET | Prometheus指标 |
/load |
GET | 服务器负载指标(GPU利用请求数) |
/version |
GET | vLLM版本号 |
/v1 |
GET | API根路径 |
/server_info |
GET | 服务器详细信息(仅dev模式) |
13.2 健康检查
@router.get("/health")
async def health(raw_request: Request):
client = engine_client(raw_request)
if client is None:
# Render-only服务器没有引擎,始终健康
return Response(status_code=200)
try:
await client.check_health()
return Response(status_code=200)
except EngineDeadError:
return Response(status_code=503)
13.3 Prometheus指标
通过prometheus_fastapi_instrumentator集成:
Instrumentator(
excluded_handlers=["/metrics", "/health", "/load", "/ping", "/version", "/server_info"],
registry=registry,
).add().instrument(app).expose(app, response_class=PrometheusResponse)
排除路径避免监控端点自身的指标污染。
13.4 Orca端点负载指标
orca_metrics.py提供端点级负载指标,通过HTTP Header返回:
# 在Chat/Completion路由中
metrics_header_format = raw_request.headers.get(ENDPOINT_LOAD_METRICS_FORMAT_HEADER_LABEL)
# 返回headers中包含负载信息
return JSONResponse(content=..., headers=metrics_header(metrics_header_format))
14. 关键设计模式总结
14.1 架构模式一览
14.2 核心设计决策
- 动态路由注册:根据
supported_tasks和运行时环境决定注册哪些端点,避免无用路由 - Serving类分离:每个端点类型(Chat/Completion/Responses/Embed等)有独立Serving类,职责清晰
- Render层抽象:
OpenAIServingRender将请求渲染与推理执行分离,支持CPU-only预渲染模式 - Harmony协议集成:统一处理文本、工具调用、推理内容的流式输出
- 中间件管道:CORS → 认证 → 缩放检测 → 自定义中间件,可扩展
- graceful degradation:Render-only模式下不需要引擎客户端,健康检查始终返回200
- LoRA多级管理:静态LoRA(启动时加载)+ 动态LoRA(运行时API加载)+ 默认多模态LoRA
- 分离式推理支持:
ServingTokens提供Token级别接口,prefill与decode可独立部署
14.3 关键数据流
附录:文件行数统计
| 文件/目录 | 行数 | 说明 |
|---|---|---|
| openai/api_server.py | 733 | FastAPI主应用 |
| openai/chat_completion/serving.py | 1569 | Chat Completion核心 |
| openai/engine/serving.py | ~600 | OpenAIServing基类 |
| openai/engine/protocol.py | 279 | 基础协议定义 |
| llm.py | 1957 | 离线LLM入口 |
| grpc_server.py | 200 | gRPC服务 |
| entrypoints/ 总计 | ~34000 | 全部入口层代码 |
基于vLLM源码
vllm/entrypoints/目录分析
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)