我复现了 Ng 的 RYS 方法,并发现:在 Qwen2.5-32B 中复制 3 个特定层可提升推理能力 17%,在 Devstral-24B 中复制 12-14 层可将逻辑推理从 0.22 提升至 0.76(BBH 基准)——无需训练,无需调整权重,只需将隐藏状态两次经过同一电路。工具已包含。两块 AMD GPU,一个晚上。
复制 3 个层。无需训练。逻辑推理从 ~0.22 提升至 0.76。
该工具包用于发现并利用 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 上运行整套流程的脚本。 vastai 实例通过以下命令创建:
vastai create instance somenumberhere --image vastai/base-image:cuda-12.8.1-cudnn-devel-ubuntu22.04 --disk 80 --direct --ssh
=================================================================================
lm_eval 结果比较
=================================================================================
指标 base rys_12_15 Δ(末-首)
---------------------------------------------------------------------------------
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
=================================================================================
平均(所有指标) 0.7610 0.7488 -0.0122
自定义探针套件(源自BBH + EQ-Bench风格 + GSM8K)测量结果:
| 探针 | 基础版 | +3层 | 变化 |
|---|---|---|---|
| 推理(因果+逻辑+导航) | 76.5% | 94.1% | +23% |
| 情商 | 92.1 | 93.6 | +1.6% |
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
# 在 Devstral 中复制层 12-14(上述已验证的结果)
python layer_path.py model.gguf improved.gguf \
-p "0..14,12,13,14,15..39" -v
# 在 Qwen2.5-32B 中复制层 7-9
python layer_path.py model.gguf improved.gguf \
-p "0..9,7,8,9,10..63" -v
# 尽情尝试:三次经过、交错、跳过层等任意组合
python layer_path.py model.gguf experiment.gguf \
-p "0..16,13,14,15,16,13,14,15,16,17..39" -v
# 启动修改后模型的服务器
llama-server -m improved.gguf --port 8089 -ngl 99 --device Vulkan1,Vulkan2
# 运行 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
# 比较运行结果
python compare_eval.py ./eval_base ./eval_improved
对于每个层配置 (i, j):
layers 0..j-1 → layers i..j-1 again → layers j..N-1搜索策略:
修改后的 GGUF 写入 tmpfs (/dev/shm),每次测试后删除。基础模型权重保留在磁盘上。
gguf、requests、tqdmlm-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 排行榜的榜首。层复制改变架构;微调改变权重。叠加使用。
MIT
| 模式 | 数学 | 情商 | 性格 |
|---|
| 双次经过 13-16 | ↑↑ | ↑ | 数学专精 |
| 三次经过 13-16 | ↑ | ↑↑ | 情商专精 |
| 交错 13,13,14,14,15,15,16 | ↑↑↑ | ↓ | 纯数学模式 |
| 四次经过 13-16 | — | ↑↑ | 情商模式,数学中性 |
| 文件 | 功能 |
|---|
sweep.py | 主要扫描框架——寻找最优的层复制配置 |
layer_path.py | 构建任意具有显式层执行路径的 GGUF 模型 |
gguf_surgery.py | 底层的 GGUF 层复制(sweep.py 使用) |
math_probe.py | 硬算术探针(Ng 的部分评分方案) |
eq_probe.py | 情商探针(EQ-Bench 风格) |
reasoning_probe.py | 源自 BBH 的因果/逻辑/导航/数学文字题 |
compare_eval.py | 跨运行比较 lm-evaluation-harness 结果 |
visualize.py | 扫描结果的文本和 PNG 热力图 |