研究发现在24B模型中复制3层参数,逻辑推理能力从22%跃升至76%,是廉价优化LLM的启发。
这个工具包发现并利用隐藏在 transformer 模型内部的"推理电路"。核心思想:某些连续的层块作为不可分割的认知单元发挥作用。在前向传播中复制它们 — 权重相同,无需训练,无需合并 — 模型在特定能力上就会获得可测量的性能提升。
基于 David Ng 的 RYS 方法构建,并扩展了新发现。这里的所有内容都是在两块 AMD 消费级 GPU(RX 7900 XT + RX 6950 XT)上花一个晚上发现的。
我在 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
在定制探针套件上测量(BBH 衍生 + EQ-Bench 风格 + GSM8K):
Transformer 在训练期间将自己组织成功能电路 — 执行完整认知操作的多层处理单元。这些电路是不可分割的:复制单个层几乎没有效果,但复制正确的 3-4 层块会给模型的推理管道一个第二遍。
不同模型在不同位置有不同的电路:
边界很清晰。沿任一方向移动块一层,改进就会消失或反转。
不同的复制模式从相同权重创建不同的认知配置:
相同的磁盘权重。基础模型相同的 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 被写入 tmpfs(/dev/shm)并在每次测试后删除。基础模型权重保留在磁盘上。
可选:用于基准验证的 lm-eval,用于热力图绘制的 matplotlib
会的,重复的层在 GGUF 中是物理副本。对于 24B 模型的 3 个额外层,预计会增加约 1.5 GiB。llama.cpp 前向传播补丁(使用指针而不是副本)会消除这个问题 — 欢迎贡献。
会的,与额外层数成比例。40 层模型上 3 个额外层 = 约 7.5% 更慢。推理改进值得这个代价。
可能会。我们在 Mistral 架构(Devstral)和 Qwen2 架构上进行了测试。Ng 的原始工作是在 Qwen2-72B 上进行的。电路存在于所有 transformer 模型中 — 问题只是它们在哪里以及有多大。运行扫描并找出来。
这与微调是正交的。你可以同时做两者。实际上,Ng 的 RYS 模型后来被其他人微调,并在 HuggingFace 排行榜上名列前茅。层复制改变了架构;微调改变了权重。堆叠它们。