Rename to DaisyChain-Train; link GitHub
Browse files
README.md
CHANGED
|
@@ -1,156 +1,156 @@
|
|
| 1 |
-
---
|
| 2 |
-
license: mit
|
| 3 |
-
tags:
|
| 4 |
-
- distributed-training
|
| 5 |
-
- old-hardware
|
| 6 |
-
- cluster
|
| 7 |
-
- verified-units
|
| 8 |
-
- pytorch
|
| 9 |
-
---
|
| 10 |
-
|
| 11 |
-
# πΌ DaisyChain β Old Hardware Training Pipeline
|
| 12 |
-
|
| 13 |
-
> **In plain terms:** DaisyChain lets you use **old / spare machines** to train
|
| 14 |
-
> neural networks. The training runs through **emulated GPU logic** β verified
|
| 15 |
-
> INT8 units (GUDA-style) that stand in for a GPU's math β so machines *without*
|
| 16 |
-
> a modern GPU can still do the work. Chain several together and they train one
|
| 17 |
-
> shared model as a cluster.
|
| 18 |
-
> Before you rely on it, see what it **can't** do β [Limitations](docs/LIMITS.md).
|
| 19 |
-
|
| 20 |
-
**Use the hardware you already have to train.** Each machine runs the emulated
|
| 21 |
-
GPU logic (verified INT8 units β multiply / requantize / ReLU) to compute the
|
| 22 |
-
model, and DaisyChain pools the machines data-parallel: device selection,
|
| 23 |
-
capacity-weighted sharding, gradient sync, a P2P setup, and a live dashboard.
|
| 24 |
-
Two ways to run β **Docker** or **Python**.
|
| 25 |
-
|
| 26 |
-
> Built by **DaisyChainAI**. Point it at your model + data and it trains across
|
| 27 |
-
> whatever old machines you have, through the emulated GPU logic.
|
| 28 |
-
|
| 29 |
-
**Repositories:** [GitHub](https://github.com/quzi93/
|
| 30 |
-
|
| 31 |
-
---
|
| 32 |
-
|
| 33 |
-
## β οΈ Read this first
|
| 34 |
-
DaisyChain is for **small models on spare hardware**. It **pools compute, not
|
| 35 |
-
memory** (the model must fit on one node), scaling is **sublinear**, and it is
|
| 36 |
-
**not** a substitute for a real GPU on real models. Full envelope in
|
| 37 |
-
**[docs/LIMITS.md](docs/LIMITS.md)** β please read it before relying on it.
|
| 38 |
-
|
| 39 |
-
---
|
| 40 |
-
|
| 41 |
-
## Quick start
|
| 42 |
-
|
| 43 |
-
### Docker (most reliable β one command)
|
| 44 |
-
```bash
|
| 45 |
-
docker compose -f docker/docker-compose.yml up --build
|
| 46 |
-
# open http://localhost:8080
|
| 47 |
-
```
|
| 48 |
-
Brings up a 3-node demo cluster + dashboard on one machine.
|
| 49 |
-
|
| 50 |
-
### Python (real machines)
|
| 51 |
-
On every machine (`pip install daisychain` or `pip install -e .`):
|
| 52 |
-
```bash
|
| 53 |
-
export MASTER_ADDR=100.101.102.10 # coordinator IP (Tailscale 100.x recommended)
|
| 54 |
-
export MASTER_PORT=29560
|
| 55 |
-
export WORLD_SIZE=3
|
| 56 |
-
export RANK=0 # 1, 2, ... on the others
|
| 57 |
-
export GLOO_SOCKET_IFNAME=tailscale0 # your mesh / LAN NIC
|
| 58 |
-
daisychain-train
|
| 59 |
-
```
|
| 60 |
-
|
| 61 |
-
### Windows helper
|
| 62 |
-
```bat
|
| 63 |
-
scripts\setup.bat
|
| 64 |
-
```
|
| 65 |
-
An interactive menu: Docker, Python node, or just install deps.
|
| 66 |
-
|
| 67 |
-
Full walkthrough: **[docs/QUICKSTART.md](docs/QUICKSTART.md)**.
|
| 68 |
-
|
| 69 |
-
---
|
| 70 |
-
|
| 71 |
-
## How it works
|
| 72 |
-
|
| 73 |
-
Each machine runs the **same** command; they form a cluster and train one shared
|
| 74 |
-
model. Two things happen:
|
| 75 |
-
|
| 76 |
-
1. **The compute runs through the emulated GPU logic.** By default the model is
|
| 77 |
-
built from `VerifiedLinear` layers, so every forward multiply / requantize /
|
| 78 |
-
ReLU is done by the **bundled verified INT8 units** (`daisychain/verified/`)
|
| 79 |
-
β the emulated GPU math. Rank 0 prints **cluster-wide unit-invocation counts**
|
| 80 |
-
so you can see the emulated logic doing the work.
|
| 81 |
-
2. **The machines are pooled data-parallel.** Each node trains on its own shard;
|
| 82 |
-
gradients are capacity-weighted and combined into the exact full-batch
|
| 83 |
-
gradient, so replicas stay **bit-identical**. Faster machines automatically
|
| 84 |
-
take a bigger share.
|
| 85 |
-
|
| 86 |
-
```
|
| 87 |
-
old machine A ββ
|
| 88 |
-
old machine B ββΌββΊ each runs the emulated GPU logic on its shard ββΊ one model
|
| 89 |
-
old machine C ββ (gradients combined across the cluster)
|
| 90 |
-
```
|
| 91 |
-
|
| 92 |
-
## Bring your own model
|
| 93 |
-
DaisyChain trains any **Task** (`build_model` / `sample` / `loss`). Copy
|
| 94 |
-
`examples/my_task_template.py`, set `DAISY_TASK=your_module:YourTask`. Use
|
| 95 |
-
`VerifiedLinear` (see `daisychain/verified_task.py`) to run your model's compute
|
| 96 |
-
through the emulated units. See **[docs/CUSTOM_TASK.md](docs/CUSTOM_TASK.md)**.
|
| 97 |
-
|
| 98 |
-
## Plain-float alternative
|
| 99 |
-
If you'd rather skip the emulated units and just train with normal float math on
|
| 100 |
-
each machine, set `DAISY_TASK=daisychain.example_task:ExampleTask`. Same cluster,
|
| 101 |
-
same pooling β the model math just runs as ordinary float instead of through the
|
| 102 |
-
verified units.
|
| 103 |
-
|
| 104 |
-
## The dashboard
|
| 105 |
-
`daisychain-dashboard` (or the Docker service) serves a Tailwind page at
|
| 106 |
-
`:8080` β readiness banner, P2P connectivity scan, pooled cores/RAM + capacity
|
| 107 |
-
plan (per-node device, weight, batch), and live training loss.
|
| 108 |
-
|
| 109 |
-
## Networking
|
| 110 |
-
Use **Tailscale** for a P2P mesh so machines on different networks get stable
|
| 111 |
-
IPs on one interface β **[docs/TAILSCALE.md](docs/TAILSCALE.md)**.
|
| 112 |
-
|
| 113 |
-
---
|
| 114 |
-
|
| 115 |
-
## Layout
|
| 116 |
-
```
|
| 117 |
-
daisychain/cluster.py capacity-weighted CPU/GPU data-parallel trainer
|
| 118 |
-
daisychain/task.py the Task interface + loader
|
| 119 |
-
daisychain/train.py entry point (daisychain-train)
|
| 120 |
-
daisychain/example_task.py default runnable task (plain float)
|
| 121 |
-
daisychain/verified/ bundled trained N/N units + VerifiedLinear (train through them)
|
| 122 |
-
daisychain/verified_task.py example task whose forward runs on the verified units
|
| 123 |
-
daisychain/dashboard/ agent + P2P scanner + Tailwind server
|
| 124 |
-
docker/ Dockerfile, dashboard image, compose (demo cluster)
|
| 125 |
-
scripts/setup.bat / setup.sh interactive setup helpers
|
| 126 |
-
config/ nodes + cluster env examples
|
| 127 |
-
examples/my_task_template.py starting point for your own model
|
| 128 |
-
docs/ QUICKSTART, LIMITS, CUSTOM_TASK, TAILSCALE
|
| 129 |
-
```
|
| 130 |
-
|
| 131 |
-
## Install
|
| 132 |
-
```bash
|
| 133 |
-
pip install torch numpy psutil
|
| 134 |
-
pip install -e . # exposes: daisychain-train, daisychain-agent, daisychain-dashboard
|
| 135 |
-
```
|
| 136 |
-
|
| 137 |
-
Requires Python β₯ 3.9, PyTorch β₯ 2.0. Multi-node is reliable on **Linux/macOS**;
|
| 138 |
-
on **Windows use Docker/WSL** (see LIMITS).
|
| 139 |
-
|
| 140 |
-
---
|
| 141 |
-
|
| 142 |
-
**License:** MIT Β· **Author:** Dean Byrne (Quazim0t0) Β· **Org:** DaisyChainAI
|
| 143 |
-
|
| 144 |
-
## Citation
|
| 145 |
-
|
| 146 |
-
```bibtex
|
| 147 |
-
@misc{byrne2026daisychain,
|
| 148 |
-
title = {DaisyChain: An Old Hardware Training Pipeline},
|
| 149 |
-
author = {Byrne, Dean (Quazim0t0)},
|
| 150 |
-
year = {2026},
|
| 151 |
-
howpublished = {\url{https://huggingface.co/DaisyChainAI/
|
| 152 |
-
note = {Chain spare/old machines into a data-parallel training cluster}
|
| 153 |
-
}
|
| 154 |
-
```
|
| 155 |
-
|
| 156 |
-
**Dean Byrne (Quazim0t0)** Β· 2026
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
tags:
|
| 4 |
+
- distributed-training
|
| 5 |
+
- old-hardware
|
| 6 |
+
- cluster
|
| 7 |
+
- verified-units
|
| 8 |
+
- pytorch
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
# πΌ DaisyChain β Old Hardware Training Pipeline
|
| 12 |
+
|
| 13 |
+
> **In plain terms:** DaisyChain lets you use **old / spare machines** to train
|
| 14 |
+
> neural networks. The training runs through **emulated GPU logic** β verified
|
| 15 |
+
> INT8 units (GUDA-style) that stand in for a GPU's math β so machines *without*
|
| 16 |
+
> a modern GPU can still do the work. Chain several together and they train one
|
| 17 |
+
> shared model as a cluster.
|
| 18 |
+
> Before you rely on it, see what it **can't** do β [Limitations](docs/LIMITS.md).
|
| 19 |
+
|
| 20 |
+
**Use the hardware you already have to train.** Each machine runs the emulated
|
| 21 |
+
GPU logic (verified INT8 units β multiply / requantize / ReLU) to compute the
|
| 22 |
+
model, and DaisyChain pools the machines data-parallel: device selection,
|
| 23 |
+
capacity-weighted sharding, gradient sync, a P2P setup, and a live dashboard.
|
| 24 |
+
Two ways to run β **Docker** or **Python**.
|
| 25 |
+
|
| 26 |
+
> Built by **DaisyChainAI**. Point it at your model + data and it trains across
|
| 27 |
+
> whatever old machines you have, through the emulated GPU logic.
|
| 28 |
+
|
| 29 |
+
**Repositories:** [GitHub](https://github.com/quzi93/DaisyChain-Train) Β· [π€ HuggingFace](https://huggingface.co/DaisyChainAI/DaisyChain-Train)
|
| 30 |
+
|
| 31 |
+
---
|
| 32 |
+
|
| 33 |
+
## β οΈ Read this first
|
| 34 |
+
DaisyChain is for **small models on spare hardware**. It **pools compute, not
|
| 35 |
+
memory** (the model must fit on one node), scaling is **sublinear**, and it is
|
| 36 |
+
**not** a substitute for a real GPU on real models. Full envelope in
|
| 37 |
+
**[docs/LIMITS.md](docs/LIMITS.md)** β please read it before relying on it.
|
| 38 |
+
|
| 39 |
+
---
|
| 40 |
+
|
| 41 |
+
## Quick start
|
| 42 |
+
|
| 43 |
+
### Docker (most reliable β one command)
|
| 44 |
+
```bash
|
| 45 |
+
docker compose -f docker/docker-compose.yml up --build
|
| 46 |
+
# open http://localhost:8080
|
| 47 |
+
```
|
| 48 |
+
Brings up a 3-node demo cluster + dashboard on one machine.
|
| 49 |
+
|
| 50 |
+
### Python (real machines)
|
| 51 |
+
On every machine (`pip install daisychain` or `pip install -e .`):
|
| 52 |
+
```bash
|
| 53 |
+
export MASTER_ADDR=100.101.102.10 # coordinator IP (Tailscale 100.x recommended)
|
| 54 |
+
export MASTER_PORT=29560
|
| 55 |
+
export WORLD_SIZE=3
|
| 56 |
+
export RANK=0 # 1, 2, ... on the others
|
| 57 |
+
export GLOO_SOCKET_IFNAME=tailscale0 # your mesh / LAN NIC
|
| 58 |
+
daisychain-train
|
| 59 |
+
```
|
| 60 |
+
|
| 61 |
+
### Windows helper
|
| 62 |
+
```bat
|
| 63 |
+
scripts\setup.bat
|
| 64 |
+
```
|
| 65 |
+
An interactive menu: Docker, Python node, or just install deps.
|
| 66 |
+
|
| 67 |
+
Full walkthrough: **[docs/QUICKSTART.md](docs/QUICKSTART.md)**.
|
| 68 |
+
|
| 69 |
+
---
|
| 70 |
+
|
| 71 |
+
## How it works
|
| 72 |
+
|
| 73 |
+
Each machine runs the **same** command; they form a cluster and train one shared
|
| 74 |
+
model. Two things happen:
|
| 75 |
+
|
| 76 |
+
1. **The compute runs through the emulated GPU logic.** By default the model is
|
| 77 |
+
built from `VerifiedLinear` layers, so every forward multiply / requantize /
|
| 78 |
+
ReLU is done by the **bundled verified INT8 units** (`daisychain/verified/`)
|
| 79 |
+
β the emulated GPU math. Rank 0 prints **cluster-wide unit-invocation counts**
|
| 80 |
+
so you can see the emulated logic doing the work.
|
| 81 |
+
2. **The machines are pooled data-parallel.** Each node trains on its own shard;
|
| 82 |
+
gradients are capacity-weighted and combined into the exact full-batch
|
| 83 |
+
gradient, so replicas stay **bit-identical**. Faster machines automatically
|
| 84 |
+
take a bigger share.
|
| 85 |
+
|
| 86 |
+
```
|
| 87 |
+
old machine A ββ
|
| 88 |
+
old machine B ββΌββΊ each runs the emulated GPU logic on its shard ββΊ one model
|
| 89 |
+
old machine C ββ (gradients combined across the cluster)
|
| 90 |
+
```
|
| 91 |
+
|
| 92 |
+
## Bring your own model
|
| 93 |
+
DaisyChain trains any **Task** (`build_model` / `sample` / `loss`). Copy
|
| 94 |
+
`examples/my_task_template.py`, set `DAISY_TASK=your_module:YourTask`. Use
|
| 95 |
+
`VerifiedLinear` (see `daisychain/verified_task.py`) to run your model's compute
|
| 96 |
+
through the emulated units. See **[docs/CUSTOM_TASK.md](docs/CUSTOM_TASK.md)**.
|
| 97 |
+
|
| 98 |
+
## Plain-float alternative
|
| 99 |
+
If you'd rather skip the emulated units and just train with normal float math on
|
| 100 |
+
each machine, set `DAISY_TASK=daisychain.example_task:ExampleTask`. Same cluster,
|
| 101 |
+
same pooling β the model math just runs as ordinary float instead of through the
|
| 102 |
+
verified units.
|
| 103 |
+
|
| 104 |
+
## The dashboard
|
| 105 |
+
`daisychain-dashboard` (or the Docker service) serves a Tailwind page at
|
| 106 |
+
`:8080` β readiness banner, P2P connectivity scan, pooled cores/RAM + capacity
|
| 107 |
+
plan (per-node device, weight, batch), and live training loss.
|
| 108 |
+
|
| 109 |
+
## Networking
|
| 110 |
+
Use **Tailscale** for a P2P mesh so machines on different networks get stable
|
| 111 |
+
IPs on one interface β **[docs/TAILSCALE.md](docs/TAILSCALE.md)**.
|
| 112 |
+
|
| 113 |
+
---
|
| 114 |
+
|
| 115 |
+
## Layout
|
| 116 |
+
```
|
| 117 |
+
daisychain/cluster.py capacity-weighted CPU/GPU data-parallel trainer
|
| 118 |
+
daisychain/task.py the Task interface + loader
|
| 119 |
+
daisychain/train.py entry point (daisychain-train)
|
| 120 |
+
daisychain/example_task.py default runnable task (plain float)
|
| 121 |
+
daisychain/verified/ bundled trained N/N units + VerifiedLinear (train through them)
|
| 122 |
+
daisychain/verified_task.py example task whose forward runs on the verified units
|
| 123 |
+
daisychain/dashboard/ agent + P2P scanner + Tailwind server
|
| 124 |
+
docker/ Dockerfile, dashboard image, compose (demo cluster)
|
| 125 |
+
scripts/setup.bat / setup.sh interactive setup helpers
|
| 126 |
+
config/ nodes + cluster env examples
|
| 127 |
+
examples/my_task_template.py starting point for your own model
|
| 128 |
+
docs/ QUICKSTART, LIMITS, CUSTOM_TASK, TAILSCALE
|
| 129 |
+
```
|
| 130 |
+
|
| 131 |
+
## Install
|
| 132 |
+
```bash
|
| 133 |
+
pip install torch numpy psutil
|
| 134 |
+
pip install -e . # exposes: daisychain-train, daisychain-agent, daisychain-dashboard
|
| 135 |
+
```
|
| 136 |
+
|
| 137 |
+
Requires Python β₯ 3.9, PyTorch β₯ 2.0. Multi-node is reliable on **Linux/macOS**;
|
| 138 |
+
on **Windows use Docker/WSL** (see LIMITS).
|
| 139 |
+
|
| 140 |
+
---
|
| 141 |
+
|
| 142 |
+
**License:** MIT Β· **Author:** Dean Byrne (Quazim0t0) Β· **Org:** DaisyChainAI
|
| 143 |
+
|
| 144 |
+
## Citation
|
| 145 |
+
|
| 146 |
+
```bibtex
|
| 147 |
+
@misc{byrne2026daisychain,
|
| 148 |
+
title = {DaisyChain: An Old Hardware Training Pipeline},
|
| 149 |
+
author = {Byrne, Dean (Quazim0t0)},
|
| 150 |
+
year = {2026},
|
| 151 |
+
howpublished = {\url{https://huggingface.co/DaisyChainAI/DaisyChain-Train}},
|
| 152 |
+
note = {Chain spare/old machines into a data-parallel training cluster}
|
| 153 |
+
}
|
| 154 |
+
```
|
| 155 |
+
|
| 156 |
+
**Dean Byrne (Quazim0t0)** Β· 2026
|