Appearance
引擎核心 — 概念
EngineCore 主循环
EngineCore 的核心是一个无限循环,每轮迭代执行三个阶段:
阶段 1:调度
调度器 分析当前所有待处理请求,决定:
- 哪些新请求开始 prefill
- 哪些请求继续 decode
- 是否需要 preemption(抢占)
- KV 缓存块的分配与释放
阶段 2:执行
Executor 接收 SchedulerOutput,分发到 Worker 执行模型前向传播。MultiProc 模式下通过 pipe 通信,Ray 模式下通过 Ray actor 调用。
阶段 3:输出处理
OutputProcessor 将原始模型输出转换为用户可见的输出:
- logits → token IDs(通过采样)
- token IDs → 文本(通过 Detokenizer)
- 处理 finish reason(STOP、LENGTH、ABORT)
- 计算 logprobs 和 prompt logprobs
AsyncLLM 异步前端
AsyncLLM 是面向 API 服务器的异步接口:
关键职责:
- 输入处理:tokenize prompt,处理多模态输入,应用 chat template
- 输出处理:detokenize,流式输出,统计信息收集
- 请求管理:跟踪活跃请求,处理 abort 信号
- 指标收集:TTFT、TPOT、吞吐量等性能指标
EngineCoreClient 通信机制
EngineCoreClient 提供两种通信模式:
同步模式(SYNC)
用于 LLMEngine(离线推理):
- 直接函数调用,EngineCore 在同进程中运行
- 适合批量推理场景
异步模式(ASYNC)
用于 AsyncLLM(在线服务):
- 通过 ZMQ
DEALER/ROUTERsocket 通信 - EngineCore 运行在独立进程
- 支持多前端同时连接
请求处理流水线
一个请求经过的完整处理链:
关键数据结构
EngineCoreRequest
使用 msgspec 定义的高效二进制序列化结构体:
prompt_token_ids:tokenized 输入sampling_params:采样参数(temperature、top-k 等)lora_request:LoRA 适配器(可选)arrival_time:请求到达时间(用于计算 TTFT)
EngineCoreOutput
每轮迭代的输出:
new_token_ids:新生成的 token IDsfinish_reason:STOP / LENGTH / ABORT / ERRORlogprobs:token 概率events:生命周期事件
FinishReason 枚举
| 值 | 含义 |
|---|---|
| STOP | 遇到 EOS token 或 stop token |
| LENGTH | 达到 max_tokens 限制 |
| ABORT | 用户主动取消 |
| ERROR | 推理过程中出错 |
| REPETITION | 重复惩罚触发 |
相关概念
- Continuous Batching — 调度器的核心策略
- Paged Attention — KV 缓存的内存管理
- CUDA Graph — decode 阶段的图优化
- Flash Attention — 高效注意力计算内核
- 调度系统 — 调度器的详细分析
- API服务 — Rust Frontend 和 DP Supervisor 的前端模式