news 2026/4/18 7:37:34

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/11 0:24:10

插件化扩展机制详解:如何添加自定义loss和metric函数?

插件化扩展机制详解&#xff1a;如何添加自定义loss和metric函数 在大模型研发日益普及的今天&#xff0c;训练框架早已超越“跑通代码”的初级阶段&#xff0c;逐渐演变为支撑多任务、多场景、高灵活性的工程中枢。无论是推荐系统中的排序优化&#xff0c;还是医疗文本中的细…

作者头像 李华
网站建设 2026/4/8 16:05:24

Elasticsearch全文检索:快速查找海量模型文档资料

Elasticsearch 全文检索&#xff1a;快速查找海量模型文档资料 在当今 AI 技术飞速发展的背景下&#xff0c;大模型的迭代速度已经远超传统软件系统的演进节奏。一个开发者今天想尝试训练一个多模态对话系统&#xff0c;明天可能就要评估 LoRA 微调对特定数据集的效果——而在这…

作者头像 李华
网站建设 2026/4/18 2:57:32

Flutter跨平台应用:集成大模型能力打造智能移动App

Flutter跨平台应用&#xff1a;集成大模型能力打造智能移动App 在智能手机性能日益强大的今天&#xff0c;用户早已不满足于简单的信息查询或基础交互。他们期待的是能“听懂”复杂指令的语音助手、能“看懂”照片内容的相册管家、甚至能“理解”情绪变化的情感陪伴者。这些需…

作者头像 李华
网站建设 2026/4/14 7:52:20

Smart Contract智能合约:自动执行模型交易与授权

Smart Contract智能合约&#xff1a;自动执行模型交易与授权 在大模型研发日益复杂的今天&#xff0c;一个70亿参数的模型微调任务&#xff0c;可能需要开发者面对上百个配置选项、数种硬件平台选择、多种训练策略权衡。传统流程中&#xff0c;从下载权重到部署上线&#xff0c…

作者头像 李华
网站建设 2026/4/10 19:19:04

rchtxchs.dll文件损坏丢失找不到 打不开程序 下载方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/18 3:42:03

FSDP分布式训练实战:在多节点环境中高效扩展模型规模

FSDP分布式训练实战&#xff1a;在多节点环境中高效扩展模型规模 在当前大模型参数量动辄上百亿甚至千亿的背景下&#xff0c;单卡训练早已无法满足显存和计算需求。面对 Qwen-72B、LLaMA-65B 这类庞然大物&#xff0c;如何在有限的 A100 集群上完成微调任务&#xff1f;这不仅…

作者头像 李华