
Repliquei o método RYS do Ng e descobri que duplicar 3 camadas específicas no Qwen2.5-32B aumenta o raciocínio em 17% e duplicar as camadas 12-14 no Devstral-24B melhora a dedução lógica de 0.22→0.76 no BBH — sem treinamento, sem alterações de pesos, apenas roteando estados ocultos pelo mesmo circuito duas vezes. Ferramentas incluídas. Duas GPUs AMD, uma noite.
Eu repliquei o método RYS de Ng e descobri que duplicar 3 camadas específicas no Qwen2.5-32B melhora o raciocínio em 17% e duplicar as camadas 12-14 no Devstral-24B melhora a dedução lógica de 0,22→0,76 no BBH — sem treinamento, sem alterações de peso, apenas roteando estados ocultos através do mesmo circuito duas vezes. Ferramentas incluídas. Duas GPUs AMD, uma noite.
Duplique 3 camadas. Sem treinamento. Dedução lógica vai de ~0,22 → 0,76.
Este kit de ferramentas encontra e explora "circuitos de raciocínio" escondidos dentro de modelos transformer. A ideia: certos blocos contíguos de camadas atuam como unidades cognitivas indivisíveis. Duplique-os no forward pass — mesmos pesos, sem treinamento, sem merge — e o modelo fica mensuravelmente mais inteligente em capacidades específicas.
Construído sobre o método RYS de David Ng e estendido com novas descobertas. Tudo aqui foi descoberto em duas GPUs AMD de consumo (RX 7900 XT + RX 6950 XT) em uma noite.
Executei os testes completos em uma instância H200 no Vast.ai e comparei o devstral base contra o modelo cirúrgico, e os resultados são: A cirurgia está fazendo algo real e específico: está melhorando o raciocínio matemático e o raciocínio causal, mas ao custo de seguir instruções e gerar código. O modelo pensa mais, mas segue direções com menos precisão.
Na pasta results você pode ver os resultados em eval_base e eval_surgery. Também adicionei ao repositório o vastai_rys_eval.sh, que é o script usado para rodar o pacote completo no Vast.ai. instância vastai criada com
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
Medido em conjunto personalizado de sondas (derivado de BBH + estilo EQ-Bench + GSM8K):
| Sonda | Base | +3 camadas | Mudança |
|---|---|---|---|
| Raciocínio (causal + lógica + navegação) | 76,5% | 94,1% | +23% |
| EQ (inteligência emocional) |
Os transformers se organizam durante o treinamento em circuitos funcionais — unidades de processamento multicamadas que realizam operações cognitivas completas. Esses circuitos são indivisíveis: duplicar uma única camada quase não faz nada, mas duplicar o bloco certo de 3-4 camadas dá ao modelo uma segunda passagem pelo seu pipeline de raciocínio.
Diferentes modelos têm circuitos diferentes em lugares diferentes:
Os limites são nítidos. Mude o bloco em uma camada para qualquer direção e a melhoria desaparece ou se inverte.
Diferentes padrões de duplicação criam perfis cognitivos distintos a partir dos mesmos pesos:
Mesmos pesos no disco. Mesma VRAM para o modelo base. Apenas roteamento diferente.
pip install gguf requests tqdm
python sweep.py \
--model /caminho/para/modelo.gguf \
--llama-server /caminho/para/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
# Duplicar camadas 12-14 no Devstral (o resultado validado acima)
python layer_path.py model.gguf improved.gguf \
-p "0..14,12,13,14,15..39" -v
# Duplicar camadas 7-9 no Qwen2.5-32B
python layer_path.py model.gguf improved.gguf \
-p "0..9,7,8,9,10..63" -v
# Solte a imaginação: tripla passagem, intercalado, pule camadas, o que quiser
python layer_path.py model.gguf experiment.gguf \
-p "0..16,13,14,15,16,13,14,15,16,17..39" -v
# Inicie o servidor com o modelo modificado
llama-server -m improved.gguf --port 8089 -ngl 99 --device Vulkan1,Vulkan2
# Execute o 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 execuções
python compare_eval.py ./eval_base ./eval_improved
Para cada configuração de camada (i, j):
layers 0..j-1 → layers i..j-1 again → layers j..N-1A estratégia de busca:
Os GGUFs modificados são escritos em tmpfs (/dev/shm) e excluídos após cada teste. Os pesos do modelo base permanecem no disco.
gguf, requests, tqdmlm-eval para validação de benchmark, matplotlib para gráficos de mapa de calorIsso usa mais VRAM? Sim, as camadas duplicadas são cópias físicas no GGUF. Para 3 camadas extras em um modelo de 24B, espere ~1,5 GiB adicionais. Um patch de forward-pass do llama.cpp (usando ponteiros em vez de cópias) eliminaria isso — contribuições são bem-vindas.
Isso diminui a inferência? Sim, proporcionalmente ao número de camadas extras. 3 camadas extras em um modelo de 40 camadas = ~7,5% mais lento. A melhoria no raciocínio vale a pena.
Isso funcionará no meu modelo? Provavelmente. Testamos na arquitetura Mistral (Devstral) e na arquitetura Qwen2. O trabalho original de Ng foi no Qwen2-72B. Os circuitos existem em todos os modelos transformer — a questão é onde eles estão e qual o tamanho. Execute a varredura e descubra.
Por que não fazer fine-tuning? Isso é ortogonal ao fine-tuning. Você pode fazer ambos. Na verdade, os modelos RYS de Ng foram posteriormente fine-tunados por outros e lideraram o ranking do HuggingFace. A duplicação de camadas muda a arquitetura; o fine-tuning muda os pesos. Empilhe-os.
MIT
| 92,1 |
| 93,6 |
| +1,6% |
| Padrão | Matemática | EQ | Caráter |
|---|
| Dupla passagem 13-16 | ↑↑ | ↑ | Especialista em matemática |
| Tripla passagem 13-16 | ↑ | ↑↑ | Especialista em EQ |
| Intercalado 13,13,14,14,15,15,16 | ↑↑↑ | ↓ | Modo matemática pura |
| Quádrupla passagem 13-16 | — | ↑↑ | Modo EQ, matemática neutra |
| Arquivo | O que faz |
|---|
sweep.py | Ferramenta principal de varredura — encontra configurações ótimas de duplicação de camadas |
layer_path.py | Constrói qualquer GGUF com um caminho de execução explícito de camadas |
gguf_surgery.py | Duplicação de camadas GGUF de baixo nível (usado pelo sweep.py) |
math_probe.py | Sonda de aritmética difícil (pontuação parcial de Ng) |
eq_probe.py | Sonda de inteligência emocional (estilo EQ-Bench) |
reasoning_probe.py | Problemas de palavras de raciocínio causal/lógico/navegação/matemática derivados do BBH |
compare_eval.py | Compara resultados do lm-evaluation-harness entre execuções |
visualize.py | Mapas de calor em texto e PNG dos resultados da varredura |