Generated banner for Physical AI Infrastructure Setup And Resilient Scaling
Generated logo for Physical AI Infrastructure Setup And Resilient Scaling

Physical AI Infrastructure Setup And Resilient Scaling

NVIDIAOfficialCreated by NVIDIA Physical AI

  • Skill
  • Workflow
  • Cloud and DevOps
  • Apache-2.0
  • Medium risk
  • Has scripts

From the author

Use when the user wants to set up, scale, validate, or harden NVIDIA physical AI infrastructure for synthetic data generation workflows across local MicroK8s or Azure AKS, including Kubernetes clusters, inference endpoint deployment, OSMO deployment, workload submission readiness, and infrastructure failure recovery. Trigger keywords: physical ai infrastructure, resilient scaling, SDG infrastructure, microk8s, azure aks, NVCF deployment, NIM Operator, OSMO deploy, workflow scaling. Don't trigger for: OSMO log summarization or workload-only operations unless infrastructure setup, scaling, validation, or recovery is requested.
— the description by NVIDIA Physical AI

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a comprehensive framework for deploying, scaling, and validating the infrastructure required for NVIDIA Physical AI synthetic data generation (SDG) workflows. It manages the lifecycle of Kubernetes clusters (MicroK8s or Azure AKS), OSMO orchestration, and inference backends (NIM Operator, NVCF, or Azure AI Foundry). The skill enforces strict preflight checks, reproducible configuration management, and systematic recovery procedures to ensure reliable workload execution.

What it does

  • Provisions and configures Kubernetes clusters on MicroK8s or Azure AKS.
  • Deploys and manages OSMO orchestration layers for workload submission.
  • Sets up inference endpoints using NIM Operator, NVCF, or Azure AI Foundry.
  • Executes mandatory preflight checks to validate infrastructure readiness.
  • Provides structured recovery paths for failed workflow states or infrastructure issues.
  • Ensures secure credential handling and environment-aware configuration.

When to use it

  • When setting up a new Physical AI SDG environment from scratch.
  • When scaling existing infrastructure to meet new workload demands.
  • When validating the health and readiness of cluster, inference, or OSMO components.
  • When troubleshooting and recovering from infrastructure or workflow deployment failures.

Advantages

  • Standardizes infrastructure deployment across different cloud and local environments.
  • Reduces configuration drift by using checked-in scripts and reproducible patterns.
  • Improves reliability through mandatory preflight and verification gates.
  • Provides a unified interface for complex multi-component stacks.

Usage examples

“Set up resilient Physical AI infrastructure for VDA on Azure AKS with NIM Operator.”
The agent will initiate the setup flow for Azure AKS, configure the necessary OSMO and NIM Operator components, run preflight checks, and prepare the environment for VDA workload submission.
“My MicroK8s cluster for SDG is failing to schedule jobs; help me validate and recover.”
The agent will guide you through the verification gates for the MicroK8s cluster, inspect OSMO pod status, check storage credentials, and identify the root cause of the scheduling failure.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/nvidia/physical-ai-infrastructure-setup-and-resilient-scaling/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip physical-ai-infrastructure-setup-and-resilient-scaling.zip -d .agents/skills

Documentation by NVIDIA Physical AI

Physical AI Infrastructure Setup And Resilient Scaling

Canonical skill for the Physical AI infrastructure stack. Use it to compose cluster, inference, OSMO, and workload stages into a reproducible Physical AI SDG environment, then keep the environment observable and recoverable.

Operating Rules

  • Read only the component references needed for the selected target. Do not load every component by default.

  • Keep the repo as the durable artifact. Fix checked-in config or scripts, then rerun. Do not recover a failed install with untracked one-off changes.

  • Run mutating cluster, OSMO, Helm, Terraform, or Azure operations through checked-in scripts when a script exists. Read-only diagnostics are allowed.

  • Stop at the first red gate. Fix the lowest owning layer in this order: config, script, then skill guidance.

  • Derive values from the environment when possible. Ask only for values that cannot be inferred, such as API keys, target choice, or quota tradeoffs.

  • Store secrets in ${REPO_ROOT}/.env. Cluster-derived values such as storage, database, Redis, and endpoint names come from Terraform outputs or platform queries, not .env.

  • Preflight means no deployed state: no cluster API, Terraform outputs, Helm releases, OSMO pools, or workflow state. Those belong to deploy/verify gates.

  • Never print, echo, or paste raw keys into commands, YAML, logs, or transcripts. Prefer credential handles, Kubernetes secretKeyRef, and runtime-only secret injection. Scan raw transcript exports with scripts/scan_transcript_secrets.py before sharing.

  • Use absolute paths. Derive repo root with git rev-parse --show-toplevel.

Component References

Each component lives inside this skill so the stack has one canonical trigger. Load the component reference only when the selected target needs that slice.

ConcernLoadAssets
Stage matrix and old driver notescomponents/driver/reference.mdNone
MicroK8s clustercomponents/cluster-microk8s/reference.mdcomponents/cluster-microk8s/scripts/, components/cluster-microk8s/runtimeclass-nvidia-runc.yaml
Azure AKS clustercomponents/cluster-azure/reference.mdcomponents/cluster-azure/scripts/, components/cluster-azure/terraform/
NIM Operator inferencecomponents/inference-nim-operator/reference.mdcomponents/inference-nim-operator/scripts/, components/inference-nim-operator/nims/
NVCF inferencecomponents/inference-nvcf/reference.mdcomponents/inference-nvcf/scripts/
Azure AI Foundry inferencecomponents/inference-azure/reference.mdcomponents/inference-azure/scripts/
MicroK8s OSMOcomponents/osmo-k8s/reference.mdcomponents/osmo-k8s/scripts/, upstream OSMO deploy scripts
Azure OSMOcomponents/osmo-azure/reference.mdcomponents/osmo-azure/scripts/, upstream OSMO deploy scripts plus Azure TF outputs
Azure access setupcomponents/azure-access/reference.mdNone
OSMO CLI and workflow operationscomponents/osmo-cli/reference.mdcomponents/osmo-cli/scripts/, components/osmo-cli/references/, components/osmo-cli/agents/, components/osmo-cli/tests/
OpenClaw Azure device logincomponents/openclaw-azure-login/reference.mdNone
OSMO CLI Support Files

The OSMO CLI component has second-level support files because its command and workflow surface is large. Load these directly only for the stated case.

FileRead when
components/osmo-cli/agents/workflow-expert.mdSpawning a workflow-generation or workflow-failure subagent.
components/osmo-cli/agents/logs-reader.mdSpawning a log summarization subagent for OSMO workflow failures.
components/osmo-cli/references/cli-commands.mdExact OSMO CLI flags, payloads, or command syntax are needed.
components/osmo-cli/references/workflow-spec.mdWorkflow YAML schema, credentials, outputs, or provider fields are needed.
components/osmo-cli/references/workflow-patterns.mdMulti-task, data dependency, Jinja, serial, or parallel workflow design is needed.
components/osmo-cli/references/advanced-patterns.mdCheckpointing, retry/exit behavior, or node exclusion is needed.
components/osmo-cli/tests/orchestrator-runtime-failure.mdValidating or debugging the OSMO orchestration review pattern.

Target Selection

Pick exactly one option per stage. Stage 2 follows stage 1.

  1. Kubernetes: MicroK8s or Azure

  2. OSMO: MicroK8s OSMO when Kubernetes is MicroK8s, Azure OSMO when Kubernetes is Azure

  3. Inference: NIM Operator, NVCF, Azure AI Foundry, or None

  4. Workload: Video Data Augmentation, Defect Image Generation, NuRec Carline Adaptation, NRE, NCore, Asset Harvester, or custom workflow YAML

Reject invalid combinations before provisioning:

ClusterNIM OperatorNVCFAzure AI Foundry
MicroK8syesyesno, Foundry requires Azure identities
Azureyesyesyes

For OpenClaw or any chat-only environment that cannot open a browser, read components/openclaw-azure-login/reference.md before Azure prerequisites. For any Azure target, read components/azure-access/reference.md before Azure component preflights.

Setup Flow

  1. Confirm target choices and workload compute requirements.

  2. Load the selected component references.

  3. Resolve prerequisites up front, including API keys, Azure access, caller CIDR, GPU quota, storage class, and OSMO login requirements.

  4. Run scripts/preflight.sh for every selected infrastructure component plus any OSMO CLI/workload preflight before provisioning; build the implementation plan from the results and stop on red preflight.

  5. Deploy Kubernetes first. Nothing else starts until the cluster gate is green.

  6. Deploy OSMO and inference after Kubernetes. These can proceed in parallel once the cluster exists, but workload submission waits for both selected gates.

  7. Submit the workload only after OSMO, storage credentials, compute pool, and selected inference endpoints are verified. For VDA, this includes preflight_credentials.sh, pre_submit_guard.py with resolved --set values, non-empty model-cache prefixes, and workflow-namespace endpoint smoke checks.

  8. Monitor through completion. On failed workflow state, inspect events and logs from components/osmo-cli/reference.md; do not resubmit blindly.

Inference Discovery

Avoid over-deploying expensive endpoints.

  1. Scan the chosen workflow spec and default values for endpoint references: *.osmo-nims.svc.cluster.local, api.nvcf.nvidia.com/*, *.inference.ai.azure.com, or *.cognitiveservices.azure.com.

  2. Map each reference to the selected backend:

    • NIM Operator: service name must match a directory under components/inference-nim-operator/nims/.

    • NVCF: function URL or function ID must be supplied by the environment.

    • Azure AI Foundry: endpoint name must be deployed through components/inference-azure/scripts/install.sh.

  3. If the workflow needs a capability the selected backend lacks, stop and report the mismatch. Do not silently substitute another model.

Verification Gates

Each stage has its own Verify section in the component reference. These gates are mandatory:

StageGate
KubernetesCluster API reachable, nodes Ready, GPU capacity advertised for GPU paths, and CPU+NVCF paths have runtimeclass/nvidia mapped to runc.
InferenceEvery endpoint referenced by the workload is reachable. NIM readiness uses /v1/health/ready; NVCF and Foundry still need task-specific authenticated checks.
OSMOOSMO pods Ready, pool ONLINE, port-forward watchdogs alive, storage credentials configured, and verify-hello workflow COMPLETED.
WorkloadSelected workload pre-submit guards pass before submit. osmo workflow query <id> reports COMPLETED and every task is green. Failed terminal states require events and logs before retry.

Resilient Scaling

  • Size the cluster from workload needs before provisioning. For Azure, check CPU and GPU quota for the selected VM families before terraform apply.

  • For NIM Operator, deploy only the NIMServices referenced by the workload. Each service pins GPU and model-cache storage for the lifetime of the cluster.

  • Keep OSMO storage URL schemes aligned with the active backend. Local MicroK8s uses MinIO, Azure uses Blob-backed configuration.

  • Treat Pending, Unknown, ImagePullBackOff, unbound PVCs, or 0 Ready replicas as layer failures. Investigate scheduling, storage, image credentials, and adjacent platform state before retrying the same command.

  • For long deploys or workflow watches, provide heartbeat updates with current state, elapsed time, last useful observation, and next check.

Workload Routing

  • Video Data Augmentation: use skills/physical-ai-video-data-augmentation/SKILL.md.

  • Defect Image Generation: use skills/physical-ai-defect-image-generation/SKILL.md.

  • NuRec carline adaptation: use skills/carline-adaptation/SKILL.md.

  • NRE, NCore, and Asset Harvester live in the canonical NuRec catalog listed in skills/INDEX.md.

  • Custom workload: submit the provided workflow YAML through OSMO after checking resource requests, image credentials, data credentials, and inference URLs.

Evaluation Prompts And Results

  • Positive trigger: "Set up resilient Physical AI infrastructure for VDA on Azure AKS with NIM Operator." Expected: use this skill.

  • Negative trigger: "Summarize recent OSMO workflow logs for this workflow ID." Expected: do not use this infrastructure setup skill unless the request also involves setup, scaling, validation, or recovery of the infrastructure stack.

Latest static review: 2026-05-26, description keywords match the expected routes above.

Files

components/cluster-azure/terraform/main.tf

# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

/**
 * # Robotics Blueprint
 *
 * Deploys robotics infrastructure with NVIDIA GPU support and optional
 * Azure Machine Learning integration. KAI Scheduler is installed downstream
 * by the Azure OSMO component (upstream NVIDIA/OSMO deploy-osmo-minimal.sh).
 *
 * Architecture:
 * - Platform Module: Shared services (networking, security, observability, ACR, storage, ML workspace)
 * - SiL Module: AKS cluster with GPU node pools and ML extension integration
 *
 * Source: extracted from github.com/microsoft/physical-ai-toolchain
 */

locals {
  resource_group_name = coalesce(var.resource_group_name, "rg-${var.resource_prefix}-${var.environment}-${var.instance}")
  current_user_oid    = try(msgraph_resource_action.current_user[0].output.oid, null)
}

resource "msgraph_resource_action" "current_user" {
  count = var.should_add_current_user_key_vault_admin ? 1 : 0
  method       = "GET"
  resource_url = "me"
  response_export_values = {
    oid = "id"
  }
}

resource "azurerm_resource_group" "this" {
  count    = var.should_create_resource_group ? 1 : 0
  name     = local.resource_group_name
  location = var.location
  tags     = var.tags
}

resource "terraform_data" "defer_resource_group" {
  count = var.should_create_resource_group ? 0 : 1
  input = {
    name = local.resource_group_name
  }
}

data "azurerm_resource_group" "existing" {
  count = var.should_create_resource_group ? 0 : 1
  name  = terraform_data.defer_resource_group[0].output.name
}

locals {
  resource_group = var.should_create_resource_group ? {
    id       = azurerm_resource_group.this[0].id
    name     = azurerm_resource_group.this[0].name
    location = azurerm_resource_group.this[0].location
    } : {
    id       = data.azurerm_resource_group.existing[0].id
    name     = data.azurerm_resource_group.existing[0].name
    location = data.azurerm_resource_group.existing[0].location
  }
}

module "platform" {
  source     = "./modules/platform"
  depends_on = [azurerm_resource_group.this]

  environment     = var.environment
  resource_prefix = var.resource_prefix
  location        = var.location
  instance        = var.instance
  resource_group  = local.resource_group
  current_user_oid = local.current_user_oid

  should_enable_nat_gateway = var.should_enable_nat_gateway
  nat_gateway_zones         = var.nat_gateway_zones
  should_create_vm_subnet   = var.should_create_vm_subnet
  virtual_network_config = {
    address_space                  = var.virtual_network_config.address_space
    subnet_address_prefix_main     = var.virtual_network_config.subnet_address_prefix
    subnet_address_prefix_vm       = var.virtual_network_config.subnet_address_prefix_vm
    subnet_address_prefix_pe       = var.virtual_network_config.subnet_address_prefix_pe
    subnet_address_prefix_resolver = var.virtual_network_config.subnet_address_prefix_resolver
  }

  should_enable_private_endpoint          = var.should_enable_private_endpoint
  should_enable_public_network_access     = var.should_enable_public_network_access
  should_add_current_user_key_vault_admin = var.should_add_current_user_key_vault_admin
  should_add_current_user_storage_blob    = var.should_add_current_user_storage_blob
  should_enable_purge_protection          = var.should_enable_purge_protection
  should_create_data_lake_storage         = var.should_create_data_lake_storage

  should_enable_raw_bags_lifecycle_policy           = var.should_enable_raw_bags_lifecycle_policy
  raw_bags_retention_days                           = var.raw_bags_retention_days
  should_enable_converted_datasets_lifecycle_policy = var.should_enable_converted_datasets_lifecycle_policy
  converted_datasets_cool_tier_days                 = var.converted_datasets_cool_tier_days
  should_enable_reports_lifecycle_policy            = var.should_enable_reports_lifecycle_policy
  reports_cool_tier_days                            = var.reports_cool_tier_days
  reports_archive_tier_days                         = var.reports_archive_tier_days

  should_deploy_postgresql = var.should_deploy_postgresql
  should_deploy_redis      = var.should_deploy_redis
  postgresql_config = {
    location                        = coalesce(var.postgresql_location, var.location)
    sku_name                        = var.postgresql_sku_name
    storage_mb                      = var.postgresql_storage_mb
    version                         = var.postgresql_version
    databases                       = var.postgresql_databases
    zone                            = var.postgresql_zone
    should_enable_high_availability = var.postgresql_high_availability.should_enable
    standby_availability_zone       = var.postgresql_high_availability.standby_availability_zone
  }
  redis_config = {
    sku_name                        = var.redis_sku_name
    clustering_policy               = var.redis_clustering_policy
    should_enable_high_availability = var.should_enable_redis_high_availability
  }

  should_enable_osmo_identity     = var.osmo_config.should_enable_identity
  should_deploy_grafana           = var.should_deploy_grafana
  should_deploy_monitor_workspace = var.should_deploy_monitor_workspace
  should_deploy_ampls             = var.should_deploy_ampls
  should_deploy_dce               = var.should_deploy_dce

  should_enable_aml_diagnostic_logs = var.should_enable_aml_diagnostic_logs
  should_deploy_aml_compute         = var.should_deploy_aml_compute
  aml_compute_config                = var.aml_compute_config

  should_include_aks_dns_zone = var.should_include_aks_dns_zone
}

module "sil" {
  source     = "./modules/sil"
  depends_on = [module.platform]

  environment     = var.environment
  resource_prefix = var.resource_prefix
  instance        = var.instance
  location        = var.location
  resource_group  = local.resource_group
  current_user_oid = local.current_user_oid

  virtual_network                 = module.platform.virtual_network
  subnets                         = module.platform.subnets
  network_security_group          = module.platform.network_security_group
  nat_gateway                     = module.platform.nat_gateway
  should_enable_nat_gateway       = var.should_enable_nat_gateway
  log_analytics_workspace         = module.platform.log_analytics_workspace
  monitor_workspace               = module.platform.monitor_workspace
  data_collection_endpoint        = module.platform.data_collection_endpoint
  container_registry              = module.platform.container_registry
  private_dns_zones               = module.platform.private_dns_zones
  should_deploy_monitor_workspace = var.should_deploy_monitor_workspace
  should_deploy_dce               = var.should_deploy_dce

  aks_subnet_config = {
    subnet_address_prefix_aks     = try(var.subnet_address_prefixes_aks[0], null)
    subnet_address_prefix_aks_pod = try(var.subnet_address_prefixes_aks_pod[0], null)
  }

  aks_config = {
    system_node_pool_vm_size                    = var.system_node_pool_vm_size
    system_node_pool_node_count                 = var.system_node_pool_node_count
    should_enable_system_node_pool_auto_scaling = var.should_enable_system_node_pool_auto_scaling
    system_node_pool_min_count                  = var.system_node_pool_min_count
    system_node_pool_max_count                  = var.system_node_pool_max_count
    should_enable_private_cluster               = var.should_enable_private_aks_cluster
    system_node_pool_zones                      = var.system_node_pool_zones
    should_enable_microsoft_defender            = var.should_enable_microsoft_defender
  }

  node_pools             = var.node_pools
  osmo_workload_identity = module.platform.osmo_workload_identity
  osmo_config = {
    should_federate_identity = var.osmo_config.should_federate_identity
    control_plane_namespace  = var.osmo_config.control_plane_namespace
    operator_namespace       = var.osmo_config.operator_namespace
    workflows_namespace      = var.osmo_config.workflows_namespace
  }

  should_enable_private_endpoint = var.should_enable_private_endpoint
}

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs an API key, Needs Node.js

The author says: Requires the selected component prerequisites, usually kubectl plus either MicroK8s or Azure CLI/Terraform, and OSMO or inference credentials for the chosen target.

Security

What our scanner noticed· Medium risk

  • Large base64-encoded blobs
  • Instructions that use the network
  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
NVIDIA Physical AI
Publisher
NVIDIA (Official)
Source
NVIDIA/skills · skills/physical-ai-infrastructure-setup-and-resilient-scaling · commit fce3cca
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE-APACHE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced
Also distributed in
openai/plugins

AutoGineer is not affiliated with or endorsed by NVIDIA Physical AI or NVIDIA.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download physical-ai-infrastructure-setup-and-resilient-scaling.zip