Phase 4 — La ruta de datos de rebanadas de expertos (M1)
Un dispositivo débil descarga unos pocos expertos de 6 MB, no una capa de 1.4 GB — y el cómputo fragmentado iguala al monolítico hasta 3.6e-12.
Una rebanada de experto es una copia de bytes — sin decuantización
Los tensores de expertos MoE apilan todos los expertos a lo largo de la dimensión ggml más externa, así que el lector expone (n_expert, rows, row_bytes) de bytes cuantizados crudos. El experto *e* es una losa contigua alineada a bloques de cuantización — la rebanada es literalmente data[a:b], sin decuantización ni re-empaquetado.
write_expert_shard_gguf — la ida y vuelta verificada.
sliced = tensor.data[a:b] # outermost axis = expert
writer.add_tensor(name, sliced, raw_dtype=tensor.tensor_type)
# router (ffn_gate_inp) & shared expert stay on the backbone → excluded
GET /api/proxy/models/{m}/expert-shard?layers=0:2&experts=0:16 # node-token authed
dispatch + combine == monolítico, exactamente
Con expertos reales de layer-0 del 122B (referencia decuantizada), dividir los expertos en 4 shards, computar cada uno por separado y combinar iguala a la FFN MoE monolítica: el sharding es un reagrupamiento exacto de la misma suma ponderada, no una aproximación.
linkcpp-expert-worker reproduce el oráculo en ROCm
- ggml/gguf puro (sin libllama): carga la rebanada en un backend de GPU y corre
mul_mat_id(up/gate) → swiglu → mul_mat_id(down). - Compilación + ejecución ROCm en un MI250: 122B layer-0, expertos [0,8), 4 tokens.
- Cosine 0.99995 vs el oráculo, allclose(1e-3) = True, max|Δ| = 7.9e-7 — este residuo es en sí el primer caso medido de equivalencia entre backends (ROCm vs numpy).
- La misma ruta de código cubre CUDA/Metal/Vulkan/CPU (
mul_mat_id/swigluson ggml de serie; CUDA tiene un kernel MoE dedicado).
La pieza más difícil y arriesgada — el kernel del worker en dispositivo — quedó verificada aquí. Lo que faltaba era la orquestación backbone↔worker; el worker es una función pura probada que consume estas rebanadas.