大模型每生成一个词,芯片都要把全部模型参数从显存里完整搬运一遍
大模型每生成一个词,芯片都要把全部模型参数从显存里完整搬运一遍。 一个 700 亿参数的模型,哪怕只输出一个标点符号。 显存也要完整读出 140GB 的权重数据。 这 140GB 搬进计算核心,实际发生的算术运算只有一瞬间。 价值数万美元的顶级 GPU,大半时间都在原地干等数据搬运。 算术强度太低,芯片大部分算力都在原地放空。 解决这个问题最直接的办法,是批处理。 把几十个用户的提问打包成一个批次。 同样读一遍 140GB 的权重,一口气算出几十个用户各自的新词。 显存搬运的时间几乎没变,吞吐量却瞬间拉高了几十倍。 但传统的打包方式,很快撞上了一堵硬墙。 每个用户的提问长度和回答长度完全不同。 有人问一个是非题,模型生成 10 个词就结束了。 有人让模型写长篇分析,需要生成 1000 个词。 在传统的静态批处理里,一个批次只要开跑,必须等最慢的请求跑完。 那个 10 步就结束的席位,在剩下的 990 步里只能填入无效占位符。 算力席位白白空转,服务器门外却排起长队。 整个批次的算力利用率,经常在后半程暴跌到两成以下。 怎么让芯片在每一个时间切片里都跑满? 2022 年,首尔大学与 FriendliAI 团队在 OSDI 会议上给出了答案。 他们在一篇名为 Orca 的论文里,提出了这台机器:连续批处理。 它把调度的最小颗粒度,从整条请求粉碎到了单个词的生成步。 过去是按整批任务进出。 现在是每生成一个词,系统就重新做一次调度决策。 每一个解码步骤结束,系统立即扫描所有席位。 只要有一条请求输出了结束符,它的席位下一毫秒就会被释放。 排队队列里的新请求,立刻顶进这个空出来的矩阵行。 为什么在飞行途中随意换人,在数学上完全合法? 关键在于 Transformer 解码阶段的矩阵行独立性。 所有请求共享同一份静态模型权重。 但在注意力计算中,每个请求只读取属于自己的键值缓存。 矩阵里的每一行,在计算时彼此完全隔离,互不干涉。 第一行在算第 500 个词,第二行刚进来算第 1 个词。 它们并排坐在同一个矩阵里,计算过程互不影响。 这种隔离性,让动态插队和腾退变得极其顺畅。 2023 年,伯克利团队在 SOSP 上推出 vLLM。 配合分页机制解决显存碎片,这套调度彻底成了全行业的标配底座。 大模型推理成本的大幅下降,不单靠芯片制程的升级。 把传统调度下浪费的算力缝隙填满,一样能让吞吐效率实现几十倍跃迁。
引用 / CITATIONS
No citations exported.
导出 / EXPORT
订阅 · SUBSCRIBE
新的深度解读发布时,会在每周简报里送到你邮箱。