llama.cpp 社区分支实现运行时跳过 Transformer 层
开发者为 llama.cpp 引入 --skip-layers 标志,可在加载时跳过整层 Transformer 块,并…
- 重要性
- 42
- 新颖性
- 52
- 影响面
- 35
- 可信度
- 55
- 实质性
- 48
一位社区开发者近日在 llama.cpp 的个人分支中实现了一个名为 --skip-layers 的加载期选项,允许在推理时直接跳过指定的整层 Transformer 块。作者表示,这一思路参考了近期几篇相关论文,并将其作为 llama.cpp fork 的实验性功能开源,同时在 Substack 发布了完整的技术说明与对比数据。
实现思路:把「烘焙式剪枝」搬到运行时
作者指出,静态的「烘焙式」层剪枝(bake-time pruning)早已存在,例如 llama.cpp 自带的 --prune-layers 选项,以及 mergekit 的 passthrough 等方案。这些做法会在模型文件层面删减权重,得到一个更小的最终模型。
- --skip-layers 的不同之处在于「运行时」生效:被跳过的层在加载阶段就不被实例化(never instantiates),因此推理时不会进入这些块。
- 它不需要先生成一个剪枝后的权重文件,适合临时实验或在多份配置之间快速切换。
- 由于灵感来自已有的静态剪枝研究,作者将其定位为同一思路的运行时版本。
选择机制:跳过哪些层「量级差异巨大」
作者特别强调一个经验性结论:跳过哪几层对结果的影响在数量级上差异显著,因此不能简单地均匀剪枝。为此,他在功能中内置了一个「选择器机制(selector mechanism)」,帮助用户在跳过层数与效果之间做权衡。具体的最优层组合、benchmark 数字与失败案例,均在 Substack 写明的 writeup 中给出。
上游合并与社区协作
功能目前托管在作者的 llama.cpp 分支仓库中,作者坦言自己无力完成向 llama.cpp 上游合并所需的完整流程:包括先发起讨论、提交 feature request、再面对规模庞大的 PR 队列(他提到上游积压约 1.1K 个 PR)。因此他在帖子中向社区征集方案:是继续以独立分支维护、移交给有精力推进的人,还是以 co-maintainer 形式与上游同步更新。
试用与验证建议
作者鼓励读者在自己常用的模型与硬件上进行 PPL(困惑度)或生成质量验证(generation sanity-check),以补充他未覆盖到的配置组合。代码与写明的链接如下:
- 写明(Substack):open.substack.com/pub/itayinbarr/p/you-can-skip-llm-layers-at-runtime
- 代码分支(GitHub):github.com/itayinbarr/llama.cpp
需要注意的是,截至目前该功能仍以社区 fork 形式存在,尚未进入 llama.cpp 上游主线,稳定性与兼容性仍需更多验证。
