Skip to content
AttuneSN58
All pages

Validating

Running a validator

One GPU host with three Python environments: the simulator, the policy runtime and the subnet. How to set it up, check it, run it, and what it costs.

2 min read

What a validator does

A validator reads commitments from the chain, keeps the queue, plays each entry's duel against the reigning king on its own GPUs, writes the result to an append-only store, and sets weights for the champions and the Horizon vault every 360 blocks. Nothing a miner submits is executed: the validator serves every entry with its own runtime, from weights it has checked against the pinned architecture.

The host

One host with an NVIDIA GPU and three Python environments, kept apart because the simulator and the policy runtime pin different stacks:

EnvironmentPythonHolds
Simulator3.10RoboTwin-Vector (robotensor_bench/scripts/install_robotwin.sh) and vector-protocol
Policy3.12torch 2.8.0 with CUDA 12.8, vector-runtime[model] and vector-protocol
Host3.12robotensor, vector-orchestrator and vector-runtime

One evaluation unit, a simulator and a policy server together, used up to 34 GB of GPU memory in our measurements. The number of units each card runs at once is the workers setting, one by default; an 80 GB card can run two.

Setup

bash
git clone -b vector https://github.com/robotensor/RoboTwin-Vector.git
git clone https://github.com/robotensor/vector-orchestrator.git
git clone https://github.com/robotensor/attune-subnet.git

uv venv --python 3.12 .venvs/subnet
uv pip install --python .venvs/subnet/bin/python -e attune-subnet -e vector-orchestrator \
    -e vector-orchestrator/packages/vector-protocol -e vector-orchestrator/packages/vector-runtime

Point the [vector] table of config/<network>.toml at the two other environments and at your wallet:

toml
network = "finney"
netuid = 58
wallet = { name = "validator", hotkey = "default" }

[vector]
policy_python = "/abs/.venvs/vector-policy/bin/python"
simulator_python = "/abs/.venvs/robotwin/bin/python"
simulator_root = "/abs/RoboTwin-Vector"
workers = 1        # units per GPU at once
mirror = ""        # a Hugging Face dataset to mirror the result store to, if any

On a rented GPU pod, docker/build.sh in attune-subnet builds an image with all three environments, the simulator's assets and the checkouts; run pod-check --selftest on a new pod.

Weights

Every tempo the validator sets weights for the whole subnet, not only for Vector: Vector's 30% goes to its four latest champions, and 70% goes to the Horizon vault, one hotkey fixed in the subnet's code per network. Emission and the split says how, and what happens to a share that has no one to go to. weights --dry-run shows both parts.

Run

bash
export HF_TOKEN=...
attune validator --config config/<network>.toml run

Once it runs:

CommandWhat it does
attune validator … statusThe queue, the king and the champions
attune validator … weights --dry-runThe weights the validator would set now, without setting them
attune validator … duel --challenger owner/name@shaRun one duel by hand

An interrupted duel resumes from the validator's data directory (var/<network>/), with its seed block kept.

Cost

A duel plays 240 (15 × 16 tasks) per side and gets at most 24 h of work; units still unplayed when that runs out are void. Every entry is the same network doing the same work per prediction, so a duel's cost does not depend on whose weights it plays. The per-unit limits are on What you submit.