On-demand GPU clusters and training jobs with git-style interface. Use when you need multi-node GPU clusters (B200, H200, H100), persistent NFS storage, or batch training jobs with the TensorPool CLI.
68
83%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
On-demand GPU clusters and git-style training jobs via the tp CLI. TensorPool provides multi-node GPU clusters with high-speed interconnects, persistent storage, and SLURM for distributed training.
Use TensorPool when:
tp job push to submit, tp job pull to get resultsKey features:
tp job push/pull/listen for batch experimentsUse alternatives instead:
| Task | Platform |
|---|---|
| SFT / LoRA fine-tuning | Tinker (default) |
| Hosted RL with environments | Prime Intellect Lab |
| On-demand GPU clusters with SSH | TensorPool |
| Batch training jobs (git-style) | TensorPool |
| Multi-node distributed training | TensorPool or Lambda (1-Click Clusters) |
| Serverless auto-scaling | Modal |
| Multi-cloud cost optimization | SkyPilot |
Credentials are auto-injected by openscience when connected via the dashboard.
# Verify credentials
[ -n "$TENSORPOOL_KEY" ] && echo "TENSORPOOL_KEY set" || echo "NOT SET"If not set: connect TensorPool at https://app.syntheticsciences.ai -> Services, then restart openscience.
pip install tensorpool# Set API key (synced automatically via OpenScience dashboard)
export TENSORPOOL_KEY="your_api_key_here"
# Verify
[ -n "$TENSORPOOL_KEY" ] && echo "set" || echo "not set"If connected via the Synthetic Sciences dashboard, TENSORPOOL_KEY is injected automatically.
# Single H100
tp cluster create -i ~/.ssh/id_ed25519.pub -t 1xH100
# Check status
tp cluster info <cluster_id>
# SSH in
tp ssh <instance_id>
# Destroy when done
tp cluster destroy <cluster_id># Initialize job config
tp job init
# Edit tp.config.toml, then push
tp job push tp.config.toml
# Stream logs
tp job listen <job_id>
# Download results
tp job pull <job_id>| Instance Type | Multi-Node Support |
|---|---|
1xB300 / 2xB300 / 4xB300 / 8xB300 | No |
1xB200 / 2xB200 / 4xB200 / 8xB200 | Yes (8xB200) |
1xH200 / 2xH200 / 4xH200 / 8xH200 | Yes (8xH200) |
1xH100 / 2xH100 / 4xH100 / 8xH100 | No |
1xL40S | No |
32xCPU / 64xCPU | No |
| GPU | Price |
|---|---|
| B300 SXM | $5.49/hr |
| B200 SXM | $4.99/hr |
| H200 SXM | $2.99/hr |
| H100 SXM | $1.99/hr |
| L40S | $1.49/hr |
| CPU | $0.015/hr |
All charges prorated to the second.
# Various GPU configs
tp cluster create -i ~/.ssh/id_ed25519.pub -t 1xH100
tp cluster create -i ~/.ssh/id_ed25519.pub -t 8xH200
tp cluster create -i ~/.ssh/id_ed25519.pub -t 8xB200
tp cluster create -i ~/.ssh/id_ed25519.pub -t 1xL40S
# With custom name
tp cluster create -i ~/.ssh/id_ed25519.pub -t 1xH100 --name my-clusterMulti-node clusters come with SLURM preinstalled. Only 8xH200 and 8xB200 support multi-node.
# 2-node cluster (16 GPUs total)
tp cluster create -i ~/.ssh/id_ed25519.pub -t 8xH200 -n 2
# 4-node cluster (32 GPUs total)
tp cluster create -i ~/.ssh/id_ed25519.pub -t 8xB200 -n 4Multi-node architecture:
{cluster_id}-jumphost — SLURM login/controller, public IP{cluster_id}-0, {cluster_id}-1, etc. — private IPs only# SSH into jumphost first
tp ssh <jumphost-instance-id>
# From jumphost, access workers
ssh <cluster_id>-0
ssh <cluster_id>-1tp cluster list # List all clusters
tp cluster list --org # List organization clusters
tp cluster info <cluster_id> # Detailed cluster info
tp cluster edit <cluster_id> --name "new-name"
tp cluster edit <cluster_id> --deletion-protection true
tp cluster destroy <cluster_id> # Terminate clusterPENDING → PROVISIONING → CONFIGURING → RUNNING → DESTROYING → DESTROYED
If any instance fails, cluster shows as FAILED.
Git-style interface for running training experiments on GPUs. Pay only for the time your job runs.
commands = [
"pip install -r requirements.txt",
"python train.py --epochs 100",
]
instance_type = "1xH100"
outputs = [
"checkpoints/",
"model.pth",
"results.json",
]
ignore = [
".venv",
"venv/",
"__pycache__/",
".git",
"*.pyc",
]tp job init # Create tp.config.toml
tp job push tp.config.toml # Submit job
tp job list # List your jobs
tp job list --org # List org jobs
tp job info <job_id> # Job details
tp job listen <job_id> # Stream real-time logs
tp job pull <job_id> # Download output files
tp job pull <job_id> --force # Overwrite existing files
tp job cancel <job_id> # Cancel running job
tp job cancel <job_id> --no-input # Skip confirmationPending → Running → Completed / Error / Failed / Canceled
# Create multiple configs
tp job init # → tp.config.toml (rename to tp.baseline.toml)
tp job init # → tp.config1.toml (rename to tp.experiment.toml)
# Run different experiments
tp job push tp.baseline.toml
tp job push tp.experiment.tomlHigh-performance NFS for multi-node clusters. Up to 300 GB/s aggregate read throughput.
# Create 500GB shared volume
tp storage create -t shared -s 500 --name training-data
# Attach to cluster
tp cluster attach <cluster_id> <storage_id>
# Access on cluster at /mnt/shared-<storage_id>
# Detach
tp cluster detach <cluster_id> <storage_id>
# Destroy
tp storage destroy <storage_id>Shared storage: Multi-node only (2+ nodes), $100/TB/month, POSIX compliant.
# Create object storage bucket
tp storage create -t object --name models
# Attach to any cluster type
tp cluster attach <cluster_id> <storage_id>
# Mount at /mnt/object-<storage_id> (FUSE)
# Prefer boto3/rclone over FUSE mount for performanceObject storage: All cluster types, $20/TB/month, globally replicated, no ingress/egress fees. Not POSIX compliant.
tp storage create -t <type> [-s <size>] [--name <name>]
tp storage list
tp storage info <storage_id>
tp storage edit <storage_id> --name "new-name"
tp storage edit <storage_id> --deletion-protection true
tp storage destroy <storage_id># Generate if needed
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519
# Use when creating clusters
tp cluster create -i ~/.ssh/id_ed25519.pub -t 1xH100
# Connect to cluster
tp ssh <instance_id># 1. Create job config
tp job init
# 2. Configure tp.config.toml
# commands = ["pip install -r requirements.txt", "python train.py"]
# instance_type = "1xH100"
# outputs = ["checkpoints/", "model.pth"]
# 3. Submit
tp job push tp.config.toml
# 4. Monitor
tp job listen <job_id>
# 5. Get results
tp job pull <job_id># 1. Create 4-node cluster with storage
tp cluster create -i ~/.ssh/id_ed25519.pub -t 8xH200 -n 4
tp storage create -t shared -s 1000 --name dataset
tp cluster attach <cluster_id> <storage_id>
# 2. SSH into jumphost
tp ssh <jumphost-instance-id>
# 3. Upload data to shared storage
cd /mnt/shared-<storage_id>
# rsync, wget, or HF download your dataset here
# 4. Submit SLURM job
srun --nodes=4 --ntasks-per-node=8 --gpus-per-node=8 \
torchrun --nnodes=4 --nproc_per_node=8 \
--rdzv_backend=c10d --rdzv_endpoint=$MASTER_ADDR:29500 \
train.py
# 5. Clean up
tp cluster detach <cluster_id> <storage_id>
tp cluster destroy <cluster_id># 1. Create single-node cluster
tp cluster create -i ~/.ssh/id_ed25519.pub -t 1xH100 --name dev-box
# 2. SSH in and iterate
tp ssh <instance_id>
git clone <repo>
pip install -r requirements.txt
python train.py
# 3. Destroy when done
tp cluster destroy <cluster_id>1. TENSORPOOL_KEY not set
[ -n "$TENSORPOOL_KEY" ] && echo "set" || echo "not set"
# If not set, connect via OpenScience dashboard or export manually2. Cluster stuck in PENDING/PROVISIONING
# Check cluster status
tp cluster info <cluster_id>
# Try a different instance type or wait for capacity3. Can't SSH into cluster
RUNNING (can take a few minutes)4. Multi-node workers not accessible
# Workers have private IPs only — must go through jumphost
tp ssh <jumphost-instance-id>
ssh <cluster_id>-0 # from jumphost5. Storage attachment fails
READY before attaching6. Job stuck in Pending
tp job info <job_id>
# Check instance type availability
tp job cancel <job_id> # Cancel and retry if needed7. Job Error (non-zero exit code)
# Stream logs to see what failed
tp job listen <job_id>
# Fix script, re-push
tp job push tp.config.toml8. Object storage slow for small files
boto3 or rclone instead of FUSE mountWhen the openscience agent loads this skill for a user task:
TENSORPOOL_KEY is settp.config.toml, show it to user, get approval, then tp job pushtp cluster create command with instance type and cost, get approval firsttp job listen or tp ssh to track progressTensorPool charges per GPU/hour, prorated to the second:
ALWAYS present estimated cost before creating any resource.
User: "Set up a 2-node H200 cluster for distributed training"
Agent steps:
1. Load skill: tensorpool-gpu-cloud
2. Check TENSORPOOL_KEY is set
3. Present cost estimate: 2x 8xH200 = $47.84/hr ($0.80/min)
4. Wait for explicit user approval
5. tp cluster create -i ~/.ssh/id_ed25519.pub -t 8xH200 -n 2
6. Wait for RUNNING status
7. tp ssh <jumphost-instance-id>
8. Help user with training setup
9. Remind user to destroy cluster when done| Command | Description |
|---|---|
tp cluster create -t <type> [-n <nodes>] | Create GPU cluster |
tp cluster list | List clusters |
tp cluster info <id> | Cluster details |
tp cluster destroy <id> | Terminate cluster |
tp cluster attach <cluster_id> <storage_id> | Attach storage |
tp cluster detach <cluster_id> <storage_id> | Detach storage |
tp job init | Create job config |
tp job push <config> | Submit training job |
tp job list | List jobs |
tp job info <id> | Job details |
tp job listen <id> | Stream job logs |
tp job pull <id> | Download outputs |
tp job cancel <id> | Cancel job |
tp storage create -t <type> [-s <size>] | Create storage |
tp storage list | List storage |
tp storage destroy <id> | Delete storage |
tp ssh <instance_id> | SSH to instance |
tp me | Account info |
3a6c3a9
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.