无需训练!复制LLM参数层突破推理瓶颈
研究发现在24B模型中复制3层参数,逻辑推理能力从22%跃升至76%,是廉价优化LLM的启发。
完整中文译文
复制 3 个层。无需训练。逻辑推理从 0.22 → 0.76。
这个工具包发现并利用隐藏在 transformer 模型内部的"推理电路"。核心思想:某些连续的层块作为不可分割的认知单元发挥作用。在前向传播中复制它们 — 权重相同,无需训练,无需合并 — 模型在特定能力上就会获得可测量的性能提升。
基于 David Ng 的 RYS 方法构建,并扩展了新发现。这里的所有内容都是在两块 AMD 消费级 GPU(RX 7900 XT + RX 6950 XT)上花一个晚上发现的。
Devstral-Small-2-24B:层 12、13、14 复制一次
我在 Vast.ai 的 H200 实例上运行了完整的测试,对比了 devstral 基础模型和手术修改后的模型,结果如下:手术确实在做一些真实且具体的事情:它提升了数学推理和因果推理,但代价是指令跟随和代码生成能力下降。模型思考更深入但按指示的精准度较低。
在 results 文件夹中你可以看到 eval_base 和 eval_surgery 下的结果。我还在仓库中添加了 vastai_rys_eval.sh,这是在 Vast.ai 中运行整个流程的脚本。Vast.ai 实例通过以下方式创建:
vastai create instance somenumberhere --image vastai/base-image:cuda-12.8.1-cudnn-devel-ubuntu22.04 --disk 80 --direct --ssh
=================================================================================
lm_eval Results Comparison
=================================================================================
Metric base rys_12_15 Δ(last-first)
---------------------------------------------------------------------------------
bbh/causal_judgement [exact_match] 0.5775 0.6364 +0.0588
bbh/date_understanding [exact_match] 0.9440 0.9000 -0.0440
bbh/logical_deduction_five_objects [exact_match] 0.7440 0.7320 -0.0120
bbh/navigate [exact_match] 0.9600 0.9440 -0.0160
gsm8k_cot [flexible-extract] 0.8650 0.8787 +0.0136
gsm8k_cot [strict-match] 0.8408 0.8704 +0.0296
ifeval [inst_level_loose_acc] 0.7446 0.7206 -0.0240
ifeval [inst_level_strict_acc] 0.6990 0.6595 -0.0396
ifeval [prompt_level_loose_acc] 0.6728 0.6488 -0.0240
ifeval [prompt_level_strict_acc] 0.6229 0.5767 -0.0462
mbpp [pass_at_1] 0.7000 0.6700 -0.0300
=================================================================================
Average (all metrics) 0.7610 0.7488 -0.0122
Qwen2.5-Coder-32B:层 7、8、9 复制一次
在定制探针套件上测量(BBH 衍生 + EQ-Bench 风格 + GSM8K):
推理电路原理
Transformer 在训练期间将自己组织成功能电路 — 执行完整认知操作的多层处理单元。这些电路是不可分割的:复制单个层几乎没有效果,但复制正确的 3-4 层块会给模型的推理管道一个第二遍。
不同模型在不同位置有不同的电路:
- Devstral-24B(40 层):推理电路在层 12-14
- Qwen2.5-32B(64 层):推理电路在层 7-9
边界很清晰。沿任一方向移动块一层,改进就会消失或反转。
"模式"发现
不同的复制模式从相同权重创建不同的认知配置:
相同的磁盘权重。基础模型相同的 VRAM。只是不同的路由。
在你的模型中查找电路
pip install gguf requests tqdm
python sweep.py \
--model /path/to/model.gguf \
--llama-server /path/to/llama-server \
--tmpdir /dev/shm/rys \
--results pass.jsonl \
--block-sizes 3 4 5 \
--stride 1 \
--start-min 10 --start-max 20 \
--skip-baseline \
--port 8099 \
--server-args --device Vulkan1,Vulkan2
应用已知电路
# Duplicate layers 12-14 in Devstral (the result validated above)
python layer_path.py model.gguf improved.gguf \
-p "0..14,12,13,14,15..39" -v
# Duplicate layers 7-9 in Qwen2.5-32B
python layer_path.py model.gguf improved.gguf \
-p "0..9,7,8,9,10..63" -v
# Go wild: triple-pass, interleaved, skip layers, whatever you want
python layer_path.py model.gguf experiment.gguf \
-p "0..16,13,14,15,16,13,14,15,16,17..39" -v
使用已建立的基准进行验证
# Start the server with modified model
llama-server -m improved.gguf --port 8089 -ngl 99 --device Vulkan1,Vulkan2
# Run lm-evaluation-harness
lm_eval --model local-chat-completions \
--model_args model=test,base_url=http://localhost:8089/v1/chat/completions,num_concurrent=1,max_retries=3,tokenized_requests=False \
--tasks gsm8k_cot,ifeval,mbpp,bbh_cot_fewshot_logical_deduction_five_objects \
--apply_chat_template --limit 50 \
--output_path ./eval_results
# Compare runs
python compare_eval.py ./eval_base ./eval_improved
工作流程
对于每个层配置 (i, j):
- GGUF 手术创建一个模型,其中层 i..j-1 被物理复制
- 新的前向传播:层 0..j-1 → 层 i..j-1 再来一遍 → 层 j..N-1
- llama-server 加载修改后的模型
- 三个探针套件运行:数学、EQ、推理(BBH 衍生)
- 将分数与基线进行比较,结果实时打印
- 服务器关闭,修改后的 GGUF 删除,进行下一个配置
搜索策略
- 第 1 遍:大块(8 层),宽步幅 → 找到热区
- 第 2 遍:小块(3-5 层),步幅为 1,在热区内 → 找到精确边界
- 第 3 遍:尝试多遍、交错和复合配置
修改后的 GGUF 被写入 tmpfs(/dev/shm)并在每次测试后删除。基础模型权重保留在磁盘上。
需求
- 构建好 llama.cpp 的 Linux 系统(CPU、CUDA、Vulkan 或 Metal)
- Python 3.10+ 与 gguf、requests、tqdm
- 足够的 VRAM/RAM 来运行模型 + 一些额外的重复层
可选:用于基准验证的 lm-eval,用于热力图绘制的 matplotlib
常见问题
这会使用更多 VRAM 吗?
会的,重复的层在 GGUF 中是物理副本。对于 24B 模型的 3 个额外层,预计会增加约 1.5 GiB。llama.cpp 前向传播补丁(使用指针而不是副本)会消除这个问题 — 欢迎贡献。
这会减慢推理速度吗?
会的,与额外层数成比例。40 层模型上 3 个额外层 = 约 7.5% 更慢。推理改进值得这个代价。
这会在我的模型上工作吗?
可能会。我们在 Mistral 架构(Devstral)和 Qwen2 架构上进行了测试。Ng 的原始工作是在 Qwen2-72B 上进行的。电路存在于所有 transformer 模型中 — 问题只是它们在哪里以及有多大。运行扫描并找出来。
为什么不微调呢?
这与微调是正交的。你可以同时做两者。实际上,Ng 的 RYS 模型后来被其他人微调,并在 HuggingFace 排行榜上名列前茅。层复制改变了架构;微调改变了权重。堆叠它们。
致谢
- David Ng 提出了 RYS 方法以及 transformer 具有功能性神经解剖的见解
- llama.cpp 使本地推理成为可能
- lm-evaluation-harness 进行基准验证