Foundry/README.md

222 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Foundry
Pure C implementations of 11 core Python ML tools. CPU is the baseline; GPU backends exist for CUDA, Metal and Tenstorrent Blackhole (see [GPU Support](#gpu-support)). Vulkan is planned.
## Why Foundry?
The Python ML ecosystem is powerful but has limitations:
- **Dependency hell** - Complex Python environments, version conflicts
- **Not embeddable** - Can't easily integrate training into native apps
- **Performance overhead** - Python GIL, interpreter overhead
- **Deployment complexity** - Requires Python runtime everywhere
Foundry provides C implementations that can be:
- Embedded in any application
- Compiled to a single binary
- Used from any language via C FFI
- Deployed without Python
## The Tools
We identified 11 core Python tools that everything else builds on. Each has alternatives, but these are the essential functions:
| Foundry Module | Python counterpart | Function |
| -------------- | --------------- | ----------------------------------------- |
| tensor/ | PyTorch | Tensor operations + autograd |
| optim/ | PyTorch | Optimizers (SGD, Adam) + LR schedulers |
| distributed/ | DeepSpeed | Gradient accumulation, data sharding (single-process; real distributed planned) |
| lora/ | PEFT | LoRA and adapter training |
| tokenizer/ | tokenizers | BPE tokenization (WordPiece planned) |
| data/ | datasets | Dataset loading and processing |
| safetensors/ | safetensors | Safe model weight serialization |
| attention/ | PyTorch attention | Standard (unfused) multi-head attention, KV cache, RoPE, TurboQuant KV compression; no flash kernel yet |
| quantization/ | bitsandbytes | Model quantization (int8, int4) |
| eval/ | lm-eval-harness | Model evaluation and benchmarks |
| progress/ | tqdm | Progress reporting |
## Why These Tools?
Many Python ML tools are alternatives or convenience wrappers:
**Frameworks** - PyTorch vs TensorFlow vs JAX (pick one) **Distributed** - DeepSpeed vs Megatron vs FairScale (pick one) **LoRA** - PEFT vs Unsloth vs Axolotl (PEFT is the core, others wrap it) **Tokenizers** - tokenizers vs SentencePiece vs tiktoken (same function)
We chose the most fundamental tool in each category. Everything else can be built on top.
## Architecture
```
┌─────────────────────────────────────────────────────────────────┐
│ Your Application │
├─────────────────────────────────────────────────────────────────┤
│ Foundry C API │
├─────────────────────────────────────────────────────────────────┤
│ tensor/ │ lora/ │ tokenizer/ │ data/ │ eval/ │ ... │
├─────────────────────────────────────────────────────────────────┤
│ Backends: CPU · CUDA · Metal · Tenstorrent Blackhole │
│ (Vulkan planned) │
└─────────────────────────────────────────────────────────────────┘
```
## Quick Start
**Prerequisites:** a C11 compiler and `make`. BLAS is optional (`USE_BLAS=1`: Accelerate on
macOS, OpenBLAS on Linux). The default flags include `-march=native`, so build on the machine
that will run the code, or add `PORTABLE=1` for a copyable build (`-march=x86-64-v2` on x86-64).
```
# Build all modules
make all
# Run all CPU tests (483 tests, 27 suites)
make test
# Run training example
make train
```
## Training Example
```
$ make train
===========================================
Foundry Training Example: XOR Problem
===========================================
Model: 2-layer MLP (2 -> 8 -> 1)
Task: Learn XOR function
Learning rate: 1.00
Epochs: 1000
Epoch 1 | Loss: 0.265296
Epoch 500 | Loss: 0.001784
Epoch 1000 | Loss: 0.000652
Predictions vs Targets:
0 XOR 0 = 0.042 (target: 0) [OK]
0 XOR 1 = 0.980 (target: 1) [OK]
1 XOR 0 = 0.986 (target: 1) [OK]
1 XOR 1 = 0.015 (target: 0) [OK]
Accuracy: 4/4 (100%)
[SUCCESS] Model learned XOR perfectly!
```
## Status
| Module | Status | Tests | Description |
| ------------- | -------- | ----- | ------------------------------------------------ |
| tensor/ | Complete | 141 | Tensor ops with autograd (PyTorch parity: 80/83) |
| optim/ | Complete | 15 | SGD, Adam, AdamW, LR schedulers |
| progress/ | Complete | 18 | Training progress bars & logging |
| tokenizer/ | Complete | 18 | BPE tokenization |
| safetensors/ | Complete | 18 | Safe tensor serialization |
| lora/ | Complete | 15 | Low-rank adaptation |
| data/ | Complete | 19 | Dataset loading & batching |
| quantization/ | Complete | 57 | INT8/INT4 quantization, export (test_quantization 43 + test_export 14) |
| attention/ | Complete | 23 | Multi-head attention, KV cache, RoPE, TurboQuant KV compression (fa_tq_) (test_attention 12 + test_turboquant 11) |
| distributed/ | Complete | 18 | Gradient accumulation, data sharding |
| eval/ | Complete | 18 | Perplexity, accuracy, F1 metrics |
**Core modules: 360 tests.** `make test` also runs the extension suites — hdc 18, hybridmem 20,
threadpool 7, rwkvx 26 (7 suites), rosa 11, barswap 14, pth 10, ternarize 17 — for **483 tests
across 27 suites, all passing** (macOS, 2026-10-09). The rwkvx suites need the RWKV vocabulary,
which `make test` downloads once via `rwkvx/data/fetch_rwkv_vocab.sh` (network, `curl`,
`sha256sum` or `shasum`). Hardware suites are separate: `make USE_CUDA=1 test-cuda`,
`make USE_METAL=1 test-metal`, and the Tenstorrent suites in `tt/tests/` (see
[`tt/README.md`](./tt/README.md)); each needs the hardware.
**PyTorch numerical parity: 80/83 comparison tests (tensor module)**
## Custom Extensions
| Module | Status | Description |
| ------ | -------- | -------------------------------------------- |
| swarm/ | Complete | Distributed CPU training across Docker Swarm |
| ternary_optim/ | Reference (CPU) | Memory-neutral **ternary** optimizer (SR4). Trains ternary weights (`{-1,0,+1}`) via a 4-bit signed latent accumulator + stochastic rounding — the *entire* per-weight training state is 4 bits (~24× less optimizer state than Adam), no FP32 master weight or momentum. In the research prototype it was extracted from, it reached 98.3% on an MNIST 784-256-10 MLP, matching that MLP's FP32-dense result. Standalone CPU reference library; not yet wired into `optim/`. See `ternary_optim/README.md`. |
These are project-specific additions built on top of the core Foundry modules. See `swarm/README.md` and `ternary_optim/README.md` for details.
## Other Modules
Modules in the tree that are not in the 11-tool table:
| Module | What it is |
| ------ | ---------- |
| rwkvx/ | RWKV-X hybrid LM (RWKV-7 + sparse attention): inference, training, backward passes |
| rwkvx/rfa.* | RWKV-7 + full-attention (Qwen2-style GQA) hybrid inference and training |
| convert/ | HuggingFace safetensors → `.btw`/`.btv` converter for Llama-family models |
| pth/ | PyTorch `.pth` (ZIP + pickle) state_dict reader, zero-copy via mmap |
| threadpool/ | Minimal pthread `parallel_for` (`USE_THREADS=1`) |
| ternarize/ | Post-training ternarization of FP16/BF16 models, layer by layer |
| rosa/ | Suffix automaton (binary and vocab-sized alphabets) |
| hdc/ | Hyperdimensional computing: binary hypervectors, Hamming-distance search |
| hybridmem/ | Disk-backed K/V memory tier for RWKV-X, indexed with hdc/ |
| barswap/ | K80 die time-multiplexing through one PCIe BAR slot on a specific board (BTC-S37) |
| swarm/ | Distributed CPU training across Docker Swarm (`make test-swarm`, not in `make test`) |
| ternary_optim/ | SR4 ternary optimizer, standalone CPU reference |
| dedup/ | MinHash/LSH deduplication — interface only (header + README), not implemented |
| retrieval/ | Hash-based document retrieval — interface only (header + README), not implemented |
## Build Options
```
# Build specific module
make tensor
make lora
# Run specific test suite
make test-tensor
make test-attention
# Debug build
make DEBUG=1 all
# Clean
make clean
```
## GPU Support
CPU is the baseline — every operation works on CPU first, and the GPU backends
extend them without changing the public API.
- **CUDA** (`cuda/`, `cuda_kernels/`) — loaded via `dlopen`, kernels compiled to
PTX and embedded, so Foundry builds without nvcc present. Targets `sm_37`
(Kepler) upward; that is deliberate, since most current runtimes have dropped
below-Pascal support.
- **Metal** (`metal/`) — Apple Silicon.
- **Tenstorrent Blackhole** (`tt/`) — a p150a's Tensix cores, through Foundry's own firmware,
kernels and userspace driver, plain C. The backend was rewritten from public documentation and
measured hardware behaviour; no tt-metal, TT-NN, tt-umd or tt-llk source is compiled, linked
or vendored. The only dependency is the
SFPI compiler, plus `python3` for the `tt/tools/emit_tensix_*.py` generators, and only to
rebuild the device images; a Foundry build needs neither. Kernels are hand-written reader/compute/writer triads compiled ahead of time
and embedded, so Foundry builds without the toolchain present. 8 op families run on
silicon, plus Gated DeltaNet; multi-core matmul exists.
[Pantheon](https://git.teamide.dev/David/Pantheon.git) runs a 9B `qwen35` model end-to-end
on the card through this backend. See
[`tt/README.md`](./tt/README.md) and [`docs/tenstorrent.md`](./docs/tenstorrent.md).
- **Vulkan** — planned.
Contributions to the GPU backends are very welcome.
## License
Foundry is licensed under the **GNU AGPL-3.0** — see [`LICENSE`](./LICENSE).
Contributions are accepted under the CLA in [`CLA.md`](./CLA.md), with a DCO
sign-off on every commit — see [`CONTRIBUTING.md`](./CONTRIBUTING.md). You keep
your copyright; signing is one entry in
[`.cla/signatures.md`](./.cla/signatures.md), added in your first pull request.
Copyright © 2026 David (Corey) Herrera and the Foundry contributors. See
[`NOTICE`](./NOTICE).