学习让我快乐

争于世, 不争于势;简洁, 高效, 赏心悦目

vllm 中 async scheduling

当前 vLLM 的异步调度(async scheduling)实现仍较为复杂. 在深入剖析其具体代码之前, 本文将以一条具体的查询请求为例, 手动模拟调度器 scheduler 与 worker 的执行流程, 并标注其中的关键状态变化. 通过这种方式纲举目张, 为后续深入理解代码细节提供一个清晰的参照框架. S0.schedule S0 对应着发生在 R 上的第 0 次 step;...

转折中的 PD 分离

就在昨天晚上, 我们线上 PD 分离部署规模又上了一个新的台阶. 这次没有想往常几次爬坡出现新的问题, 一时间心有所感, 就是想写点什么记录下我们整个 PD 分离的开发历程. kvt 1.0 看过我历史几篇关于 PD 分离的文章, 比如 PD 分离中的 GDR 等的同学都有了解, 我们 PD 分离在早期设计上就期望做到旁路, 不需要对 step 主流程做大的改动. ZeroOverh...

vllm 中的 GDN

随着 Qwen3-Next PD 分离机制的陆续上线, 借此机会系统梳理一下 Gated Delta Rule 的计算流程以及 vllm 中的实现. recurrent 如 GDN 论文 “Gated Delta Networks: Improving Mamba2 with Delta Rule” 所示, Gated Delta Rule 有 recurrent 与 chunk 两种形...

PyTorch Autograd Engine: 1

在正式剖析 Autograd Engine 之前, 有必要先花一点时间把多元微积分里 “导数” 与 “偏导数” 这两个概念重新捋一遍, 毕竟我发现自己又在这块儿犯迷糊了. 严格而系统的论述请参考 陶 Analysis II 6: 多元微分学, 下文仅为个人的非严谨提醒, 旨在把最关键的直觉再钉牢一点. 对于函数 $f: \mathrm{R}^n \to \mathrm{R}^m$, $f$...

PaperReading: Nanoflow(2)

在去年 9 月份做了 PaperReading: Nanoflow 分享之后, 随着 Deepseek TBO 的流行, 我也陆续收到不少关于 Nanoflow 算子如何重叠执行的追问, 一直想找时间详细绘制下 nanoflow 具体地执行流, 现在时间来啦! 我本来想着将上面草图转换为 graphviz 形式, 但感觉好麻烦啊= 关键是上面草图信息已经够直观了, 应该没必要了= Q...

PD 分离中的 kvcache 传输优化

随着我们 PD 分离系统在线上的推广, 我们观测到了 kvcache 传输逐步成为影响用户 ttft 体验的因素之一. 你可以阅读过往文章了解我们 PD 分离的大致架构, 抛开这些过往背景不言, 现在摆在我们面前的问题比较纯粹: 优化 PD 分离中的 kvcache 传输优化. 在目前线上部署中, 我们 P 节点的 attention tp 是大于 D 节点 attention tp 的: ...

啊?你怎么知道我从104kg健到了70kg!

计划启动! 当体脂秤上的数字兜兜转转最终停留在70.7KG的时候,也预示着我这持续了三年的健肥计划是时候到了一个里程碑时的时刻了。忽然忘了当初为啥一时兴起要健肥的来着?可能真的只是小小的简陋神经网络中的一次随机扰动吧。相比这三年发生的另外一件事情从数据库到AI来说,健肥对我来说好像确实不值得一提。但还是想说点什么,就当对过去三年的一次总结,一次与自己肉体的和解吧。 计划执行! 多动...

SpS, Eagle3: 礼貌一点会影响推理性能么?

前言 如 无中生有的 nan 所示, 在我们很早之前为 vllm v1 引入 PD 分离之后, 紧接着要考虑的问题就是 PD 分离与引擎各个功能的适配问题, 比如与 SPS, 与 EP 等. 当然在我们早期设计 PD 分离时, 或者在为 vllm 引擎新增功能时, 就有原则: 目前我们的 PD 分离以及请求迁移都是在 EngineCore 上加了一些新接口(供我们内部组件调用), ...

无中生有的 Nan

前言 很久之前, 我们基于 vllm v1 connector 实现了一套异步的 kvcache load/save 组件, 主要是觉得社区 vllm v1 kv connector 设计中: 把 kvcache 未完成 load/save 的请求, 也放入 waiting 队列中, 依赖于一些 “空” 的 step 来更新 kvcache 的状态, 混淆了 kvcach...

RoPE 的通解

之前在看苏老师 RoPE 相关文章时, 本来是想含含糊糊囫囵吞枣的过去, 但后来发现这些东西细节不掌握, 对后面理解长度外推这些东西更迷糊. 所以还是静下心, 重新整理下 RoPE 相关的知识点. 在整理的时候发现苏老师的文章布局太清晰, 我如果对此做任何调整都是画蛇添足… 所以就以如下 3 篇文章为顺序, 对文章中一些点进入深入展开吧. Transformer升级之路:2、博采众长...

vllm DP coordinator: 另一种实现

如之前我关于 vllm pd 分离实现系列文章所示: 要保存 asyncio.Task 对象 PD 分离中的 GDR GDR: 再深一点 在完成 PD 分离第一版实现之后, 紧接着便是与 vllm 其他模块, 比如 DP, 的适配. DP 适配开发过程不在本文提起, 出乎我意料的是适配工作出奇的简单. P.S. 这里 vllm kvt 方案便是我前几篇文章提到的我们...

GDR: 再深一点

如 PD 分离中的 GDR 所示, 我们 PD 分离中 Prefill 实例负责完成 prefill, 并将 prefill 生成的 kvcache layer-by-layer 地通过 RDMA Write + GDR(GPU-Direct RDMA) 直接写入到 Decode 实例 d_kv_blocks 中. 目前我们 RDMA Write + GDR 是通过阿里云 ACCL-Bare...

PD 分离中的 GDR

在 这篇文章 我提到过我们基于 vllm 实现了 PD 分离, 而且设计思路恰好与 Nvidia Dynamo 撞车了. 大致查询链路也与 Dynamo 相似, 简单来说是: 请求 R 从 D 节点接入, D 节点决策模块确定请求 R 应在某个 P 实例上完成, 此时 D 为 R 分配 kvcache block R.d_kv_blocks, 并会调用 P 实例 do_prefi...