TokenSpeed事件循环设计全解控制面与数据面分离的微秒级调度艺术【免费下载链接】tokenspeedTokenSpeed is a speed-of-light LLM inference engine.项目地址: https://gitcode.com/gh_mirrors/to/tokenspeedTokenSpeed 是一款面向 Agentic 工作负载的光速级 LLM 推理引擎其核心秘密之一就是事件循环Event Loop设计把做决策的控制面与跑 GPU 的数据面彻底分离让每一个调度轮次round只消耗微秒级时间。本文将带你读懂这套控制面与数据面分离的调度架构——它如何让 CPU 决策永远不被 GPU 拖慢最终换来与 TensorRT-LLM 同级的推理性能。为什么分离一道微秒 vs 毫秒的选择题传统推理引擎的调度循环里决策与 GPU 提交常常混在一起一轮调度里既要排队、分缓存、又要等 CUDA 操作。结果是 CPU 循环被 GPU 的在途工作拖住多卡间的一致性同步collectives也开始互相等待吞吐和延迟双双受损。TokenSpeed 的答案很直接控制面只做决策一微秒级别跑完数据面专跑 CUDA一个线程按 FIFO 顺序消化所有 GPU 工作。这样即使 GPU 的队列已经堆了几百个 kernel控制面的跨 rank 同步也总能立刻找到所有人。上图是这套调度架构带来的直接回报在 Kimi K2.5 的 Agentic 负载上TokenSpeed蓝线在多种并行配置下全面贴近或超过 TensorRT-LLM。控制面EventLoop 只做协调不做执行控制面的主角是 event_loop.py 中的EventLoop.event_loop方法它负责四件事ZMQ 请求输入、gloo 跨 rank 集合通信、驱动 C 写成的调度器tokenspeed-scheduler/以及对提交结果的提交后处理commit。设计上有一条铁律事件循环不运行任何 GPU 工作也碰不到任何 GPU 对象。它只是编排者——所有领域逻辑暂停/恢复、EPD 准入、PD 传输、L2/L3 缓存都住在独立模块里以单行 hook 调用的形式进入循环。循环体从上往下读就是一轮完整调度的日程表没有任何一个功能的内部实现混在里面。一轮调度Round的 5 步解剖设计文档 docs/design/event-loop.md 中给出了标准流程接收并准入新请求_process_new_requests暂停与 EPD 准入各是一行 hook轮询已完成的 L2 缓存操作并在这一步就推进调度器头部推进点保证本轮计划能立即看到缓存释放的容量规划本轮scheduler.next_execution_plan()生成执行计划推导 forward 操作、记录指标、做 DP 同步每轮只调用一次DeviceHandle.execute(plan, planned)——这一行的调用顺序本身就是正确性契约先回写 host 缓存、再页面清零、再加载回写、再远端 PD 传输流、最后才是模型 batch尾部推进调度器把本轮所有request_changesforward 结果、PD 传输事件、L3 恢复回撤一次性反馈给调度器并只发布一次 KV 事件。值得注意的是第 2、5 步整个引擎里scheduler.advance只有这两个显式调用点。辅助函数和 hook 只返回事件从不自己推进调度器——只读循环体就能看清调度器状态在哪些点、为什么被推进这是可读性与可维护性的硬约束。数据面一个线程、一条 FIFO吃掉所有 CUDA 工作数据面的实现极简forward_thread.py 中的ForwardThread——每个 rank 一个线程、一条队列、严格 FIFO。所有触碰 CUDA 的工作都在这里提交模型 forwardeager 启动或 CUDA graph 重放、pipeline 的 NCCL 收发、KV 页面清零、PD 传输的远端落盘、RL 权重更新……为什么用线程而不是进程因为 forward 工作要就地读取 executor 的 device buffer、CUDA graph 和 NCCL 通信子起一个进程就得复制一整套 CUDA 上下文等于维护第二个引擎。而 GIL 在这里不构成瓶颈——线程的时间都花在会释放 GIL 的 CUDA 启动和 NCCL 等待上。单线程 FIFO 还有一个隐藏红利每个 rank 入队的工作序列完全相同冗余调度器做出相同的计划所以共享 NCCL 通信子上的集合操作在所有 rank 上天然保持同样的发起顺序。某个 stage 的启动队列背压只会卡住自己的 forward 线程绝不会阻塞控制面。数据面同样有对称的铁律每轮路径上永不与设备同步。任何.cpu()、.item()、stream.synchronize()都会等整条 stream 完成让下一轮的前置准备滑到当前步骤完成之后in_flight_depth的流水线深度直接退化为 0。CI 甚至用TOKENSPEED_DATA_PLANE_SYNC_DEBUGerror把每一次违规同步直接变成报错。DeviceHandle用可见性而不是纪律做隔离控制面与数据面之间不是靠口头约定隔离而是靠对象形状隔离。device.py 的build_device_side在启动时构建出模型 runner、attention 后端、KV 池和 executor但事件循环拿到的只是一个DeviceHandle——它对外只暴露命名的操作named operations从不交出底层对象循环无法命名任何模型 runner、后端或 KV 池因此无法隐式传递或误改正在被 forward 使用的对象每个 handle 方法都是一个明确命名的操作改动这个表面必须同步更新架构测试中的操作白名单test/runtime/test_device_handle.py结果回程只有一条通道PendingExecution.result()——先 join forward 线程的 future确认 kernel 已发起再等它的拷贝事件确认 D2H 已落地。配合捕获契约信息只通过提交的闭包进入数据面且一经提交即冻结——不许改属性、不许原地编辑、不许释放闭包捕获的资源结果只通过 future 回来。这样即使将来把线程换成进程接口也已经就是全部接口。重叠调度in_flight_depth 这个只影响性能的旋钮事件循环由一个参数in_flight_depth参数化深度行为场景0本轮提交、本轮提交结果commit经典同步行为兼容性1先提交本轮 forward 再 commit 上一轮——CPU 处理第 N-1 步时 GPU 在跑第 N 步默认重叠调度pp_size连续 prefill chunk 占据不同流水线级commit 队头提供背压chunked prefill 流水线关键设计是正确性永远不依赖深度。任何输入依赖未完成 commit 的副作用的派发都会先排空在途队列——这些规则集中在_dispatch_depends_on_pending_commit这一个注册表里而不是散落进循环体。深度只决定一个结果 future 可以被挂多久不决定工作在哪里执行。钩子模式子系统进入循环的唯一入口新功能如何不污染循环体答案是钩子类hooks pattern子系统与循环的集成是一个小类循环只调用它的几个固定方法子系统只返回事件和决策从不推进调度器。当前库存包括钩子职责循环入口_pause_hooks暂停/恢复、显存驻留控制apply_transitions、paused_idle_step_epd_hooks多模态 EPD 异步嵌入准入try_stage、drain_ready_embeddings_pd_hooksPD 分离部署的 KV 传输事件poll_transfer_events_cache_hooksL2 主机缓存操作跟踪count_plan_ops、poll_ready_events_l3_hooksL3 分布式存储准入与恢复submit_requests、prepare_forward_eplb_hooks在线专家重平衡note_round循环里仅此一行以在线专家重平衡为例循环体里只有一行note_round(forwarded...)完全不知道重平衡的存在布局计算甚至被丢到一个独立的 CPU worker 进程里做避免与 forward 线程抢 GIL 数秒。这套设计值多少性能微秒级的控制面意味着调度本身免费GPU 越忙分离的收益越大因为决策线程永远不会为 GPU 的在途队列排队。配合单线程 FIFO 的确定性执行顺序、深度可调的重叠流水线TokenSpeed 在 Blackwell 和 MI300X/MI355X 上都拿到了顶级吞吐。上图展示的是数据面另一端的功夫在 AMD MI355X 上GPT-OSS 的 attention prefill 在不同序列长度与 batch 下的吞吐对比。控制面负责在正确的时机提交正确的 batch而像 Gluon 这样的后端 kernel 负责让这个 batch 跑得飞快——控制面/数据面分离正是让两者各自独立优化、互不拖累的架构前提。给想深入读者的路线图 设计原则全文五条原则 一轮解剖 扩展检查清单docs/design/event-loop.md事件循环实现python/tokenspeed/runtime/engine/event_loop.pyforward 线程与捕获契约python/tokenspeed/runtime/execution/forward_thread.pyC 调度器准入、回撤、恢复协议tokenspeed-scheduler/ 及其设计文档 docs/design/scheduler.md一句话总结把想和做放进不同的线程、不同的时间尺度用对象形状而非代码纪律来强制隔离——这就是 TokenSpeed 事件循环的微秒级调度艺术也是它敢于自称光速的底气。【免费下载链接】tokenspeedTokenSpeed is a speed-of-light LLM inference engine.项目地址: https://gitcode.com/gh_mirrors/to/tokenspeed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?