koodilabran v0.1
This commit is contained in:
@@ -1,75 +1,129 @@
|
||||
# Kipinä Agentic Network PoC (WebGPU Edition)
|
||||
# Kipinä Agentic Network PoC
|
||||
|
||||
Tämä on hajautetun tekoälylaskennan (Agentic Compute) kokeilulaboratorio. Projekti koostuu Rust-pohjaisesta keskuksesta (Hub) ja selainpohjaisista työntekijöistä (Nodet), jotka suorittavat tekoälytensoreiden matriisilaskentaa **WebGPU**-rajapintaa ja **Burn AI** -koneoppimiskirjastoa hyödyntäen.
|
||||
Hajautettu AI-laskentaverkko selaimessa ja natiivina. Käyttäjät tarjoavat GPU/CPU-laskentatehoa avaamalla verkkosivun tai ajamalla natiivi-noden.
|
||||
|
||||
Normaalin keskitetyn palvelimen sijaan tämä kokeilu hyödyntää selaimeen kytkettyjen lukemattomien laitteiden vapaana olevaa tehokapasiteettia hajautetusti P2P-tyylillä.
|
||||
**Tuotanto:** https://kipina.studio | **Admin:** https://kipina.studio/admin
|
||||
|
||||
## Kuinka käynnistää projekti paikallisesti
|
||||
## Arkkitehtuuri
|
||||
|
||||
1. **Rakenna solmun WebAssembly-binääri**
|
||||
Paketoi Rust WebAssemblyksi (vaatii `wasm-pack`-työkalun):
|
||||
```bash
|
||||
cd node
|
||||
wasm-pack build --target web --out-dir ../static/pkg
|
||||
```
|
||||
┌─────────────────┐
|
||||
│ Hub (Axum) │
|
||||
│ :3000 / Caddy │
|
||||
│ SQLite, WS BC │
|
||||
└────────┬────────┘
|
||||
WebSocket │ WebSocket
|
||||
┌────────────────────┼────────────────────┐
|
||||
▼ ▼ ▼
|
||||
┌────────────────┐ ┌────────────────┐ ┌─────────────────┐
|
||||
│ Selainsolmu │ │ Selainsolmu │ │ Native Node │
|
||||
│ Wasm + Burn │ │ Wasm + Candle │ │ Rust + Candle │
|
||||
│ WebGPU/NdArray │ │ SmolLM/Qwen │ │ CPU/CUDA │
|
||||
└────────────────┘ └────────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
2. **Käynnistä Hub-Keskuspalvelin**
|
||||
```bash
|
||||
cd hub
|
||||
cargo run
|
||||
```
|
||||
Palvelin lähtee pyörimään ja tarjoamaan sekä WebSocket-reititintä että staattista Dashboard-sivustoa lokaalisti portissa `3000`.
|
||||
**Hub** broadcastaa tehtäviä (tokenisointiparit, LLM-promptit) kaikille solmuille WebSocketin kautta. Solmut käsittelevät vain oman tehtävätyyppinsä mukaiset viestit.
|
||||
|
||||
---
|
||||
## Cratet
|
||||
|
||||
## ⚠️ WebGPU Ota-Käyttöön -ohjeet (Linux / Mac / Win)
|
||||
| Crate | Polku | Kuvaus |
|
||||
|---|---|---|
|
||||
| `hub` | `hub/` | Axum WebSocket -palvelin, tehtävien jakelu, admin-API, SQLite |
|
||||
| `node` | `node/` | Wasm-selainsolmu: Burn (tensorit), Candle (LLM), tokenizer |
|
||||
| `native-node` | `native-node/` | Natiivi Rust-solmu: Candle LLM, NVML/wgpu GPU-tunnistus, sysinfo |
|
||||
|
||||
Selainvalmistajat rajoittavat tällä hetkellä uuden WebGPU-rajapinnan hardware-yhteyttä (fyysiseen näytönohjaimeen) turvallisuus- ja vakaussyistä, erityisesti Linuxin Wayland-ympäristöissä (kuten Pop!_OS, Ubuntu).
|
||||
### Hub (`hub/src/`)
|
||||
|
||||
Päästäksesi hyödyntämään solmun laskentatehoa selaimesi ja tietokoneesi näytönohjaimen läpi, joudut todennäköisesti pakottamaan sen käyntiin.
|
||||
- `main.rs` — WebSocket-reititin, tehtäväjakelu (10s intervalli), origin-tarkistus, IP-rajoitus, admin HTML
|
||||
- `db.rs` — SQLite: `node_sessions` + `pair_results` taulut, skeemaversiointi
|
||||
|
||||
### Chromium-pohjaiset selaimet (Google Chrome, Brave, Chromium)
|
||||
### Node (`node/src/`)
|
||||
|
||||
**Vaihtoehto 1: Käynnistys lipuilla (Suositeltu Linuxille ja Waylandille)**
|
||||
Jos Chromesi tuottaa Wasm-kaatumisia tai väittää ettei adapteria löydy, laitteesi Wayland-palvelin estää Vulkan-rajapinnan oletuksena. Käynnistä selaimesi komentoriviltä pakottamalla vanha X11-ikkunointi ja Vulkan:
|
||||
- `lib.rs` — Wasm-entrypoint, tehtävävalinta (`SELECTED_TASK`), WebSocket-handler, GPU/CPU-valinta
|
||||
- `storage.rs` — IndexedDB read/write (tokenizer, mallin painot)
|
||||
- `smollm.rs` — SmolLM 135M Candle-inferenssi (Llama-arkkitehtuuri)
|
||||
- `qwen.rs` — Qwen2.5 0.5B Candle-inferenssi (Qwen2-arkkitehtuuri)
|
||||
- `phi3.rs` — Phi-3 placeholder (liian iso selaimelle)
|
||||
|
||||
### Native Node (`native-node/src/`)
|
||||
|
||||
- `main.rs` — GPU-tunnistus (wgpu + NVML + sysfs + Apple), HF Hub -lataus, WS-yhteys
|
||||
- `inference.rs` — Qwen2.5-0.5B Candle-inferenssi, KV-cache reset per prompti, mmap-lataus
|
||||
|
||||
## Kehitysympäristö
|
||||
|
||||
```bash
|
||||
# Google Chrome
|
||||
google-chrome --enable-unsafe-webgpu --enable-features=Vulkan --ignore-gpu-blocklist --use-angle=vulkan --ozone-platform=x11
|
||||
# Vaatimukset
|
||||
rustup target add wasm32-unknown-unknown
|
||||
cargo install wasm-pack
|
||||
|
||||
# Brave Browser
|
||||
brave-browser --enable-unsafe-webgpu --enable-features=Vulkan --ignore-gpu-blocklist --use-angle=vulkan --ozone-platform=x11
|
||||
# Kehitys (Docker — Wasm buildataan automaattisesti)
|
||||
docker compose up
|
||||
|
||||
# Chromium
|
||||
chromium-browser --enable-unsafe-webgpu --enable-features=Vulkan --ignore-gpu-blocklist --use-angle=vulkan --ozone-platform=x11
|
||||
# Kehitys (ilman Dockeria)
|
||||
cd node && wasm-pack build --dev --target web --out-dir ../static/pkg && cd ..
|
||||
cargo run -p hub
|
||||
# → http://localhost:3000
|
||||
|
||||
# Native node (erillinen terminaali)
|
||||
CARGO_TARGET_DIR=target-native HUB_URL=ws://localhost:3000/ws cargo run --release -p native-node
|
||||
```
|
||||
|
||||
*(Voit halutessasi testata puhdasta testi-ikkunaa erillisen profiilin kera, lisäämällä perään `--user-data-dir=/tmp/kipin-webgpu-test` jottei asetus sotke tai ohjaudu vanhaan auki olevaan sessioosi).*
|
||||
## Viestityyypit (WebSocket JSON)
|
||||
|
||||
**Vaihtoehto 2: Sisäänrakennetun Flagin kääntö (Windows / Mac / Osittain Linux)**
|
||||
1. Kirjoita selaimen osoiteriville `chrome://flags` (tai `brave://flags`)
|
||||
2. Etsi hakusanalla **WebGPU** (Unsafe WebGPU / WebGPU Developer Features) ja vaihda tilaksi `Enabled`
|
||||
3. Etsi hakusanalla **Vulkan** ja vaihda tilaan `Enabled`
|
||||
4. Uudelleenkäynnistä selain pienen napin kautta.
|
||||
Hub → solmut:
|
||||
| Tyyppi | Kuvaus |
|
||||
|---|---|
|
||||
| `pair_task` | `{en, fi}` — tokenisointipari |
|
||||
| `llm_prompt` | `{prompt, model}` — LLM-tehtävä |
|
||||
| `stats` | `{nodes, vram_gb, tasks, version}` |
|
||||
| `node_joined` | `{node_id}` |
|
||||
|
||||
---
|
||||
Solmu → hub:
|
||||
| Tyyppi | Kuvaus |
|
||||
|---|---|
|
||||
| `auth` | Laitetiedot, `selected_task`, `allocated_gb` |
|
||||
| `pair_done` | Tokenisointitulos: `{en, fi, overhead_pct, duration_ms}` |
|
||||
| `llm_done` | LLM-tulos: `{response, tokens_generated, tokens_per_sec}` |
|
||||
| `llm_chunk` | Streaming-token |
|
||||
| `download_progress` | Mallin latauksen edistyminen |
|
||||
|
||||
### Mozilla Firefox
|
||||
## API-endpointit
|
||||
|
||||
Firefox tukee WebGPU:ta toistaiseksi vahvasti vain Nightly-versioissa, mutta sitä voi yrittää aktivoida Config-asetuksista.
|
||||
1. Kirjoita osoiteriville `about:config` ja ymmärrä riskit.
|
||||
2. Etsi `dom.webgpu.enabled` ja tuplaklikkaa arvoksi `true`.
|
||||
3. Etsi `gfx.webrender.all` ja aseta se `true`.
|
||||
4. Uudelleenkäynnistä Firefox.
|
||||
| Polku | Kuvaus |
|
||||
|---|---|
|
||||
| `GET /` | Dashboard (staattinen HTML) |
|
||||
| `GET /ws` | WebSocket-yhteys |
|
||||
| `GET /admin` | Admin-dashboard |
|
||||
| `GET /api/sessions` | Node-sessiot (JSON) |
|
||||
| `GET /api/pairs` | Tokenisointitulokset (JSON) |
|
||||
| `GET /api/stats` | Yhteenvetotilastot (JSON) |
|
||||
|
||||
*(Huomio Linux-käyttäjille: Firefox saattaa edellyttää MOZ_ENABLE_WAYLAND ympäristömuuttujaa).*
|
||||
## Tietoturva
|
||||
|
||||
---
|
||||
- **Origin-tarkistus** — vain `https://kipina.studio` ja `localhost:3000`
|
||||
- **IP-rajoitus** — max 4 WS-yhteyttä per IP, X-Forwarded-For -tuki
|
||||
- **Viestivalidointi** — pakollinen `type`, sallitut tyypit, kenttäkohtaiset rajat
|
||||
- **Viestikoko** — max 16 KB per WebSocket-viesti
|
||||
- **Caddy** — automaattinen TLS (Let's Encrypt)
|
||||
|
||||
### Apple Safari (Mac)
|
||||
## Tuotanto-deploy
|
||||
|
||||
Apple käyttää konepellin alla vahvaa omaa Metal-rajapintaansa ja tukee WebGPU:ta uudemmissa Safari-versioissa kehittäjäasetusten takaa:
|
||||
1. Varmista ensin Safarin asetuksista (Preferences -> Advanced) , että ruutu on ruksittu kohdasta `"Show Develop menu in menu bar"`.
|
||||
2. Valitse yläpalkista avautuva **Develop**-valikko -> **Feature Flags**.
|
||||
3. Etsi listalta **WebGPU** ja laita siihen täppä pelastamaan tilanne.
|
||||
4. Päivitä Dashboard-sivu.
|
||||
```bash
|
||||
# Buildaa lokaalisti, siirrä palvelimelle, käynnistä
|
||||
./deploy.sh
|
||||
|
||||
# Manuaalisesti palvelimella
|
||||
docker compose -f docker-compose.prod.yml down && docker compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
## Tiedossa olevat rajoitukset
|
||||
|
||||
- LLM-inferenssi on **greedy** (argmax) — ei temperature/top-p samplingia Wasmissa (Candlen `SoftmaxLastDim` bugi)
|
||||
- Qwen selaimessa: ~0.4 tok/s CPU — käyttökelpoinen demona mutta ei tuotantoon
|
||||
- Hub broadcastaa kaikki viestit kaikille — ei kohdennettu reititystä
|
||||
- CUDA-tuki vaatii `nvidia-cuda-toolkit` asennuksen + Cargo.toml featuren
|
||||
|
||||
## Lisenssi
|
||||
|
||||
Kipinä Technologies Oy — sisäinen projekti.
|
||||
|
||||
Reference in New Issue
Block a user