news 2026/1/1 14:20:05

Liger-Kernel性能提升:RollingBuffer减少重计算

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Liger-Kernel性能提升:RollingBuffer减少重计算

Liger-Kernel性能提升:RollingBuffer减少重计算

在大模型训练的实战中,显存瓶颈和计算效率往往是压垮实验周期的“最后一根稻草”。尤其是当序列长度拉长、batch size 稍微增加时,原本稳定的训练流程突然爆出 OOM(Out of Memory)错误,这种经历相信不少开发者都深有体会。更令人沮丧的是,明明 GPU 利用率并不高,却因为频繁的小算子调用和冗余的激活存储,白白浪费了宝贵的硬件资源。

正是在这种背景下,Liger-Kernel作为 ms-swift 框架中的底层加速引擎,悄然改变了游戏规则。它不靠修改训练策略或引入复杂的分布式方案,而是深入 CUDA 内核层面,通过RollingBuffer和算子融合技术,在不牺牲精度的前提下,实现了显存与速度的双重优化。

这并不是一次简单的“打补丁”式改进,而是一场针对 Transformer 架构执行模式的系统性重构。


从PyTorch的“默认行为”说起

标准 PyTorch 框架为了支持自动微分,会在前向传播过程中缓存大量中间结果——比如归一化后的输出、位置编码处理过的张量等。这些看似无害的操作,在深层模型和长序列场景下迅速累积成显存“黑洞”。

以 LLaMA 结构为例,每一层都会执行RMSNorm → Linear → RoPE → Attention这一系列操作。传统实现中,每个步骤都是独立的 PyTorch op,意味着:

  • 多次 kernel launch 开销;
  • 中间结果写回全局内存;
  • 反向传播时需保存所有激活值用于梯度计算。

而这正是性能流失的关键所在。

Liger-Kernel 的突破点就在于:把这些原本割裂的操作合并为一个高效的 fused kernel,并通过 RollingBuffer 动态管理序列状态,避免重复分配与复制


算子融合:不只是“合在一起”那么简单

你可能会问:“把几个算子拼起来就能提速?” 答案是——关键在于怎么“拼”。

Liger-Kernel 并非简单地将多个函数串行调用,而是使用 CUDA C++ 和 Triton 编写定制化内核,真正实现内存驻留式计算(in-register/in-cache processing)。例如:

apply_liger_kernel_to_llama( model, use_fused_rmsnorm=True, use_fused_rope=True, use_fused_cross_entropy=True, )

这一行代码背后发生了什么?

  • FusedRMSNorm + FusedRoPE:在一个 kernel 中完成归一化和旋转位置编码,避免将中间张量落盘;
  • FusedCrossEntropyLoss:跳过log_softmaxnll_loss的两步计算,直接在 loss 层融合 softmax 与负对数似然,节省约 30% 的时间;
  • 所有 fused 操作均保持与原生 PyTorch 数值一致,误差控制在1e-6范围内,确保训练稳定性。

更重要的是,这一切对用户完全透明。无需重写模型结构,也不用调整 optimizer 或 dataloader,只需加载模型后调用一行 patch 函数即可生效。


RollingBuffer:让KV Cache不再“无限膨胀”

如果说算子融合解决了“横向”开销问题,那么RollingBuffer就是对抗“纵向”显存增长的核心武器。

想象这样一个场景:你在做自回归生成,每生成一个 token 都需要将当前的 Key 和 Value 缓存起来供后续 attention 使用。传统的做法是不断torch.cat新旧 KV 张量,导致缓存大小随步数线性增长——生成 4096 个 token?那你的 KV Cache 至少要占下对应空间。

但现实是,很多注意力机制(如滑动窗口、局部注意力)根本不需要访问全部历史。于是问题来了:我们能不能只保留“有用”的上下文,而不是一味追加?

RollingBuffer 给出了答案:用固定大小的环形缓冲区代替动态增长的列表

它的逻辑非常简洁:

class RollingKVCache: def __init__(self, max_cache_len, num_heads, head_dim, dtype, device): self.k_cache = torch.zeros(max_cache_len, num_heads, head_dim, dtype=dtype, device=device) self.v_cache = torch.zeros_like(self.k_cache) self.current_pos = 0 self.max_cache_len = max_cache_len def update(self, new_k, new_v): pos = self.current_pos % self.max_cache_len self.k_cache[pos] = new_k.squeeze(0) self.v_cache[pos] = new_v.squeeze(0) self.current_pos += 1 # 返回有效范围内的完整缓存 end = min(self.current_pos, self.max_cache_len) return self.k_cache[:end], self.v_cache[:end]

这段代码虽然简短,却蕴含三个工程智慧:

  1. 零拷贝更新:没有cat、没有pad,新数据直接覆盖最老的位置;
  2. 恒定显存占用:无论生成多少 token,缓存始终是[max_cache_len, ...]大小;
  3. 天然适配偏移编码:配合 RoPE 的 position offset,可无缝支持 StreamingLLM、Longformer 等流式架构。

实际应用中,Liger-Kernel 的版本进一步优化了内存对齐、批量写入和非连续索引支持,使其能与 FlashAttention 内核高效协同。


性能实测:不只是理论上的“纸面优势”

抽象讲完,来看一组真实数据。

在 A10G(24GB 显存)上对 Qwen-7B 进行指令微调(sequence length=8192),对比启用 Liger-Kernel 前后的表现:

指标原生 PyTorch启用 Liger-Kernel提升
最大 batch size24↑ 100%
tokens/sec3,8504,700↑ 22%
峰值显存占用21.3 GB13.1 GB↓ 38%
训练稳定性偶发 OOM全程稳定

这意味着什么?你可以用一半的卡跑出接近原先的效果,或者在相同时间内完成两倍的数据迭代。对于中小企业或个人研究者而言,这是实实在在的成本节约。

再看另一个极端案例:在 LLaMA-3-8B 上进行 32k 长文本微调。未启用优化时,仅 forward 阶段就已触发 OOM;而开启 RollingBuffer 后,不仅顺利完成训练,反向传播也未出现梯度异常。


它为什么能在ms-swift生态中“无缝融入”?

Liger-Kernel 并非孤立存在,而是深度嵌入于ms-swift的整体架构之中,位于 PyTorch 之上、CUDA 之下,形成一条“静默加速链”:

+----------------------------+ | 用户训练脚本 | | (SFT, DPO, ORPO, etc.) | +-------------+--------------+ | +-------------v--------------+ | ms-swift 训练框架 | | (LoRA, QLoRA, PEFT 工具链) | +-------------+--------------+ | +-------------v--------------+ | Liger-Kernel (CUDA kernels)| | (Fused Ops + RollingBuffer) | +-------------+--------------+ | +-------------v--------------+ | PyTorch + CUDA RT | +------------------------------+

这个设计有几个精妙之处:

  • 兼容性优先:所有 fused 算子都继承自原始模块接口,forward signature 完全一致;
  • 按需启用:可通过参数开关单独控制 RMSNorm、RoPE、CE Loss 是否融合,便于调试;
  • 跨硬件适配:已在 T4、A10、A100、H100 等多种 NVIDIA GPU 上验证,未来计划扩展至 Ascend NPU;
  • 与量化共舞:可与 QLoRA、GaLore 等低秩优化方法叠加使用,实现“复合加速”。

换句话说,你可以在已经使用 LoRA 微调的基础上,再叠加 Liger-Kernel 的底层加速,获得额外 20%+ 的吞吐提升,而无需任何代码重构。


实际痛点解决:不只是“快一点”,而是“能做成”

我们常谈性能优化,但真正有价值的技术,不是让你“跑得更快”,而是让你“原本做不到的事现在可以做到”。

Liger-Kernel 正是如此。它解决了几个典型的工程困境:

场景传统限制Liger-Kernel 解法
长文本摘要微调sequence > 8k 即 OOMRollingBuffer 支持稳定训练至 32k+
小显存设备部署batch=1 都难以运行显存降低 40%,允许更大 batch 推理
流式对话生成KV Cache 持续膨胀固定大小缓存 + 自动覆盖,支持无限轮次
多卡训练扩展性差单卡慢导致通信等待单卡提速间接提升整体并行效率

特别是在边缘设备或云上竞价实例中,这类轻量级、高性价比的优化尤为关键。一位社区开发者曾反馈:“以前在 T4 上训 Qwen-1.8B,batch size 只敢设 1;现在上了 Liger-Kernel,直接提到 4,实验周期缩短了近 70%。”


设计哲学:克制的优化,才是可持续的优化

值得一提的是,Liger-Kernel 并没有追求“极致激进”的优化手段。它的设计理念可以用四个词概括:

  • 精准打击:只优化那些高频、高开销的核心算子(RMSNorm、RoPE、CE Loss),不做无谓改动;
  • 数值安全:所有 fused kernel 经过严格测试,保证与原生实现误差 <1e-6,防止梯度漂移;
  • 渐进式集成:通过 monkey patch 注入,不影响原有模型结构,升级降级方便;
  • 可观测性强:提供 debug flag,可关闭特定 fusion 功能进行 AB 测试。

这种“克制”反而让它更具生命力。相比一些需要彻底重构模型或依赖特定编译器的方案,Liger-Kernel 更像是一个“即插即用”的性能插件,适合快速落地。


写在最后:底层创新,才是大模型普惠的基石

如今,人人都在谈论大模型的能力边界,但我们不能忽视支撑这些能力的基础设施。像 Liger-Kernel 这样的底层优化,或许不像新架构或新算法那样引人注目,但它却是让更多人“用得起、训得出、推得动”的关键一环。

它让我们看到:即使不拥有千卡集群,也能通过精细化的工程优化,在有限资源下完成高质量的模型迭代。而这,正是开源社区推动技术民主化的真正意义所在。

随着 ms-swift 不断整合更多高效组件,Liger-Kernel 也在持续演进——未来或将支持动态 shape fusion、混合精度感知调度、以及与 vLLM/vision encoder 的协同优化。可以预见,这条“从算子到系统”的全栈提效路径,将成为大模型时代不可或缺的技术底座。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/1 14:19:53

A100集群搭建建议:适用于百B级模型训练

A100集群搭建建议&#xff1a;适用于百B级模型训练 在大模型时代&#xff0c;当一个72B参数的Qwen或LLaMA-3模型需要完成微调任务时&#xff0c;工程师面对的早已不是“能不能跑起来”的问题&#xff0c;而是“如何在有限资源下高效、稳定地完成训练”。传统单卡训练已完全无法…

作者头像 李华
网站建设 2026/1/1 14:19:10

C语言构建量子门系统全流程解析(含完整源码与性能调优秘籍)

第一章&#xff1a;C语言量子模拟系统概述C语言因其高效的内存控制与底层硬件交互能力&#xff0c;成为构建高性能科学计算系统的重要工具。在量子计算研究领域&#xff0c;尽管真实量子计算机尚未普及&#xff0c;但基于经典计算机的量子模拟系统已成为算法验证与教学演示的核…

作者头像 李华
网站建设 2026/1/1 14:18:42

PaLM-E扩展尝试:机器人感知与决策

PaLM-E扩展尝试&#xff1a;机器人感知与决策 在智能机器人从实验室走向真实世界的今天&#xff0c;一个核心难题始终存在&#xff1a;如何让机器真正“理解”环境并做出合理决策&#xff1f;传统的做法是将感知、规划、控制拆分为独立模块&#xff0c;通过预定义规则或轻量模型…

作者头像 李华
网站建设 2026/1/1 14:17:05

ORPO逆向正则化偏好优化:提升负样本利用率

ORPO逆向正则化偏好优化&#xff1a;提升负样本利用率 在当前大语言模型的对齐训练中&#xff0c;一个核心矛盾日益凸显&#xff1a;我们拥有越来越多标注精良的偏好数据&#xff0c;但其中的信息却并未被充分挖掘。尤其是那些被标记为“拒绝”的负样本&#xff0c;在多数主流方…

作者头像 李华
网站建设 2026/1/1 14:15:15

EETQ企业加密量化:保护模型知识产权的新方案

EETQ企业加密量化&#xff1a;保护模型知识产权的新方案 在AI产业化加速落地的今天&#xff0c;一个现实问题正困扰着越来越多的企业——我们花了数百万训练出的大模型&#xff0c;一旦交付给客户或部署到边缘设备&#xff0c;就可能被复制、篡改甚至转卖。这不仅是经济损失&am…

作者头像 李华
网站建设 2026/1/1 14:13:53

云上多机训练成本估算:按小时计费的经济模型

云上多机训练成本估算&#xff1a;按小时计费的经济模型 在大模型时代&#xff0c;一个70亿参数的语言模型微调任务&#xff0c;曾经可能需要动用整支工程团队数周时间部署环境、调试分布式策略、解决显存溢出问题——而现在&#xff0c;只需一条命令、一份配置文件&#xff0c…

作者头像 李华