Skip to main content
The CLI is the power-user / headless path. For the standard record → train → deploy workflow, the app and web app training UI is the polished route. Reach for the CLI when you’re scripting training, working over SSH, or need to point a run at a custom ACT fork (the researcher feature).
The training_client CLI ships with Innate OS and drives the same cloud training orchestrator the robot’s training node uses. Run it on the robot over SSH (or inside the Docker container).

Setup

Source the ROS workspace so the module is importable:
source ~/innate-os/ros2_ws/install/setup.zsh
Authentication is by service key (--server defaults to Innate’s orchestrator). The robot’s training node already uses the same key; to run the CLI yourself, set it in your shell:
export INNATE_SERVICE_KEY="<your-service-key>"
# optional overrides: TRAINING_SERVER_URL, INNATE_AUTH_ISSUER_URL
Then invoke commands with python -m training_client.cli <command> (or the installed innate-training <command> shorthand). Every command takes a SKILL_DIR — a skill’s dataset directory (under ~/innate-os/workspace/custom_skills/<skill>), defaulting to the current directory. The skill’s cloud ID is read from SKILL_DIR/metadata.json, which submit writes.

Global options

OptionEnv varDescription
--server, -sTRAINING_SERVER_URLOrchestrator URL (defaults to the production server)
--token, -tINNATE_SERVICE_KEYService key — required
--issuerINNATE_AUTH_ISSUER_URLOIDC issuer; the token is exchanged for a JWT here

Typical workflow

# 1. Register the skill with the orchestrator (writes the skill ID into metadata.json)
python -m training_client.cli submit ./my-skill

# 2. Upload its dataset
python -m training_client.cli upload ./my-skill

# 3. Launch a training run with a server-side preset
python -m training_client.cli run ./my-skill --preset act-default

# 4. Watch it until it finishes
python -m training_client.cli watch ./my-skill <run-id>

# 5. Download results, then activate the trained checkpoint so the robot loads it
python -m training_client.cli download ./my-skill <run-id>
python -m training_client.cli activate ./my-skill <run-id>

Commands

CommandDescription
submit [SKILL_DIR]Create (or reuse) a cloud skill from the dataset dir; writes training_skill_id to metadata.json
upload [SKILL_DIR]Upload the skill’s data files
run [SKILL_DIR]Launch a training run (options below)
status [SKILL_DIR] RUN_IDPrint a run’s current status
watch [SKILL_DIR] RUN_IDPoll a run until it completes (--interval seconds, default 20)
runs [SKILL_DIR]List all runs for the skill
skillsList all your skills
download [SKILL_DIR] RUN_IDDownload a completed run’s results (--dest for the output dir)
fetch-data [SKILL_DIR]Download the skill’s input training data (--dest)
activate [SKILL_DIR] RUN_IDSet the trained checkpoint + stats file into metadata.json so the robot loads it

Launching a run

run takes a server-side preset, a fully custom configuration, or a preset with overrides:
OptionDescription
--presetServer-side preset (e.g. act-default) — pre-fills everything below
--repoGitHub owner/repo of a custom ACT fork to train with
--refBranch, tag, or commit in that repo
--command, -cTraining command parts (repeatable)
--env, -eEnvironment variables as KEY=VALUE (repeatable)
--gpu-typeGPU type (e.g. H100)
--min-gpus / --max-gpusGPU count bounds
--hoursEstimated duration
--budgetMax total cost in USD
--checkpoint-patterns, -pGlobs for which output files to upload (e.g. checkpoints/**/*.pt)
A preset is the quickest path; override individual values as needed:
python -m training_client.cli run ./my-skill --preset act-default --max-gpus 4 --budget 500

Custom ACT fork

The headline power-user feature: point a run at your own fork of the ACT training code — change the architecture or loss, then train against it with no server-side changes.
python -m training_client.cli run ./my-skill \
    --repo innate-inc/ACT-test \
    --ref lambda_refactor \
    -c "pip install -r requirements.txt; python3 -m act_test.train_dist --data-dir /data/dataset" \
    --hours 8 --gpu-type H100 --min-gpus 1 --max-gpus 2 \
    --budget 200