Post a training task
Sponsor a decentralised training run on Tenzro Network 1: write a task spec, choose a trust tier and objective, escrow the reward and read the receipt.
Tenzro Train runs data-parallel training across independent machines. Each trainer runs a number of local optimiser steps on its shard, then submits an outer gradient; a syncer aggregates the gradients of each round under a rule you choose and a witness committee finalises the round. Every round is replayable from its seed, so any contribution can be checked by re-running it. This tutorial covers the sponsor side: you describe the run, post it and read the result.
Prerequisites
- The
tenzroCLI installed and a Tenzro account with TNZO for the reward pool. Create one in the console. - A dataset published to the network's content-addressed store, or reachable over
ipfs://,ar://orhttps://. - Background: Training on Tenzro.
1. Publish the dataset
Publish each shard into the network's content-addressed store. Transfers are verified against the content hash, and trainers fetch shards by that address.
tenzro iroh publish --file shard-0.parquet
# tenzro://blob/<hash>2. Choose a trust tier, an aggregation rule and an objective
| Setting | Options | When to use it |
|---|---|---|
| Tier | Open, Verified, Confidential | Open admits any bonded trainer and assigns fragments redundantly. Verified requires a TEE attestation at enrolment. Confidential keeps data inside attested enclaves, sealed to their keys. |
| Aggregation | Mean, LoraAlternating, TrimmedMean, CoordinateMedian, Krum | Mean and LoraAlternating (for LoRA adapter runs) work on every tier. The Byzantine-robust rules are available on Verified and Confidential. |
| Objective | "Supervised", "ChatSft", RlPostTraining | Supervised loss on labelled shards; chat fine-tuning on agent trajectories (see Fine-tune on agent trajectories); or GRPO-style reinforcement learning with a reward function you supply. |
You also set the number of trainer slots (trainer_count), the quorum per fragment (quorum), local steps between syncs (inner_steps), the number of rounds (max_rounds) and a grace window for stragglers (grace_window_ms). Optional settings cover gradient quantisation (Int8, Int4), streaming sync of one parameter shard per round, and a per-gradient L2-norm cap.
3. Write the task spec
Save the spec as task.json. This example fine-tunes a TimesFM-class forecaster on the Open tier. The spec below is abridged: the full spec also carries your sponsor address, the dataset's manifest hash and the creation time, which you take from your account and from the published dataset.
{
"task_id": "forecast-gpu-util-2026-10",
"sponsor_did": "did:tenzro:human:<your-id>",
"architecture": {
"family": "timesfm",
"param_count": 200000000,
"modality": "Timeseries",
"fragment_count": 8,
"dtype": "bf16",
"metadata": {}
},
"tier": "Open",
"aggregation": "Mean",
"clip_l2_norm": 1.0,
"sync_strategy": "Full",
"quantization": { "Int8": { "block_size": 256 } },
"delayed_apply": false,
"pipeline": null,
"trainer_count": 8,
"quorum": 5,
"inner_steps": 100,
"max_rounds": 50,
"grace_window_ms": 120000,
"reward_pool": "<attoTNZO>",
"dataset_ref": "tenzro://blob/<hash>",
"min_throughput": null,
"objective": "Supervised",
"metadata": { "inner_optimizer": "adamw" }
}The reward pool is escrowed when you post; any unspent remainder is refunded to your sponsor address when the run closes.
4. Post the task
Posting escrows funds, so it is an owner call: the CLI signs it with your account's hardware-rooted key.
tenzro train post-task --spec task.json --rpc https://rpc.tenzro.xyzExpected output:
Post Training Task
Task posted!
Task ID: forecast-gpu-util-2026-10
Status: registered5. Watch trainers enrol and rounds advance
Trainers enrol themselves; you only watch. get-run shows the run's status, current round, enrolled trainers and the latest state root.
tenzro train list-runs --rpc https://rpc.tenzro.xyz
tenzro train get-run --task-id forecast-gpu-util-2026-10 --rpc https://rpc.tenzro.xyzTo see what the syncer will do with the current round, ask it:
tenzro train decide-round --task-id forecast-gpu-util-2026-10 --rpc https://rpc.tenzro.xyz
# Decision: wait | finalize | no_quorum6. Read the receipt
When the final round is finalised, the syncer seals a receipt. It records your task spec verbatim, the state root of every round, the final model hash, each trainer's contribution count and reward share, and a Merkle root over the whole run.
tenzro train get-receipt --task-id forecast-gpu-util-2026-10 --rpc https://rpc.tenzro.xyzUntil the run completes, the command prints No sealed receipt for this task yet.
Because every round is replayable from its seed, you or anyone else can re-run a trainer's local steps from the same checkpoint and shard and compare the result with what it submitted. A mismatch evicts the trainer and drops its gradient. See Train and finalize for the challenge flow.
Next steps
- Run the trainer side yourself: Train and finalize.
- Fine-tune a model on your agents' conversations: Fine-tune on agent trajectories.
- Offer your GPUs to runs: Run a trainer node.
- The objective and replay model: Training for agents.