学习让我快乐

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

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...

一定要保存 asyncio.Task 对象啊!

很早之前, 在我刚接触到 asyncio 观其文档时, 就看到其反复提及过: Important: Save a reference to the result of this function, to avoid a task disappearing mid-execution. The event loop only keeps weak references to tasks...

NCCL AllReduce CudaGraph 时 hang 问题分析

我们同学在压测时遇到过压测进行到一段时间之后会几率性阻塞, 于是让我帮忙看一下. 于是我拉起了我的开发调试镜像, 里面存放着各种预编译好的, 带有调试信息的 pytorch, nccl 等一大坨我们会用到的组件, 然后开始启动压测复现, 复现过程不再多提, 最终我拿到了一个现场, 赶紧挂起 cuda-gdb 到一个 worker 进程, 可以看到: 0x00007f6489d08c9b i...

NCCL 源码解读(17): Primitives Simple

本文是 NCCL 源码解读系列之一, NCCL 源码解读系列使用 NCCL 版本: v2.25.1-1. 本文介绍 Primitives<ProtoSimple> 相关实现细节. 前景提要 在之前关于 p2p transport 的文章中, 我们已经介绍了在发送方会在 p2pSendSetup 时分配 sizeof(ncclSendMem) 大小显存, 接收方会分配 ...

mpMath: 与微信公众号的斗智之旅(2)

这是一篇水文, 可是为了解决 mpMath 与微信公众号新版编辑器不兼容的原因, 我浪费了我美丽的周日下午, 不把这个经历水出来我实在意难平啊!意难平!! 前景提要: mpMath: 与微信公众号的斗智之旅(1) 事情好像到这里就要结束了? 但我想着趁热打铁, 总有一天我还是会面对基于 ProseMirror 的新编辑器, 这一关迟早要过的. 简单看了下 ProseMirror 文...

消失的 1 秒钟

笔者最近在参与 LLM 推理框架 PD 分离相关工作, 在完成开发压测过程中发现一个很奇怪的点: 有一些请求会在被放入 asyncio.Queue 之后要 1 秒钟左右之后才会被 Queue 消费端可见. 这让我感到有些意思, 于是准备进入深入分析一番. 首先我要有一个趁手的工具, 最起码可以展示这 1 秒内各个线程都在做什么. 当然首推的就是 py-spy 了, 但 py-spy 有个问...