摘要
本文解读 ICML 2023 论文《FlexGen: High-Throughput Generative Inference of Large Language Models with a Single GPU 》。该论文提出 FlexGen 高吞吐生成推理引擎 ,通过融合GPU/CPU/磁盘三级内存聚合 、线性规划卸载策略搜索 与4-bit 权重与 KV cache 压缩 ,让 1750 亿参数的 OPT-175B 模型在一张 16GB 消费级显卡上完成高吞吐生成,其特别之处在于把「在哪存、何时算、谁来算」形式化为可证明的优化问题。实验表明 FlexGen 在 OPT-175B 上首次达到 1 token/s 生成吞吐 (有效批次 144),最大吞吐较 DeepSpeed ZeRO-Inference 提升 100 倍以上,为资源受限场景下的大模型推理提供了重要借鉴。
视频讲解 :点击观看 B 站视频
- 摘要
- 论文基本信息
- 为什么单卡跑大模型这么难?
- 研究主线:从问题到结论
- 基准/方法设计
- [分类全景:FlexGen 的三板斧](#分类全景:FlexGen 的三板斧)
- 方法细节
- 实验设计与结果
- 结果对比总结
- 关键发现
- 局限性
- 常见问题(FAQ)
- [FlexGen 如何做到单卡运行 175B 模型?](#FlexGen 如何做到单卡运行 175B 模型?)
- [为什么 FlexGen 吞吐比 DeepSpeed 高这么多?](#为什么 FlexGen 吞吐比 DeepSpeed 高这么多?)
- [4-bit 量化会损失多少精度?](#4-bit 量化会损失多少精度?)
- [FlexGen 与 llama.cpp 有什么关系?](#FlexGen 与 llama.cpp 有什么关系?)
- [CPU 也能参与计算吗?](#CPU 也能参与计算吗?)
- [FlexGen 开源吗?](#FlexGen 开源吗?)
- 参考链接
论文基本信息
| 项目 | 内容 |
|---|---|
| 标题(英文) | FlexGen: High-Throughput Generative Inference of Large Language Models with a Single GPU |
| 标题(中文) | FlexGen:单 GPU 上的大语言模型高吞吐生成推理 |
| 作者 | Ying Sheng, Lianmin Zheng, Binhang Yuan, Zhuohan Li, Max Ryabinin, Daniel Y. Fu, Zhiqiang Xie, Beidi Chen, Clark Barrett, Joseph E. Gonzalez, Percy Liang, Christopher Ré, Ion Stoica, Ce Zhang |
| 机构 | 斯坦福大学 · 加州大学伯克利分校 · 苏黎世联邦理工学院 |
| 会议 | ICML 2023 |
| arXiv | https://arxiv.org/abs/2303.06865 |
| 项目网站 | https://github.com/FMInference/FlexGen |
为什么单卡跑大模型这么难?
大模型生成推理对算力和内存的要求极高:GPT-175B 仅模型权重就需要 325GB 显存 ,至少要 5 张 A100(80GB)配合复杂并行策略才能运行。而 FlexGen 关注的是另一类更普遍的需求------基准评测、信息抽取、数据整理这类延迟不敏感、需要大批量处理的任务。在这类任务里,延迟可以牺牲,吞吐才是目标,这为降低硬件门槛提供了空间。
瓶颈并不只在权重。KV cache 是新的瓶颈 :当批次为 512、输入序列 512、输出序列 32 时,KV cache 峰值达到 1.2TB,是模型权重的 3.8 倍 ,直接限制了大批次的可行性。现有卸载系统(DeepSpeed ZeRO-Inference、Hugging Face Accelerate)把训练期的调度策略直接搬来推理:逐行遍历计算图、反复加载权重,I/O 开销巨大,OPT-175B 的批次只能做到 1--2,吞吐远低于硬件极限。Petals 为代表的去中心化协作推理则受制于网络带宽,无法支撑大批次。FlexGen 的思路是把 GPU、CPU、磁盘当作统一的三级内存池,用大批次摊薄跨层级的 I/O 成本,并与计算重叠。
研究主线:从问题到结论

图 6:FlexGen 研究主线:问题 → 吞吐导向动机 → 计算图形式化 → LP 策略搜索 → 4-bit 压缩 → 1 token/s 与 100 倍吞吐(Mermaid 流程图)
基准/方法设计
FlexGen 把生成推理建模为计算图遍历问题:图中每个方块是一次「某层 × 某 token」的 GPU 批次计算,同色方块共享同一层权重;合法路径必须满足依赖关系、设备内存约束,目标是最小化总执行时间。在此基础上,FlexGen 从三个维度构造搜索空间:
- 计算调度 :从行优先改为 zig-zag 块调度 ------按列遍历、块内多 GPU 批次复用权重,I/O 复杂度被证明不超过最优方案的 2 倍。
- 张量放置:用 9 个比例变量刻画权重、激活、KV cache 在 GPU/CPU/磁盘上的分布(如 20% 权重在 GPU、80% 在 CPU)。
- 计算委派 :KV cache 在 CPU 时,把 attention score 的计算交给 CPU,只需搬运激活,I/O 量缩小为原来的 1/s(s 为序列长度)。

图 1:单张 NVIDIA T4(16GB)上 OPT-175B 与 OPT-30B 的延迟---吞吐帕累托前沿;FlexGen 最大吞吐较现有系统高 100 倍,其他系统受 OOM 限制无法继续提升
分类全景:FlexGen 的三板斧

图 7:FlexGen 三板斧:zig-zag 卸载调度、代价模型与 LP 策略搜索、4-bit 量化与稀疏注意力,外加多卡流水并行扩展(Mermaid 分类图)
方法细节
zig-zag 块调度 是 FlexGen 的核心:按列遍历计算图,让权重常驻 GPU 复用,只换入换出激活与 KV cache;块大小(GPU 批次 × 块内批次)即有效批次大小。同时用 6 个逻辑线程把「加载下一层权重、存取前后批的 cache/激活、当前计算」重叠起来,最后一个同步点收尾。
代价模型与策略搜索 :单块延迟 T = T_{pre}\\cdot l + T_{gen}\\cdot (n-1)\\cdot l(l 为层数、n 为生成步数),每个阶段取各类 I/O 与计算的最大值;再叠加 GPU/CPU/NVMe 三处峰值内存约束。固定 (bls, gbs) 后,9 个放置比例构成一个线性规划问题,目标 \\min T/bls,硬件参数先 profiling 拟合,LP 秒级可解。

图 2:LLM 推理的计算图:方块为某层 × 某 token 的 GPU 批次计算,同色方块共享同一层权重

图 3:行优先调度每步重新加载权重、I/O 巨大;zig-zag 块调度按列复用权重,仅换入换出激活与 KV cache
4-bit 近似方法 :按 64 个元素一组计算 min/max 后量化到 4-bit 整数、计算前反量化回 FP16(权重沿输出通道、KV cache 沿隐藏维度分组),零重训零校准;稀疏注意力则每个 query 只保留 K cache 的 Top-10% 索引,只加载对应 V cache 子集。
实验设计与结果
评测硬件为 NVIDIA T4(16GB)+ Xeon CPU(208GB)+ NVMe SSD(1.5TB),模型为 OPT 6.7B/30B/175B,提示长度 512/1024、每提示生成 32 token;生成吞吐 = 生成 token 数 /(prefill + 解码时间)。基线为 DeepSpeed ZeRO-Inference、Hugging Face Accelerate 与按 GPU 数归一化的 Petals。
端到端生成吞吐(token/s,序列长度 512):
| 系统 | 6.7B | 30B | 175B |
|---|---|---|---|
| Accelerate | 25.12 | 0.62 | 0.01 |
| DeepSpeed | 9.28 | 0.60 | 0.01 |
| Petals | 8.25 | 2.84 | 0.08 |
| FlexGen | 25.26 | 7.32 | 0.69 |
| FlexGen (4-bit) | 29.12 | 8.70 | 1.12 |
在 OPT-175B 上,FlexGen(4-bit)达到 1.12 token/s,较 DeepSpeed 提升 112 倍 ;30B 上 7.32 vs 0.60,提升 12 倍。压缩版把所有权重与 KV cache 驻留 CPU(有效批次 144),彻底避开磁盘交换。同 5000 秒延迟约束下,FlexGen 吞吐高 40 倍 ;允许更高延迟并开启压缩可达 100 倍。

图 4:不同网络延迟与带宽下 FlexGen(单 T4)与 Petals 集群(4×T4,per-GPU 归一化)的延迟与吞吐;卸载在高吞吐场景优于长流水协作推理
多卡流水并行(解码吞吐 token/s) :FlexGen(1)→FlexGen(4) 在 175B 上为 0.83→3.86(超线性),因为每卡内存压力下降后可切到 CPU 驻留并扩大批次;端到端吞吐未线性增长源于 prefill 流水气泡与仅生成 32 token 的设置。
精度(4-bit 量化,Lambada acc / WikiText ppl):
| 配置 | Lambada 30B | WikiText 30B | Lambada 175B | WikiText 175B |
|---|---|---|---|---|
| FP16 | 0.725 | 12.72 | 0.758 | 10.82 |
| 4-bit | 0.724 | 12.90 | 0.756 | 10.94 |
| 4-bit + 稀疏 | 0.718 | 12.90 | 0.756 | 10.94 |
逐技术消融(吞吐 token/s) :30B 全量 7.32,无 CPU 计算 4.03、无重叠 5.86、移植 DeepSpeed 策略仅 1.57;175B 全量 0.69,无策略搜索 0.27、无磁盘直接 OOM------策略质量决定数量级差异 。FlexGen 还完成了 HELM 集成:OPT-IML-30B 在单卡上 21 小时跑完 7 个代表性子场景。

图 5:diagonal 块调度:灰色为一次性预热区,每轮计算一条对角线的多个子对角线,各层权重加载一次覆盖整条对角线;理论上块大小可扩近 2 倍、平均完成延迟减半(需非连续 KV cache 注意力,未实现)
结果对比总结

图 8:结果对比总结:175B 吞吐 0.01→0.69→1.12 token/s、解码 0.83→3.86 超线性、4-bit 精度几乎无损(Mermaid 流程图)
关键发现
- 首次在 16GB 单卡上以 1 token/s 运行 OPT-175B,有效批次 144,突破此前卸载系统的吞吐上限。
- 4-bit 权重 + KV cache 压缩零重训零校准:OPT-175B 的 Lambada 准确率仅从 0.758 降到 0.756,几乎无损。
- 策略搜索是吞吐的核心:OPT-175B 关闭策略搜索后吞吐从 0.69 掉到 0.27,移植 DeepSpeed 策略仅 0.01。
- I/O 重叠与 CPU 委派各贡献显著:30B 上去掉重叠 7.32→5.86,去掉 CPU 计算 7.32→4.03。
- 流水并行实现解码吞吐超线性:175B 解码从单卡 0.83 到四卡 3.86 token/s。
- HELM 评测民主化:OPT-IML-30B 的 7 个子场景在单卡 21 小时完成,显著降低基准评测门槛。
局限性
- 面向延迟不敏感任务:批处理场景适用,交互式聊天等低延迟场景不适用。
- 强依赖 CPU 内存容量:208GB CPU DRAM 是 175B 卸载的关键,CPU 内存小的机器(如 3090 配 125GB)吞吐反而低于 T4 配置。
- 最优调度未落地:I/O 最优的 diagonal 调度需要非连续 KV cache 注意力,实际实现的是次优的 zig-zag 块调度。
- 近似方法有边界:3-bit 量化无法保持精度;启用量化后 CPU 委派因解压开销过大而关闭。
常见问题(FAQ)
FlexGen 如何做到单卡运行 175B 模型?
FlexGen 把权重、激活与 KV cache 按比例分布到 GPU、CPU 和磁盘三级内存,用 zig-zag 块调度按列复用权重,配合 4-bit 压缩让数据主要驻留 CPU,从而绕开慢速磁盘,在 16GB 显存上跑通 OPT-175B。
为什么 FlexGen 吞吐比 DeepSpeed 高这么多?
DeepSpeed 继承训练期逐行调度,每生成一步都要重新加载整层权重;FlexGen 按列遍历复用权重,并用线性规划搜索最优放置与批次大小,把有效批次从 1--2 提升到 144,I/O 成本被大批次摊薄。
4-bit 量化会损失多少精度?
几乎无损:OPT-175B 的 Lambada 准确率从 FP16 的 0.758 到 4-bit 的 0.756,WikiText 困惑度从 10.82 到 10.94;3-bit 则无法保持精度。
FlexGen 与 llama.cpp 有什么关系?
FlexGen(2023)是首个形式化卸载搜索的系统,其「GPU/CPU 协同、层级卸载、批处理摊薄 I/O」的思想被 llama.cpp、PowerInfer 等本地推理生态广泛沿用。
CPU 也能参与计算吗?
可以。当 KV cache 在 CPU 上时,FlexGen 把 attention score 的计算委派给 CPU,只搬运激活,I/O 量缩小为 1/s;但启用量化后 CPU 解压开销过大,该委派被关闭。
FlexGen 开源吗?
开源,代码在 https://github.com/FMInference/FlexGen ,支持 OPT 系列模型,可配置 T4/3090 等不同硬件。
参考链接
- arXiv 论文页:https://arxiv.org/abs/2303.06865
- 项目主页(代码):https://github.com/FMInference/FlexGen
- DeepSpeed-Inference(基线):https://github.com/microsoft/DeepSpeed
- Petals 协作推理(基线):https://github.com/bigscience-workshop/petals
- HELM 评测基准:https://crfm.stanford.edu/helm/
- vLLM(后续 KV cache 管理代表作):https://github.com/vllm-project/vllm
给大家推荐一款自用写文献综述、无虚构文献的 AI:
🌟 复旦大学 FudanNLP 团队自研 切问学术
覆盖 3.6 亿篇可溯源真实中英文文献,能自动整合文献观点生成规范综述
还能挖掘研究创新点、复现实验,配合视频教学,新手快速上手文献综述写作
🍀后记🍀
博客的关键词集中在编程、算法、机器人、人工智能、数学等等,持续高质量输出中。
🌸讨论QQ群 :白拾的小屋 (750365700)
⭐B站账号 :白拾的物理AI组会(活跃于知识区和动画区)
✨GitHub主页 :YhbCode000(工程文件)