调度(Scheduling)的核心在于将模型权重平衡分配到物理机器的资源(包括 GPU、CPU 和硬盘)中在线课堂。这种策略不仅能通过并行计算加快推理速度,还能让 100B 参数级别的超大型模型在仅配备有 T4 GPU 的低配置 PC 上运行。
实现这一目标的关键在于两个核心要素:
在 GPU、CPU 和硬盘间智能地加载 / 卸载模型权重
高效处理计算单元间的 I/O 数据传输
Flexgen
由 Stanford、UC Berkeley 和 CMU 联合提出的 Flexgen [8],正是解决这两个关键问题最具创新性的方案之一在线课堂。
推理过程通常如下图所示在线课堂。需要处理的每个数据块被定义为加载到模型层的一批数据,其中列方向按批次处理的,行方向则按照模型层维度处理。
在线课堂我们定义有效路径为满足以下约束条件的遍历(即计算)所有方格的路径:
从左向右执行
所有数据必须位于同一设备
当前方块的激活值(Activation) 需要等待其右侧相邻方块完成计算后在线课堂,才能被释放或复用
KV Cache 需存储至最右侧数据计算完成时释放
任意时刻设备上存储的张量总大小不得超过该设备内存容量
如果我们有 n 个 token,每个 token 的数据将按顺序加载和计算在线课堂。每一层的权重仅在需要计算时加载,并在计算结束后立即卸载。由于 GPU 的计算速度极快(如闪电),而内存传输速度极慢(如蜗牛),频繁的加载 / 卸载会带来巨大时间开销。
图中每个方块表示 GPU 对一个模型层(layer)的批处理计算(batch computation)在线课堂,同色方块共享同一层的权重参数
Flexgen 通过将行扫描改为列扫描或之字形块调度(zig-zag block schedule)进行优化:在无 I/O 开销的情况下保留模型层权重,并为下一列保存激活值在线课堂。在计算块执行期间,Flexgen 实现三大操作的并行执行:加载下一层权重、存储前一数据批次的激活值 / KV 缓存、执行当前数据批次的计算,从而有效解决内存传输问题。
Flexgen 的另一个核心创新在于模型权重的硬件分布策略在线课堂。
Flexgen 采用线性规划策略搜索法(Linear Programming Policy Search)来寻找最优加载配置,使模型整体推理时间最小化在线课堂。
其中:
n:每个序列输出 token 的数量
𝑙:transformer 层数
block size:每个计算块处理的样本量(数据批次大小 × 数据批次数量)
下图展示了 Flexgen 在搭载了 T4 GPU 的机器上运行 OPT-30B 模型的配置示例在线课堂。
论文对比了 HuggingFace 的 DeepSpeed 库和 Accelerate 库的性能:Flexgen 声称能达到 7.32 tokens / 秒,而 DeepSpeed 为 1.57 tokens / 秒,Accelerate 仅 0.62 tokens / 秒在线课堂。