Skip to content
Tenzro
← All tutorials
Tutorial · Inference and training

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.

Advanced30 min

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 tenzro CLI 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:// or https://.
  • 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.

bash
tenzro iroh publish --file shard-0.parquet
# tenzro://blob/<hash>

2. Choose a trust tier, an aggregation rule and an objective

SettingOptionsWhen to use it
TierOpen, Verified, ConfidentialOpen 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.
AggregationMean, LoraAlternating, TrimmedMean, CoordinateMedian, KrumMean and LoraAlternating (for LoRA adapter runs) work on every tier. The Byzantine-robust rules are available on Verified and Confidential.
Objective"Supervised", "ChatSft", RlPostTrainingSupervised 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.

json
{
  "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.

bash
tenzro train post-task --spec task.json --rpc https://rpc.tenzro.xyz

Expected output:

Post Training Task
  Task posted!
  Task ID: forecast-gpu-util-2026-10
  Status:  registered

5. 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.

bash
tenzro train list-runs --rpc https://rpc.tenzro.xyz
tenzro train get-run --task-id forecast-gpu-util-2026-10 --rpc https://rpc.tenzro.xyz

To see what the syncer will do with the current round, ask it:

bash
tenzro train decide-round --task-id forecast-gpu-util-2026-10 --rpc https://rpc.tenzro.xyz
# Decision: wait | finalize | no_quorum

6. 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.

bash
tenzro train get-receipt --task-id forecast-gpu-util-2026-10 --rpc https://rpc.tenzro.xyz

Until 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