---
sidebar_position: 2
title: "Quickstart: Clone to First Training Job"
description: Deploy infrastructure and submit your first robotics training job in 9 steps
author: Microsoft Robotics-AI Team
ms.date: 2026-06-10
ms.topic: tutorial
keywords:
- quickstart
- deployment
- training
- tutorial
---
## Quick Start
The **default starting path is local, not cloud.** On T0 — Dev you close the full capture → train → validate → run loop on one laptop and one robot with zero cloud and zero Kubernetes, using `./setup-dev.sh` and the [Tier 0 — Dev recipe](../recipes/tier-0-dev/README.md). Start there; come back here when you graduate.
This guide is the **cloud path (T2 — Pilot)**: deploy the Azure + NVIDIA stack and submit a cloud training job in ~1.5-2 hours, using full-public networking and Access Keys authentication for the simplest path. Adopt it when training scale, team collaboration, or a shared model registry outgrows the laptop.
> [!NOTE]
> This guide expands on the [Getting Started hub](README.md). To pick the right tier and see the graduation triggers, see [Choose Your Tier](README.md#choose-your-tier). For the per-tier infrastructure boundaries see the [Architecture Overview](../contributing/architecture.md#t2--pilot) and the canonical [Tier Model](../design/tier-model.md).
## Prerequisites
| Requirement | Details |
|-------------------------|-----------------------------------------------------------------------------------------------------|
| Azure subscription | Contributor + User Access Administrator roles |
| GPU quota | `Standard_NV36ads_A10_v5` (A10 Spot, default) or `Standard_NC40ads_H100_v5` (H100) in target region |
| NVIDIA NGC account | Sign up at for API key |
| Development environment | Devcontainer (recommended) or local tools |
See [Prerequisites](../contributing/prerequisites.md) for installation commands and version requirements.
## Step 1: Clone and Set Up Environment
Clone the repository and initialize the development environment.
```bash
git clone https://github.com/microsoft/physical-ai-toolchain.git
cd physical-ai-toolchain
```
Use the devcontainer (recommended) or run local setup:
```bash
./setup-dev.sh
```
## Step 2: Configure Azure Subscription
Authenticate with Azure and register required resource providers.
```bash
source infrastructure/terraform/prerequisites/az-sub-init.sh
bash infrastructure/terraform/prerequisites/register-azure-providers.sh
```
Verify your subscription:
```bash
az account show --query "{name:name, id:id}" -o table
```
## Step 3: Configure Terraform Variables
Create a Terraform variables file for the full-public deployment path. From the repository root:
```bash
cd infrastructure/terraform
cp terraform.tfvars.example terraform.tfvars
```
Edit `terraform.tfvars` with your values:
```hcl
environment = "dev"
location = "westus3"
resource_prefix = "yourprefix"
instance = "001"
// Full-public networking (simplest path for inner developer loop)
should_enable_private_endpoint = false
should_enable_private_aks_cluster = false
should_enable_public_network_access = true
// Single GPU pool (Spot A10)
node_pools = {
gpu = {
vm_size = "Standard_NV36ads_A10_v5"
subnet_address_prefixes = ["10.0.7.0/24"]
node_taints = ["nvidia.com/gpu:NoSchedule", "kubernetes.azure.com/scalesetpriority=spot:NoSchedule"]
gpu_driver = "Install"
priority = "Spot"
should_enable_auto_scaling = true
min_count = 1
max_count = 1
zones = []
eviction_policy = "Delete"
}
}
// System node pool — enable autoscaling for OSMO workloads
should_enable_system_node_pool_auto_scaling = true
system_node_pool_min_count = 1
system_node_pool_max_count = 3
// OSMO Backend Services
should_deploy_postgresql = true
should_deploy_redis = true
```
> [!WARNING]
> `resource_prefix` must be lowercase, alphanumeric, and short (6-8 characters recommended). It feeds into Key Vault (`kv{prefix}{env}{instance}`) and Storage Account names that have 24-character limits and must be globally unique.
> [!TIP]
> For private networking, set `should_enable_private_endpoint = true` and `should_enable_private_aks_cluster = true`, then deploy the VPN from `infrastructure/terraform/vpn/` before running any `kubectl` commands. See the [Infrastructure Guide](../infrastructure/README.md) for details.
## Step 4: Deploy Infrastructure
Initialize and apply the Terraform configuration. This step takes ~30-40 minutes.
```bash
terraform init
terraform plan -out=tfplan
terraform apply tfplan
```
Verify deployment:
```bash
terraform output
```
Connect to the AKS cluster:
```bash
az aks get-credentials \
--resource-group "$(terraform output -json resource_group | jq -r '.name')" \
--name "$(terraform output -json aks_cluster | jq -r '.name')"
```
## Step 5: Set NGC API Key
Export your NVIDIA NGC API key for OSMO backend deployment. Obtain a key from .
```bash
export NGC_API_KEY=""
```
## Step 6: Configure AKS Cluster
Deploy GPU Operator, KAI Scheduler, and the AzureML extension. From the repository root:
```bash
cd infrastructure/setup
bash 01-deploy-robotics-charts.sh --config-preview
bash 01-deploy-robotics-charts.sh
bash 02-deploy-azureml-extension.sh --config-preview
bash 02-deploy-azureml-extension.sh
```
> [!TIP]
> All setup scripts support `--config-preview` to print configuration and exit without changes. Run it before each real deployment to verify values.
Verify GPU operator pods:
```bash
kubectl get pods -n gpu-operator
```
## Step 7: Deploy OSMO Components
Deploy the OSMO control plane and backend.
```bash
bash 03-deploy-osmo.sh --config-preview
bash 03-deploy-osmo.sh
```
Verify OSMO pods:
```bash
kubectl get pods -n osmo-control-plane
kubectl get pods -n osmo-operator
```
## Step 8: Connect to OSMO
The OSMO CLI requires an authenticated session before submitting workflows. Start a port-forward and login:
```bash
kubectl port-forward svc/osmo-gateway 9000:80 -n osmo-control-plane &
osmo login http://localhost:9000 --method=dev --username=admin
osmo profile set pool default
osmo version
```
See [OSMO Training — Connection Methods](../training/osmo-training.md#-connection-methods) for alternative access options (internal load balancer, ingress).
## Step 9: Submit First Training Job
Submit a training job from the repository root:
```bash
bash training/rl/scripts/submit-osmo-training.sh
```
Scripts auto-detect configuration from Terraform outputs. Override values with CLI arguments or environment variables as needed. See [Scripts Reference](../reference/scripts.md) for all submission options.
## Step 10: Verify Results
Confirm the training job is running:
```bash
kubectl get pods -n osmo-workflows --watch
```
Check OSMO training status through the OSMO web UI or query pod logs:
```bash
kubectl logs -n osmo-workflows -l app=osmo-training --tail=50
```
## Cleanup
Remove OSMO Helm releases before destroying infrastructure to avoid orphaned resources:
```bash
cd infrastructure/setup
helm uninstall osmo-operator -n osmo-operator --ignore-not-found
helm uninstall service router ui -n osmo-control-plane --ignore-not-found
```
Destroy all infrastructure when finished to stop incurring costs. From the repository root:
```bash
cd infrastructure/terraform
terraform destroy
```
See [Cost Considerations](../contributing/cost-considerations.md) for detailed pricing.
## Next Steps
| Resource | Description |
|---------------------------------------------------------|-----------------------------------------|
| [MLflow Integration](../training/mlflow-integration.md) | Track experiments with MLflow |
| [Infrastructure Guide](../infrastructure/README.md) | Full deployment reference and options |
| [Contributing Guide](../contributing/README.md) | Development workflow and code standards |