大语言模型的参数规模动辄几十亿甚至上千亿,直接加载到GPU显存中推理对硬件要求极高。以一个175B参数的模型为例,仅权重以16位浮点数存储就需要约350GB空间,而一张消费级显卡通常只有24GB显存。FlexGen正是针对这一矛盾提出的解决方案,它通过CPU/GPU混合存储与精细的调度策略,让有限显存的设备也能完成大规模模型推理,并且保持可观的整体吞吐量。

FlexGen的核心架构:三层存储体系
FlexGen将可用的存储资源划分为三个层级:GPU显存、CPU内存和磁盘。这三层的容量依次增大、带宽依次降低。框架的调度器会把模型权重、激活值和键值缓存这三类数据合理分布到三个层级上,目标是在给定显存预算下最大化吞吐量。
与传统简单的offload方案不同,FlexGen并不只是把放不下的数据被动地搬到CPU,而是把整个计算过程抽象成一个二维时间表问题。每一层的计算、数据搬运都被安排在明确的时间片上,GPU计算与数据传输可以重叠执行。这种全局视角使得数据搬运不再是随机发生的性能抖动,而成为可以被精确规划的流水线。
在实现上,FlexGen对注意力计算和全连接层都做了针对性的算子封装,保证张量在不同设备之间移动时格式统一,避免频繁的格式转换开销。同时它利用了稀疏注意力等方法进一步降低计算量,在离线批处理场景下效果尤其明显。
调度算法:用线性规划决定数据放哪里
FlexGen最有特色的部分是它的自动调度策略。框架会根据硬件参数(显存容量、内存带宽、PCIe带宽)和模型参数(层数、隐藏维度、序列长度)构建一个解析模型,估算不同放置策略下的执行时间,然后通过整数线性规划搜索最优的存储分配方案。
具体来说,调度器要回答几个关键问题:每一层的权重应该预取到哪一级存储、键值缓存按什么比例切分到GPU和CPU、批处理大小设置为多少。这三个变量相互耦合——更大的批次能提升计算效率,但也会放大键值缓存的占用。FlexGen通过扩展的计数草图方法快速评估候选方案,避免暴力枚举带来的巨大搜索开销。
# FlexGen使用示例(伪代码风格)
from flexgen.flex_opt import OptLM, ExecutionEnv
# 初始化执行环境,自动探测GPU、CPU和磁盘
env = ExecutionEnv.create("offload_demo_env")
# 模型配置:以175B模型为例
model = OptLM("facebook/opt-175b", env,
cache_path="weights",
percent=[100, 75, 50]) # 权重、KV缓存等放置比例
# 执行离线批量推理
inputs = ["请总结以下文章:", "翻译成英文:今天天气很好"]
outputs = model.generate(inputs, tune=True)
print(outputs)
env.close()上面代码中的percent参数是控制放置策略的关键,三个数字分别对应权重、注意力和线性层权重在GPU上的存放比例。设置为tune=True时框架会自动搜索最优组合,用户也可以手动指定来适配自己的硬件。
吞吐与延迟的权衡:批处理与滚动缓存
FlexGen明确面向高吞吐场景,尤其是离线批处理任务,例如对整个数据集做打分、批量摘要或批量生成。为了提升吞吐,它采用了两大机制。第一是滚动键值缓存:处理长序列时,键值缓存按块组织,块可以在GPU与CPU之间循环复用,避免一次性分配全部缓存导致的显存溢出。
第二是大批次调度。FlexGen允许批次大小远超显存中能容纳的样本数,通过交错执行的方式,把多个批次的计算穿插排布,使GPU在等待数据搬运时总有其他工作可做。实验数据显示,在单张T4显卡上运行OPT-175B,FlexGen的吞吐量比DeepSpeed ZeRO-Inference高出数倍,这正是精细调度带来的收益。
需要清醒认识的是,这种设计牺牲了单请求延迟。数据在CPU与GPU之间来回搬运必然引入额外延迟,因此FlexGen并不适合对首字响应时间敏感的在线交互服务。如果你的场景是离线处理,这个取舍通常是划算的;如果是在线服务,则需要考虑量化、模型并行等其他路线,或者将FlexGen作为低成本兜底方案。
实际部署要点与适用场景
部署FlexGen时,CPU内存容量和PCIe带宽是除显存外最关键的两个因素。内存需要能容纳大部分模型权重,PCIe带宽则决定了权重搬运速度。实际测试中,如果内存带宽过低,GPU会大量时间处于空闲等待状态,整体吞吐明显下降。建议使用NVMe固态硬盘存放权重文件,避免机械硬盘成为瓶颈。
在场景选择上,FlexGen最适合三类需求:一是在没有多卡集群的环境下验证超大规模模型效果的研究实验;二是对延迟不敏感的批量数据处理任务;三是预算有限但需要偶尔运行大模型的个人或小团队。对于追求低延迟在线推理的团队,vLLM、TensorRT-LLM这类纯GPU方案配合量化技术仍然是更合适的选择。
总结来看,FlexGen的价值在于用一个统一的调度框架,把混合存储推理这件事从手工调参变成了自动化搜索。它证明了在显存受限的硬件上,通过系统级的优化同样可以高效运行大模型。理解它的三层存储模型和调度思想,对学习其他offload类推理框架也很有帮助。