一个关于现代 LLM 究竟是怎么被服务起来的心智模型系列。用大白话写,不写矩阵公式,到处是 ASCII 图。
目标不是教你公式。而是建立那些让后面每一条公式都显得理所当然的直觉。每一篇都挑出 LLM serving pipeline 的一小块,像探索之旅一样走一遍。
一个关于现代 LLM 究竟是怎么被服务起来的心智模型系列。用大白话写,不写矩阵公式,到处是 ASCII 图。
目标不是教你公式。而是建立那些让后面每一条公式都显得理所当然的直觉。每一篇都挑出 LLM serving pipeline 的一小块,像探索之旅一样走一遍。
这个系列是什么,以及一份还在生长的文章地图 —— 已发布、在写、留给未来的自己去填的坑都列在这。
三个 zoom level —— 整张网络、一个 transformer block 的内部、生成一段文字的完整循环。够你在脑子里搭起一个 LLM 的样貌,也够你开始问对的问题。
把 weight matrix 用两种方式读,就有两种把它切到多 GPU 上的方法。从 transformer prefill 里的一次 matmul,推出 tensor parallelism 的整套心智模型。
把 article 02 的两种 cut 方式拿到一整个 transformer block 上跑一遍,盯着每一步每张 GPU 上的 shape。先把一种 cut 用到所有 matmul 上 —— 通信爆炸,每个 block 四次 gather。再把两种 cut 配成一对,刚好对上 widen-narrow 的架构节奏,落到每个 block 两次 all-reduce。
很多个用户同时打过来,prompt 长度还都不一样。把一整个 transformer block 拿到一个 flatten 起来的多 request tensor 上跑一遍,看哪些 layer 是白送、哪些得真动手 —— 顺便看一下 TP 这边到底要不要改。
很多 request 同时在跑,结束时间各不相同,有的还带着比一次 decode 大 1000 倍的 prefill。每次 iteration 的开销因此摇摆得厉害。ORCA 那种 iteration-level 调度先收拾一半问题;chunked prefill 再给最大的那次 iteration 封顶,让短任务不被拖在长任务后面。
Article 05 让两个阶段勉强共用一台引擎。这一篇要说的是:它俩本来就不该共用 —— prefill 是 compute-bound、decode 是 bandwidth-bound,长上下文还把这条沟越拉越宽。承认了这种 asymmetry,拆机就不再是优化,而是顺着公式来唯一说得通的答案。