Skip to content

About

Local Fully Open, Open-Weight, Open-Data, Verifiable LLMs

Resources

Code of conduct

Contributing

Security policy

Stars

21 stars

Watchers

0 watching

Forks

OpenVerifiableLLM:
Language models you can check yourself

OpenVerifiableLLM logo: a speech bubble with a check mark

OpenSSF Scorecard OpenSSF Best Practices Best Practices Discord License: GPL-3.0

When a model is published, you usually have to trust how it was made. OpenVerifiableLLM makes the training itself the evidence: anyone with the same GPU type can recompute any part of the training and get exactly the same bits.

The first release is a 23.1M-parameter model, trained on one exact pass over all of English Wikipedia. Its training was saved at 38 points and so split into 37 pieces, called segments. Every segment was recomputed bit for bit on a second machine. The other terms are defined below. Model on Hugging Face · Data and training record · Releases · ollama run ryoari/openverifiablellm

Terminal session: the published weights match chain entry 37, and a recomputed training segment matches. Follow the link to check one yourself.

What is shown

  • 37 of 37 segments recomputed bit for bit (by the project, on a second RTX 5090)
  • The training data rebuilds byte for byte from the raw Wikipedia dump
  • The record is timestamped by two independent authorities (20 Oct 2026)
  • A fork that provably never trained on one article

What is not shown

  • That the model's answers are true. It is small and often wrong
  • That it works on other GPUs. Bits match only on the training GPU type
  • An independent check. No one outside the project has checked a segment yet

Words used here

Word Meaning
checkpoint A saved copy of the full model and optimizer state
boundary A point in training where a checkpoint is saved. This run has 38
segment The training between two boundaries. This run has 37. Each one takes about 20 minutes on one GPU
chain entry One line of chain.jsonl, written at each boundary: the training position, a SHA-256 of the full state, and the hash of the previous entry
chain head The hash of the last chain entry. It fixes the whole record
anchor anchor.json: the chain head and the release's file hashes, timestamped by DigiCert and FreeTSA (RFC 3161)
consistency check A check on a laptop: the released files match the timestamped record. It recomputes no training
verification Recomputing a segment from its checkpoint and comparing the result bit for bit

Getting started

1. Try the model (2 minutes). This checks nothing; it is a demo.

ollama run ryoari/openverifiablellm "Tell me about the Moon."

2. Consistency check, no GPU (10 minutes). Needs Python 3.12 or newer, git, openssl, sha256sum and network access. On macOS, sha256sum comes with brew install coreutils (as gsha256sum).

pip install huggingface_hub torch numpy
hf download AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence \
  --repo-type dataset --include "release/simple-run/*" --exclude "*/ckpt-*" --local-dir ovl
cd ovl/release/simple-run
sha256sum -c --ignore-missing release-hashes.txt
git clone -q --depth 1 --branch v1.1.0 https://github.com/AOSSIE-Org/OpenVerifiableLLM ovl-code
OVL_DEVICE=cpu python ovl-code/simple/ovl.py verify --run . --weights conversation-model.pt
# anchor anchor.json: chain head MATCH (38 entries)
# anchor timestamp freetsa: OK (Oct 20 14:38:43 2026 GMT)
# anchor timestamp digicert: OK (Oct 20 14:38:43 2026 GMT)
# weights conversation-model.pt: MATCH chain entry 37

Use ovl.py from the v1.1.0 tag (v1.0.2 or newer works too). The copy in the download's code/ folder is older and does not check the anchor.

3. Verification, on an RTX 5090 (about 1 hour, about US$1.50). Deploy the RunPod template, wait, and read the last line of the log. Then terminate the pod. Post the line in Discord: every independent check counts.

All the details, including macOS and checking by hand: docs/verify.md.

How it works

 raw Wikipedia dump ──rebuild──▶ prepared tokens ──┐
                                                    ▼
 entry 0 ─▶ entry 1 ─▶ entry 2 ─▶ … ─▶ entry 37     chain.jsonl: each entry hashes the full
   │          │          │                │          model + optimizer state, the data
 ckpt 0     ckpt 1     ckpt 2    …     ckpt 37       position and the previous entry

 check segment k:  load ckpt k ─▶ train to boundary k+1 ─▶ compare with entry k+1, bit for bit

Training is deterministic (fixed seed, deterministic CUDA kernels, no TF32). Every step checks that its data continues exactly where the previous step stopped. So recomputing a segment gives the same bits, and checking all 37 verifies the whole training. Segments are independent: many people can check different segments at the same time.

Method, results, cost and lessons: docs/how-it-works.md.

Repository

Path What it is
simple/ All the code: ovl.py (train, verify, fork, chat) and the scripts around it
tests/ Tests for simple/. They run on a CPU
docs/ How it works, verify, roadmap, the GSoC 2026 report
audit/ Outside reviews and our responses
security-reviews/ Security reviews and their fixes
requirements/preparation.lock The hash-locked CPU environment that CI installs
brand/ Logo, colours and typography

Join us

OpenVerifiableLLM is an AOSSIE project, licensed under GPL-3.0. It follows AOSSIE's code of conduct.

About

Local Fully Open, Open-Weight, Open-Data, Verifiable LLMs

Resources

Code of conduct

Contributing

Security policy

Stars

21 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages