zxell.ai
This is an internal project report edited for publication, translated from the Japanese original. Server operations and security details, and details of the corpus, are omitted; omissions are marked in the text.

zxell.ai Roadmap (clean copy v2)

Date: 2026-08-12 (revised: 2026-09-05 = section 10, 2026-10-04 = section 11) Original: the roadmap planning document (2026-08-10) This document is a clean copy of the original, updated with the decisions made afterwards (the review01–08 exchanges) and the values measured in phase 0.


1. Project goals and success criteria

1.1 Goals (three layers)

  1. Model layer: build a language model from scratch, trained on a news corpus (English, German, French, Japanese; about 8 million articles)(no pretrained models. The model is implemented in-house; using a framework such as PyTorch is allowed — decided).
  2. Distribution layer: spread the work across several low-spec clients so that training works without a high-end GPU.
  3. Knowledge layer: experience and measure "how intelligent did it become", and obtain quantitative knowledge about the relation: data volume × compute × distribution scheme → capability.

The deliverable is not only "the model itself" but also "quantitative knowledge of how far one can get on a low budget in a distributed setting". The comparison target (a single-machine baseline) and the measurement methods are built into the design from the start.

1.2 Success criteria

AreaMetricTarget
Model capabilityValidation perplexity (per language)Within 10% of a same-size model trained on a single machine
Model capabilitySummarization quality (ROUGE-L / BERTScore + human)Quantitative evaluation on pairs of article + attached summary (description)
Model capabilityQA on facts in the corpusAccuracy on a self-made QA set
Distribution efficiencyScaling with machine countObtain the throughput curve against the number of machines
Distribution efficiencyCommunication volume / training tokens1/100 or less of synchronous data parallelism
OperationsTolerance to dropoutsTraining continues when any client goes down
VisualizationOperations dashboardShows tasks, clients, loss, and throughput (for the administrator)

2. Decisions (decision log)

The policies decided in review01–08. All later design assumes these.

#ItemDecisionSource
1Legal policyClosed operation (clients limited to self-managed machines) / only tokenized, shuffled, packed shards are distributed / no open call for participants until the legal questions are settledreview01
2Initial clientsTwo Windows machines (NVIDIA GeForce GTX 1050, 2GB VRAM × 2). More to be considered as things progressreview01, 08
3Central serverSelf-hosted (the current machine). Published at https://api.zxell.ai (omitted: how the public route is set up)review04–08
4Model sizesThree stages: S (≈30M) / M (≈125M) / L (≈500M). The final target is L: 500Mreview01
5ImagesNot used for training in the first period (inventory only, done. A candidate for the second period)review01, 03
6What is publicOnly the code is public (GitHub zxell-ai/zxell to be made public). Training visualization, weights, and data are for the administrator/developerreview01, 08
7Repository layoutMonorepo. zxell_server/ + zxell_client/ (planned). The private folder is not tracked by Gitreview02, 08
8Data sourceRead feed_items in MySQL directly (no snapshot). Ignore content_alive/content_locked and use every rowreview03, phase0
9How fields are usedBody = content_text, summary = description, language = first 2 characters of feed_channels.language. title is used as is, truncated at varchar(100)review03
10DeduplicationPrimary key = link (auxiliary = guid. guid is empty in 21.6% of rows)review03, phase0
11Handling of JapaneseAll languages mixed at their natural ratio + for Japanese only, concatenate title + description + content_text (other languages use content_text only)phase0
12Storage(omitted: storage locations on the server)review02, phase0, 2026-10-02
13AuthenticationClient registration is approval-gated (pending → approved). Every API, including /api/status, requires authenticationreview02, 03
14What is publicPublish the code + the development log (edited version) (extended from "code only" in review01). The development log is edited from the reviews by respecting the original text and only removing: server operations, incident response, security information, details of the corpus, and personal matters. Legal matters: decisions only. Weights, data statistics, and the dashboard stay private. Published at https://zxell.ai/devlog/devlog_publish_plan.md, 2026-10-02
15TokenizerSentencePiece BPE with a 48k vocabulary (64k cuts the token count by only 3% while making the S model's embedding 33% larger)review13, 19
16train/val/test splitPer language, by article count: for each language the newest 8,000 articles go to test, the 3,000 before them to val, and the rest to train (a single cut-off date for all languages leaves val/test with Japanese only)review20
17ShardsOne shard = a fixed 50 million tokens (about 100MB as uint16). train is shuffled at the article level before being cut (every shard has nearly the same language mix as the whole)review22
18Order of phases 1 → 2Phase 1 = the S baseline on the RTX 3060 alone (the yardstick for comparison; shards are fetched through the API) → phase 2 = the same S with FedAvg across 3060 + 1050, distributed through the APIreview22

3. Quantitative assumptions (updated with phase-0 measurements)

3.1 Measured corpus values (inventory of 2026-08-11. Details: the phase-0 data inventory report)

The original estimate (6–9B effective tokens) is confirmed by measurement at 6.5B. No change to the working hypothesis is needed.

3.2 Token count → model size

SizeParametersConfiguration (approx.)ctxRole
S≈30M6 layers / d=384 / 6 heads1024Pipeline verification, smoke tests, teaching material
M≈125M12 layers / d=768 / 12 heads1024Main testbed for comparing distribution schemes
L≈500M24 layers / d=1280 / 20 heads2048Final target (all data)

Multilingual BPE with a 48k–64k vocabulary; the embedding and the LM head share weights.

3.3 Compute re-estimate (assuming GTX 1050 2GB × 2) [revised downward from the original]

A GTX 1050 peaks at ≈1.8 TFLOPS in FP32 and has no Tensor Cores. At 30% MFU that is ≈0.5 effective TFLOPS per machine (about 1/8 of the original's assumption of "a mid-range GPU with 4 effective TFLOPS"). Training FLOPs ≈ 6 × parameters × tokens.

ModelTokensTotal FLOPs2 machines (1 effective TFLOPS combined)
S: 30M3B5.4e17about 6 days
M: 125M6.5B4.9e18about 57 days
L: 500M6.5B2.0e19about 230 days (unrealistic)

On top of that, the 2GB VRAM constraint:

Conclusion: with the two machines on hand, run S to completion and go as far as demonstrating the distribution scheme. The full comparison experiments on M and the production training of L presuppose more GPU clients (several with 6GB VRAM or more). This further strengthens the conclusion of section 2.3 of the original, "L is unrealistic without distribution", and the machine count is written into the gate condition between phases 3 and 4 (section 6).

3.4 Communication volume

The gradient of a 500M model is ≈1GB in fp16. Synchronous data parallelism does not work over a home connection (as in the original). The policy stays: H local steps → send the difference (pseudo-gradient) at low frequency, with 8-bit quantization + top-k sparsification to compress it to 1/100–1/500, synchronizing once every 30–60 minutes.


4. Architecture

4.1 Overall structure (hub and spoke. Updated to what is actually running)

[Central server]  https://api.zxell.ai
  (omitted: how the public route is set up)
  ├─ Coordinator API (FastAPI): registration approval / task leasing / receiving results
  ├─ Parameter server: weight_versions (with checksums) + outer optimization (to be implemented)
  ├─ Storage (shards, weights, artifact Δ)
  ├─ PostgreSQL 16: clients / tasks / results / weight_versions
  └─ Dashboard (to be implemented. Based on /api/status, with an admin key)

[Clients] (for now two Windows machines, GTX 1050 2GB)
  ├─ GPU worker: GET weights → GET shard → H local steps → POST Δ
  └─ CPU worker: preprocess / eval / verify tasks

4.2 Server implementation status (the 8 items of section 3.6 of the original → all implemented and committed)

Leased task hand-out (FOR UPDATE SKIP LOCKED, automatic re-queue on expiry, max_attempts), persistent results (metrics JSON + artifact files), approval-gated client authentication (X-API-Key) + admin API (X-Admin-Key), settings via environment variables (pydantic-settings, required), Pydantic v2, weight versioning and distribution, shard distribution. Task types are preprocess / train / eval / verify. A train result requires base_weight_version (the basis for handling staleness). It has passed a smoke test of 15 items plus 2 missing-auth-header items against a real PostgreSQL.

4.3 Distributed training scheme (keeps the recommendation of section 3.2 of the original)

The DiLoCo style (Local SGD + outer Nesterov momentum) is the main candidate, introduced in stages: an MVP with FedAvg (plain averaging) → outer optimization → Δ compression (8-bit / top-k). How quality changes as the scheme is swapped is itself knowledge this project produces. The non-IID countermeasure (random shard assignment so that every client sees every language) and the staleness countermeasure (attach the base weight version; decay or discard) are also as in the original.

4.4 Client v1 (next to be implemented)


5. Data pipeline (reflecting what phase 0 found)

  1. Normalization: remove newlines and tabs from link/guid (11 thousand measured), normalize the character encoding, check for HTML residue.
  2. Deduplication: link as the primary key (5.3% duplicates), guid as auxiliary. Near-duplicate removal with MinHash/SimHash, as a countermeasure against duplicated news-agency copy, will be decided after measuring its effect in phase 1.
  3. Concatenation for Japanese: for ja only, concatenate title + description + content_text (decision 11).
  4. Tokenization → sharding: multilingual BPE (48k–64k) → fixed-length packing (1024/2048) → shards of tens to hundreds of MB + checksum + metadata (language mix, token count). Location: the server's storage.
  5. Split: take time into account (put the final few months into test so that "summarize a new article" is evaluated naturally).
  6. Distribute the preprocessing itself as preprocess tasks, as the first real operational test of the distributed infrastructure.
omitted: a note about the server's disk (server operations)

6. Phase plan (position when written: phase 0 complete. See section 11 for the latest)

Phase 0: quantitative understanding and legal groundwork — ✅ done (2026-08-11)

Phase 1: single-machine baseline (3–6 weeks) ← next

Phase 2: distributed infrastructure MVP (4–8 weeks)

Phase 3: low-communication scheme and comparison experiments (4–8 weeks)

Phase 4: production training and the experience side (6–12 weeks)

Phase 5: publishing what was learned and deciding on extensions


7. Risks (the main ones. Updated from section 5 of the original to match the current state)

RiskCurrent assessmentResponse
Redistribution of article text (copyright)Avoided for now by closed operation + distributing tokenized shards (decided)Revisit when opening up. Publishing the code is already separated from the data
2GB VRAM constraintMaterialized (3.3). M and above are hard on the current machinesDemonstrate with S → GPU expansion set as the phase-3 gate
Non-IID, stalenessNot yet verifiedRandom shard assignment, version attachment with decay (phases 2–3)
Malicious or faulty clientsLow risk for now, as only self-managed machines take partVerification mechanisms are implemented in phase 3
Training divergence (low-frequency synchronization)Not yet verifiedExplore hyperparameters on S/M before L (keep strictly to this order)
Reproducibility—Full logging of seeds, assignments, and Δ history
omitted: two rows of the table (risks concerning the network line and the server's disk)

8. Publication policy (decision 6 in concrete terms)

9. References

DiLoCo / Local SGD / FedAvg / Branch-Train-Merge / Hivemind / Petals / BOINC / Chinchilla / nanoGPT / Spreadsheets are all you need (same as section 8 of the original).


10. Revision of 2026-09-05: move to a new server and a change in the client line-up

10-1. What happened (review16–18 and after)

10-2. Client line-up (update to decision 2)

Two machines: RTX 3060 (12GB, Ubuntu Server) + GTX 1050 (2GB, Windows). (One of the 1050s was retired and a 3060 obtained in its place. The 3060 has also passed memtest.)

Training targetOld estimate (1050 × 2)New line-up
S (30M)about 6 days3060 alone about 1 day / distributed experiments on 3060 + 1050
M (125M)about 57 days (barely fits in 2GB)3060 alone about 1 week (does not fit on the 1050)
L (500M)about 230 days (unrealistic)3060 alone about 1 month — now feasible

10-3. Rebuilding phase 1 (as of 2026-09-05)

Everything the faulty-RAM machine produced under work/ was discarded and rebuilt on the new server:

Next: implement the S (30M) model → single-GPU baseline on the 3060 (the completion check for phase 1).


11. Revision of 2026-10-04: phase-1 preprocessing finalized and the S model implemented

11-1. Shards v2 — a new split method and deduplication for Japanese (2026-09-27, review19–21)

LanguageLast pub_datetest startsval starts
en2023-05-282023-05-242023-05-23
de2023-05-282023-05-212023-05-18
fr2023-05-282023-05-132023-05-09
ja2024-02-122023-11-212023-10-19
SplitShardsTokensArticlesLanguage mix (tokens)
train1226.068B7,448,909en 64.8% / de 21.9% / fr 10.0% / ja 3.2%
val110.2M11,129en 61.2% / de 14.1% / fr 14.0% / ja 10.7%
test127.2M30,171en 60.1% / de 14.7% / fr 14.3% / ja 10.9%
Total1246.106B7,490,209

11-2. Implementation of the model (2026-09-29, review22–23)

The model and its training, evaluation, and generation code were implemented in zxell_model/ (RMSNorm, RoPE, causal self-attention, SwiGLU, weight sharing between the embedding and the LM head. AdamW, warmup + cosine, bf16, checkpoint/resume, per-language perplexity evaluation).

presetlayers / d_model / heads / ctxParametersOf which non-embedding
S6 / 384 / 6 / 102429.1M10.6M
M12 / 768 / 12 / 1024121.8M85.0M
L24 / 1280 / 20 / 2048537.3M475.9M

11-3. Plan for the S baseline and the path to phase 2 (decision 18)

ItemValue
ConfigurationS (29.1M), batch 32 × ctx 1024 = 32,768 tokens/step
Amount of training90,000 steps ≈ 2.95B tokens (about half of train)
Time (expected)About 1 day on the RTX 3060 (about 35,000–40,000 tokens/second)
EvaluationPer-language PPL on val every 500 steps, all of val at the end. test after completion

In phase 2 the same S is trained with FedAvg on two machines (3060 + 1050), distributed through the API. Processing one shard (50 million tokens) takes about 21 minutes on the 3060 and about 5 hours on the 1050, which exceeds the lease (1 hour), so tasks for the 1050 are cut finely by token range within a shard.

11-4. Publication (carrying out decision 14)

11-5. Current position (2026-10-04): phase 1 in progress

Phase-1 itemStatus
Tokenizer (48k)Done
Preprocessing pipeline and shards (v2)Done
S/M/L models with training and evaluation codeDone (CPU smoke test passed)
Evaluation harnessPer-language perplexity is implemented. ROUGE and QA not started
S baseline training (RTX 3060)Not started (begins with setting up the 3060 machine and registering it as a client)

Remaining: set up the 3060 machine → S baseline training (about 1 day) → check per-language PPL on test and generated samples → the phase-1 completion check ("S generates reasonable text and evaluation runs automatically") → phase 2 (replace the client's train task with real local training and run FedAvg on two machines).