
Reproduje el método RYS de Ng y descubrí que duplicar 3 capas específicas en Qwen2.5-32B aumenta el razonamiento en un 17% y duplicar las capas 12-14 en Devstral-24B mejora la deducción lógica de 0.22→0.76 en BBH — sin entrenamiento, sin cambios de peso, simplemente enrutando estados ocultos a través del mismo circuito dos veces. Herramientas incluidas. Dos GPUs AMD, una tarde.
Reproduje el método RYS de Ng y descubrí que duplicar 3 capas específicas en Qwen2.5-32B mejora el razonamiento en un 17% y duplicar las capas 12-14 en Devstral-24B mejora la deducción lógica de 0.22→0.76 en BBH — sin entrenamiento, sin cambios de pesos, solo redirigiendo los estados ocultos a través del mismo circuito dos veces. Herramientas incluidas. Dos GPUs AMD, una tarde.
Duplica 3 capas. Sin entrenamiento. La deducción lógica pasa de 0.22 → 0.76.
Este kit de herramientas encuentra y explota "circuitos de razonamiento" ocultos dentro de modelos transformadores. La idea: ciertos bloques contiguos de capas actúan como unidades cognitivas indivisibles. Duplícalos en el pase hacia adelante — mismos pesos, sin entrenamiento, sin fusión — y el modelo se vuelve mediblemente más inteligente en capacidades específicas.
Construido sobre el método RYS de David Ng y ampliado con nuevos hallazgos. Todo lo aquí descubierto fue encontrado en dos GPUs de consumo AMD (RX 7900 XT + RX 6950 XT) en una tarde.
Ejecuté las pruebas completas en una instancia H200 en Vast.ai y comparé la base de devstral contra el modelo de cirugía, y los resultados están: Así que la cirugía está haciendo algo real y específico: está impulsando el razonamiento matemático y el razonamiento causal pero a costa de seguir instrucciones y generar código. El modelo piensa más intensamente pero sigue las instrucciones con menos precisión.
En la carpeta de resultados puedes ver los resultados bajo eval_base y eval_surgery. También agregué al repositorio vastai_rys_eval.sh que es el script utilizado para ejecutar todo el wacamole en Vast.ai. instancia vastai creada con
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 en el conjunto de sondas personalizado (derivado de BBH + estilo EQ-Bench + GSM8K):
| Prueba | Base | +3 capas | Cambio |
|---|---|---|---|
| Razonamiento (causal + lógica + nav) | 76.5% | 94.1% | +23% |
| EQ (inteligencia emocional) | 92.1 | 93.6 | +1.6% |
Los transformadores se organizan durante el entrenamiento en circuitos funcionales — unidades de procesamiento de múltiples capas que realizan operaciones cognitivas completas. Estos circuitos son indivisibles: duplicar una sola capa no hace casi nada, pero duplicar el bloque correcto de 3-4 capas le da al modelo un segundo pase a través de su pipeline de razonamiento.
Diferentes modelos tienen diferentes circuitos en diferentes lugares:
Los límites son precisos. Desplazar el bloque una capa en cualquier dirección hace que la mejora desaparezca o se invierta.
Diferentes patrones de duplicación crean perfiles cognitivos distintos a partir de los mismos pesos:
| Patrón | Matemáticas | EQ | Carácter |
|---|---|---|---|
| Pase doble 13-16 | ↑↑ | ↑ | Especialista en matemáticas |
| Pase triple 13-16 | ↑ | ↑↑ | Especialista en EQ |
| Intercalado 13,13,14,14,15,15,16 | ↑↑↑ | ↓ | Modo matemático puro |
| Pase cuádruple 13-16 | — | ↑↑ | Modo EQ, matemáticas neutro |
Mismos pesos en disco. Misma VRAM para el modelo base. Solo diferente enrutamiento.
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
| Archivo | Qué hace |
|---|---|
sweep.py | Herramienta principal de barrido — encuentra configuraciones óptimas de duplicación de capas |
layer_path.py | Construye cualquier GGUF con una ruta de ejecución de capas explícita |
gguf_surgery.py | Duplicación de capas GGUF de bajo nivel (usado por sweep.py) |
math_probe.py | Sonda de aritmética difícil (puntuación de crédito parcial de Ng) |
eq_probe.py | Sonda de inteligencia emocional (estilo EQ-Bench) |
reasoning_probe.py | Problemas de palabras de razonamiento causal/lógico/navegación/matemáticas derivados de BBH |
compare_eval.py | Compara resultados de lm-evaluation-harness entre ejecuciones |
visualize.py | Mapas de calor en texto y PNG de los resultados del barrido |
Para cada configuración de capa (i, j):
layers 0..j-1 → layers i..j-1 again → layers j..N-1La estrategia de búsqueda:
Los GGUF modificados se escriben en tmpfs (/dev/shm) y se eliminan después de cada prueba. Los pesos del modelo base permanecen en el disco.
gguf, requests, tqdmlm-eval para validación de benchmarks, matplotlib para gráficos de mapas de calor¿Esto usa más VRAM? Sí, las capas duplicadas son copias físicas en el GGUF. Para 3 capas adicionales en un modelo de 24B, espera ~1.5 GiB adicionales. Un parche de pase hacia adelante de llama.cpp (usando punteros en lugar de copias) eliminaría esto — las contribuciones son bienvenidas.
¿Esto ralentiza la inferencia? Sí, proporcional al número de capas adicionales. 3 capas adicionales en un modelo de 40 capas = ~7.5% más lento. La mejora en el razonamiento vale la pena.
¿Funcionará esto en mi modelo? Probablemente. Lo hemos probado en arquitectura Mistral (Devstral) y arquitectura Qwen2. El trabajo original de Ng fue en Qwen2-72B. Los circuitos existen en todos los modelos transformadores — la pregunta es dónde están y qué tan grandes son. Ejecuta el barrido y descúbrelo.
¿Por qué no ajustar fino en su lugar? Esto es ortogonal al ajuste fino. Puedes hacer ambos. De hecho, los modelos RYS de Ng fueron ajustados posteriormente por otros y encabezaron la tabla de clasificación de HuggingFace. La duplicación de capas cambia la arquitectura; el ajuste fino cambia los pesos. Apílalos.
MIT