news 2026/4/15 7:43:41

Liger-Kernel底层优化:新一代内核级推理加速引擎介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Liger-Kernel底层优化:新一代内核级推理加速引擎介绍

Liger-Kernel底层优化:新一代内核级推理加速引擎深度解析

在大模型部署日益普及的今天,一个看似简单的“问答”背后,往往隐藏着数百亿参数的复杂计算。当用户期望秒级响应时,系统却可能因频繁的GPU调度和内存瓶颈而卡顿——这正是当前LLM服务化过程中最真实的痛点之一。

面对这一挑战,业界已有不少优化方案:vLLM通过PagedAttention管理KV缓存,SGLang实现连续批处理提升吞吐,LmDeploy提供高效的推理后端支持。但这些努力大多集中在框架层或调度逻辑上,很少有人真正“下探”到CUDA内核层面去重构执行流程。

直到Liger-Kernel的出现。

它不是另一个推理服务器,也不是某种新的并行策略,而是一种直接作用于GPU执行单元的底层算子融合技术。它的目标很明确:把Transformer中那些被反复调用的小算子——RMSNorm、RoPE、QKV投影、MLP——全部“焊”进同一个CUDA Kernel里,在SM内部一口气完成计算,只在输入输出时触碰HBM。

这种做法听起来激进,实则精准击中了现代GPU架构的核心瓶颈:Kernel Launch开销显存带宽限制


以Llama类模型为例,标准PyTorch流程中一个Decoder Layer的前向传播包含多个独立操作:

x = rms_norm(x) q, k, v = proj_qkv(x) q = apply_rope(q, pos_emb) k = apply_rope(k, pos_emb) attn_out = scaled_dot_product_attention(q, k, v) out1 = x + attn_out h = rms_norm(out1) ffn_out = mlp(h) out2 = out1 + ffn_out

每一步都对应一次CUDA Kernel启动,并伴随至少一次全局内存读写。即使每个操作本身高效,累积起来也会造成严重的性能浪费:大量时间花在等待调度和搬运数据上,而非真正的计算。

Liger-Kernel的思路是打破这种“碎片化”执行模式。它将上述链条中的多个步骤合并为单一内核,比如:

  • Fused RMSNorm + QKV Projection + RoPE
  • Fused MLP with SwiGLU activation
  • Fused Attention with KV Cache handling

这些融合后的Kernel在Streaming Multiprocessor(SM)内部完成所有中间计算,利用寄存器或Shared Memory暂存临时值,仅在最终结果生成时才写回HBM。这样一来,原本需要6~8次Kernel调用的操作,现在只需1~2次即可完成。

实际测试表明,在Llama-3-8B模型上启用Liger-Kernel后:
- 吞吐量提升35%–50%
- 首Token延迟下降约20%
- 显存访问频次减少60%以上
尤其在长上下文(>8k tokens)场景下,优势更为显著。


为什么融合能带来如此大的收益?

我们可以从两个维度理解其本质价值:

1. 减少Kernel Launch开销

现代GPU虽然拥有数千个核心,但每次启动Kernel都有不可忽视的CPU-GPU通信成本。对于小规模算子(如RMSNorm),其计算本身可能只需几微秒,但Launch过程却占用了相当比例的时间。

更糟糕的是,频繁的小Kernel会导致SM利用率低下,出现“忙等”现象——GPU明明空闲,却因为没有足够任务被打包而无法满载运行。

Liger-Kernel通过融合策略显著降低了Kernel数量。例如在一个典型Decoder Layer中,原始流程可能触发7次以上独立Kernel调用,而融合后可压缩至2~3次,极大提升了GPU Occupancy。

2. 缓解HBM带宽压力

高带宽内存(HBM)是当前AI训练/推理的主要瓶颈之一。尽管A100/H100提供了高达2TB/s的理论带宽,但在实际应用中,由于中间激活值频繁读写,有效带宽往往只能达到峰值的30%~50%。

算子融合的本质是提高数据局部性。原本需要写入HBM再读出的中间结果(如归一化后的x、投影后的q/k/v),现在可以直接在Register或L1 Cache中传递,避免不必要的往返。

举个直观的例子:假设你做饭要切菜、炒菜、调味、装盘。传统方式是你每做完一步就离开厨房去客厅放一下盘子,然后再回来继续;而融合的方式则是全程待在灶台边,工具就在手边,动作连贯一气呵成——效率自然高出一大截。


如何使用?真的能做到“零侵入”吗?

这是很多人关心的问题:是否需要重写模型代码?是否必须掌握CUDA编程?

答案是:完全不需要

Liger-Kernel通过monkey-patch机制实现了对PyTorch原生函数的动态替换。它会在运行时检测模型结构,一旦发现匹配的模块序列(如rms_norm → linear → rotary_emb),就会自动将其指向预编译的融合Kernel。

在ms-swift框架中,启用方式极其简单:

from swift import Swift, LoRAConfig from transformers import AutoModelForCausalLM import torch # 定义LoRA配置并开启Liger-Kernel lora_config = LoRAConfig( r=64, target_modules=['q_proj', 'k_proj', 'v_proj', 'o_proj'], lora_alpha=16, lora_dropout=0.1, use_liger_kernel=True # ✅ 只需这一行 ) # 加载模型并注入LoRA model = AutoModelForCausalLM.from_pretrained("qwen/Qwen-7B", torch_dtype=torch.bfloat16) lora_model = Swift.prepare_model(model, lora_config) # 正常推理,无需任何改动 outputs = lora_model(input_ids=input_ids)

整个过程对用户透明。如果当前设备不支持(如非NVIDIA GPU或CUDA环境缺失),框架会自动降级回原始PyTorch实现,保证功能正确性。


融合内核是如何工作的?来看一段简化版实现

下面是一个融合RMSNorm + QKV Projection + RoPE的CUDA Kernel伪代码示例:

__global__ void fused_rms_norm_qkv_rope_forward( const float* __restrict__ x, const float* __restrict__ weight, const float* __restrict__ q_weight, const float* __restrict__ k_weight, const float* __restrict__ v_weight, const float* __restrict__ q_bias, const float* __restrict__ k_bias, const float* __restrict__ v_bias, float* __restrict__ q_out, float* __restrict__ k_out, float* __restrict__ v_out, const float* __restrict__ cos, const float* __restrict__ sin, int hidden_size, int head_dim, int seq_len ) { int tid = blockIdx.x * blockDim.x + threadIdx.x; if (tid >= seq_len * head_dim) return; int seq_idx = tid / head_dim; int feat_idx = tid % head_dim; // Step 1: RMSNorm —— 在片上完成 float sum_sq = 0.0f; for (int i = 0; i < hidden_size; ++i) { float val = x[seq_idx * hidden_size + i]; sum_sq += val * val; } float inv_rms = rsqrt(sum_sq / hidden_size + 1e-6); float norm_val = x[seq_idx * hidden_size + feat_idx] * inv_rms * weight[feat_idx]; // Step 2: QKV Projection float q_val = 0, k_val = 0, v_val = 0; for (int i = 0; i < hidden_size; ++i) { float w_q = q_weight[feat_idx * hidden_size + i]; float w_k = k_weight[feat_idx * hidden_size + i]; float w_v = v_weight[feat_idx * hidden_size + i]; float x_i = x[seq_idx * hidden_size + i] * inv_rms * weight[i]; q_val += x_i * w_q; k_val += x_i * w_k; v_val += x_i * w_v; } q_val += q_bias[feat_idx]; k_val += k_bias[feat_idx]; v_val += v_bias[feat_idx]; // Step 3: Apply RoPE (旋转位置编码) int rot_offset = feat_idx % (head_dim / 2); float cos_val = cos[rot_offset], sin_val = sin[rot_offset]; // 假设k_val和v_val分别代表实部与虚部 float k_rot_real = k_val * cos_val + v_val * sin_val; float k_rot_imag = -k_val * sin_val + v_val * cos_val; // 输出 q_out[tid] = q_val; k_out[tid] = k_rot_real; v_out[tid] = k_rot_imag; }

说明
- 所有中间变量均在寄存器中计算,未落盘。
- 实际实现采用模板化设计,支持FP16/BF16混合精度、Tensor Core加速、Warp Matrix Multiply等高级特性。
- 使用#pragma unroll展开循环,进一步提升指令级并行度。

这类内核经过高度优化,能够在A10/A100/H100等设备上接近理论FLOPS上限运行。


它适用于哪些模型?是否兼容主流架构?

目前Liger-Kernel已成功适配以下主流Decoder-only模型:

模型系列支持情况
Llama / Llama-2 / Llama-3✅ 完全支持
Qwen-1.5 / Qwen-2✅ 已验证
ChatGLM / GLM-4✅ 部分融合可用
Phi-3-mini / Phi-3-medium✅ 支持

关键组件覆盖包括:
- RMSNorm(替代LayerNorm)
- RoPE(Rotary Position Embedding)
- SwiGLU门控激活函数
- 标准MLP结构(up_proj/gate_proj/down_proj)

据估算,该技术可覆盖市面上90%以上的开源大模型结构。只要模型遵循标准Transformer Block设计,基本都能从中受益。

更重要的是,它不仅用于推理,也能在LoRA/QLoRA微调阶段发挥作用。即便只更新少量参数,前向传播仍需完整执行主干网络。Liger-Kernel优化了这部分路径,使得轻量微调也能享受底层加速红利。


系统集成视角:它在整个AI栈中处于什么位置?

Liger-Kernel位于AI系统栈的算子执行层,介于PyTorch前端与CUDA驱动之间:

+----------------------------+ | Application | ← 用户脚本(训练/推理) +----------------------------+ | PyTorch Frontend | ← Autograd, Module, Tensor API +----------------------------+ | Liger-Kernel Hook | ← Monkey-patch入口,条件启用融合内核 +----------------------------+ | Fused CUDA Kernels | ← RMSNorm+QKV+RoPE, MLP等融合实现 +----------------------------+ | CUDA Driver | +----------------------------+ | GPU | ← A10/A100/H100等支持设备

它与vLLM、SGLang等高层推理引擎形成互补关系:

  • vLLM/SGLang/LmDeploy:专注请求调度与批处理优化,解决“如何让更多请求并发”的问题。
  • Liger-Kernel:专注单Query计算效率,解决“如何让每一次计算更快”的问题。

两者完全可以协同工作:在Liger-Kernel提升单Token计算速度的基础上,由vLLM进行Continuous Batching调度,从而实现整体吞吐最大化。

这也意味着,你可以同时启用多种优化手段,构建高性能、高性价比的大模型服务平台。


实践建议与注意事项

虽然Liger-Kernel使用便捷,但在工程落地时仍需注意以下几点:

1. 硬件依赖性强
  • 必须使用NVIDIA GPU,且Compute Capability ≥ 7.5(即Turing架构及以上)。
  • 推荐A10/A100/H100等具备高HBM带宽与Tensor Core的设备。
  • 不支持AMD ROCm或Apple Metal。
2. 模型结构兼容性
  • 自定义模型若含有非常规连接(如跳跃连接、动态路由、非标准归一化),可能无法触发融合。
  • 建议优先选用Llama、Qwen等标准化架构。
3. 调试难度增加
  • 融合Kernel报错时堆栈信息较难定位,建议先在use_liger_kernel=False模式下验证功能正确性,再开启优化。
  • 可借助Nsight Systems观测Kernel Launch频率与HBM带宽使用情况,验证优化效果。
4. 编译与部署打包
  • Liger-Kernel需提前编译为.so文件,部署时应确保CUDA版本一致。
  • 推荐使用Docker镜像统一运行时依赖,避免环境差异导致失效。

展望未来:向下挖潜的技术方向正在成为主流

Liger-Kernel的出现,标志着大模型工具链正从“可用”迈向“极致性能”。它代表了一种清晰的技术演进方向:从高层调度走向底层硬件细节

过去我们习惯于在Python层做抽象、封装、调度;而现在,越来越多的团队开始重新审视CUDA层面的执行效率,尝试通过算子融合、内核定制、内存布局优化等方式榨干每一瓦特算力。

类似的趋势也在其他项目中显现:
- FlashAttention 将Attention计算重写为IO-aware Kernel
- Triton 提供Python风格的Kernel编程接口
- DeepSpeed Kernel 优化Embedding、LayerNorm等基础组件

Liger-Kernel正是这一浪潮中的重要一环。未来随着更多算子被纳入融合范围(如FlashAttention-3级别的全链路整合),以及对国产NPU(如昇腾)的支持拓展,这类底层优化有望成为大模型基础设施的标准配置。


这种高度集成的设计思路,正引领着智能音频设备向更可靠、更高效的方向演进。

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

AI开发者必看:如何用ms-swift完成DPO人类对齐训练

AI开发者必看&#xff1a;如何用ms-swift完成DPO人类对齐训练 在大模型落地日益加速的今天&#xff0c;一个现实问题摆在每一位AI工程师面前&#xff1a;我们能让模型“听懂人话”&#xff0c;但如何让它“做对的事”&#xff1f;预训练赋予了模型广博的知识&#xff0c;微调提…

作者头像 李华
网站建设 2026/4/11 5:31:49

Linux服务器部署手册:CentOS/RHEL/Ubuntu系统兼容性说明

Linux服务器部署实践&#xff1a;ms-swift在CentOS/RHEL/Ubuntu中的无缝运行之道 如今&#xff0c;越来越多企业选择在本地或云端Linux服务器上部署大规模语言模型与多模态系统。但现实往往并不理想——明明在测试机上跑通的脚本&#xff0c;换到生产环境却频频报错&#xff1b…

作者头像 李华
网站建设 2026/4/14 15:59:40

FaceID解锁模型仓库:个人开发者隐私保护新方式

FaceID解锁模型仓库&#xff1a;个人开发者隐私保护新方式 在大模型时代&#xff0c;一个普通开发者想微调一次 Qwen-7B 或 LLaMA-3&#xff0c;往往要面对这样的困境&#xff1a;从哪里下载&#xff1f;怎么配置环境&#xff1f;显存不够怎么办&#xff1f;训练时数据会不会被…

作者头像 李华
网站建设 2026/4/1 3:58:26

Zapier工作流集成:当收到邮件附件时自动启动DDColor处理

Zapier工作流集成&#xff1a;当收到邮件附件时自动启动DDColor处理 在家庭相册里泛黄的老照片、档案馆中尘封的黑白影像&#xff0c;正越来越多地被数字化。但将这些图像还原为生动色彩的过程&#xff0c;往往卡在“最后一公里”——用户懂技术的不会用AI工具&#xff0c;会发…

作者头像 李华
网站建设 2026/4/14 5:41:49

LmDeploy部署最佳实践:生产环境中稳定性与性能兼顾

LmDeploy部署最佳实践&#xff1a;生产环境中稳定性与性能兼顾 在大模型落地日益加速的今天&#xff0c;一个常见的现实是&#xff1a;训练好的模型往往卡在“最后一公里”——如何稳定、高效地部署到线上服务&#xff1f;许多团队经历过这样的场景&#xff1a;本地测试效果惊艳…

作者头像 李华
网站建设 2026/4/8 19:52:59

Megatron并行加速实战:200+纯文本模型训练效率翻倍

Megatron并行加速实战&#xff1a;200纯文本模型训练效率翻倍 在当前大语言模型&#xff08;LLM&#xff09;参数动辄上百亿甚至数千亿的背景下&#xff0c;单卡训练早已成为“不可能完成的任务”。显存墙、计算瓶颈、通信开销——这些难题像一座座高山横亘在研发者面前。如何让…

作者头像 李华