Neural Fountain — shard specialists · LT peel · Master ensemble
Neural Fountain is a training / assembly paradigm in poly/ that mirrors LT fountain codes on network weights instead of data bytes.
Pixel fountain recovers K source blocks byte-exact via spray / peel.
Neural Fountain recovers K specialist weight blobs byte-exact the same way, then exposes a Master ensemble.
| Pixel fountain | Neural Fountain |
|---|---|
| K image / data blocks | K specialist weight blocks |
| XOR spray + peel | same LT codec (poly/fountain_lt.go) |
| 100% byte-exact cargo | 100% byte-exact specialists |
| reconstructed dataset | Master = recovered experts + averaged outputs |
Learning happens in poly.Train on each shard. Fountain is transport / reassembly, not the optimizer. No layer_seed search — contrast seed_manifests.md.
Companion MNIST demo: chaosglue/loom_neural_fountain. Related (data-only LT): chaosglue/loom_fountain_codes.
Pipeline
- Partition training batches into K shards (every sample covered).
- Specialize —
NetworkFactory(i)builds any architecture;Trainon shardi(optionalUseExactDType/UniformDType). - Pack — recursive FP32 Master (+ aux + Scale) over the full layer tree →
[]byte. - Fountain — LT XOR spray (lossy OK) → peel until K/K recovered.
- Unpack → Masters restored →
ForceMorph(layer.DType)for each layer’s numerical type → Master ensemble.
Specialists must share an identical parameter layout (same walk order / lengths). Architecture is free via NetworkFactory (dense, CNN, residual, MHA, parallel/sequential nests, …).
Any layer type / any numerical type
Layers
PackNetworkWeights / UnpackNetworkWeights recursively visit:
- top-level
Layers ParallelBranches,SequentialLayersFilterGateConfig,MetaObservedLayer
and pack, per layer:
WeightStore.Master(FP32 persistence space — Loom’s SoT)WeightStore.ScaleQNormWeight,KNormWeight,InnerNormWeight(MHA / BitNet-style aux)
Any layer that stores trainable state there participates. Nested stacks included.
Numerical types
Loom persists through FP32 Masters, then morphs to the layer’s DType (any of the supported storage types):
- After unpack:
MorphNetworkToLayerDTypes→ForceMorph(layer.DType) ApplyUniformDType(net, dtype)forces one dtype on the whole tree before trainUseExactDType: trueenables native-dtype train/forward paths during specialize
So fountain cargo is bit-exact FP32 Masters; runtime dtype is whatever each layer is set to (float16, int8, …), including exact-dtype training.
Activations / TrainingBatch remain float32 (standard Loom train API); weights can be exact-dtype.
Core API
| File | Role |
|---|---|
poly/neural_fountain.go |
NeuralFountain, FountainMaster, DenseSpecialistFactory, config |
poly/weight_pack.go |
recursive pack/unpack, morph/wire helpers |
poly/fountain_lt.go |
LT encoder / decoder |
// Dense example with mixed layer dtypes:
factory := poly.DenseSpecialistFactory("net",
[]int{784, 128, 64, 10},
[]string{"float16", "float16", "float32"})
// Or any architecture:
factory := func(i int) (*poly.VolumetricNetwork, error) {
return buildMyCNNOrMHA(i) // identical layout across i
}
cfg := poly.DefaultNeuralFountainConfig()
cfg.K = 16
cfg.UseExactDType = true
// cfg.UniformDType = poly.DTypeFloat16 // optional blanket morph
master, err := poly.NeuralFountain(factory, batches, cfg)
out, err := master.Forward(input)
Config knobs
| Field | Meaning |
|---|---|
K |
specialist / shard count |
Epochs / LR / LossType / Mode |
per-specialist Train |
UseExactDType |
native-dtype train/forward |
UniformDType |
if set, morph all layers to this dtype before train |
LossRate / MaxOverhead / Seed |
LT channel + spray budget |
Verbose |
specialize / recover logs |
Master semantics
Forward/ForwardArgmax— average specialist outputs (deployable).OracleForward/OracleArgmax— shard expert owns samplei(coverage check).- Prefer ensemble Master; do not average differently trained weight blobs into one net.
Honest scope
- Fountain does not invent weights without specialist
Train. - Pack path is Loom’s FP32 Master SoT (+ aux); natives are rematerialized via
ForceMorph. - Layout equality across specialists is required (same recursive float count).
- LT recover is probabilistic; large blobs need enough spray overhead.