Omniverse Usd Performance Tuning
OpenAIOfficialCreated by NVIDIA OmniverseDistributed by OpenAI
- Skill
- Workflow
- Software development
- Apache-2.0
- Medium risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The omniverse-usd-performance-tuning skill provides a structured, end-to-end procedure for addressing performance bottlenecks in USD assets. It manages the lifecycle of performance tuning, from initial runtime context setup and baseline profiling to composition auditing, validation, and targeted scene optimization. The skill enforces a rigorous milestone-based approach, ensuring that all destructive operations are planned and approved, and that performance improvements are verified through comparative profiling and standardized reporting.
What it does
- Orchestrates the end-to-end USD performance tuning lifecycle.
- Validates runtime environments and handles authentication for remote assets.
- Conducts composition audits and structural assessments of USD stages.
- Executes validated optimization operations using Scene Optimizer.
- Generates structured optimization reports comparing baseline and post-optimization metrics.
- Enforces safety gates for destructive operations and mutation.
When to use it
- When a USD scene exhibits slow loading times or low frame rates.
- When memory usage is excessively high or GPU crashes occur.
- When you need to optimize a scene for better interactivity or performance.
- When you need to diagnose CAD conversion quality issues.
- When you need to validate a scene before and after applying optimizations.
Advantages
- Ensures consistent performance diagnosis through a standardized workflow.
- Prevents accidental data loss by requiring approval for destructive operations.
- Provides clear, evidence-based reporting on performance improvements.
- Integrates seamlessly with existing Omniverse validation and optimization tools.
- Maintains strict separation between diagnosis, planning, and execution phases.
Usage examples
- “This USD scene loads very slowly; please triage what I should check first.”
- The agent will initiate the runtime context gate, perform a composition audit, and provide a structured plan to identify the source of the slow load time.
- “Optimize my CAD scene for better performance.”
- The agent will verify the runtime, assess the CAD conversion quality, and propose a milestone-based optimization plan including validation and profiling.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/openai/omniverse-usd-performance-tuning/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip omniverse-usd-performance-tuning.zip -d .agents/skills
Documentation by NVIDIA Omniverse
Omniverse USD Performance Tuning
<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
When to Use
Use this workflow for broad performance asks such as slow loading, high memory, low FPS, GPU crashes, conversion-quality triage, or generic requests to optimize a USD scene.
Instructions
Start from the mandatory runtime context gate before producing tuning output, unless the prompt is only asking for a static classification test.
Classify broad optimization requests as
ready_to_plan; reserveapproval_requiredfor prompts that explicitly name a destructive operation to execute before planning.Plan the full canonical chain through
optimization-report, preserving the structured milestone order and theprofile-stage:baseline/profile-stage:afterlabels when listing milestones.Invoke downstream skill bodies only when their phase is reached, and keep raw runtime artifacts on disk while reading compact summaries.
Frontmatter keeps version and tools at top level for agentskills.io runtime
compatibility. NVCARPS discoverability fields live under metadata.
Output Format
Return a plan or status summary that names the selected entry skill, uses ready_to_plan for generic optimization requests, includes the full milestone chain through optimization-report, and labels profile phases as profile-stage:baseline and profile-stage:after. For structured outputs, the broad-optimization milestone subsequence is omniverse-usd-performance-tuning -> profile-stage:baseline -> usd-structure-assessment -> usd-validation-runner -> restructure-decision -> apply-restructure -> so-run-validators -> so-interpret-validators -> so-run-operations -> profile-stage:after -> compare-profiles -> optimization-report. End-to-end execution should produce an optimized stage when mutation runs and a report conforming to the optimization-report reference's schema (scripts/optimization-report.schema.json within that reference).
Use this workflow for broad performance asks such as slow loading, low FPS, high memory, GPU crashes, conversion quality, or "optimize my scene."
Entry skill rule
This skill is the named entry point for broad performance work whenever the
agent has any verified way to do that work. Runtime probing details live in
setup-usd-performance-tuning; this rule only decides which skill owns the
user-facing performance request.
If the setup probe shows any verified runtime path - Kit, standalone, or even a partial stack such as Asset Validator only - enter here. If the user's requested tool is missing, return the specific
blocked_code(blocked_missing_scene_optimizer,blocked_missing_so_operation, etc.) instead of substituting another workflow.Enter at
setup-usd-performance-tuningonly when no runtime path is verified and runtime choice/setup is the first unresolved problem.For
omniverse://assets, enter atomniverse-authenticationfirst. Authentication precedes setup and triage for remote assets.
The decision is about ownership, not order. Setup, authentication, and triage all run in their normal phase order; this rule only fixes which skill the agent names as the entry skill in its response.
Runtime context — session-start gate (mandatory)
Before any other tuning output, follow the mandatory session-start gate in
skills/omniverse-usd-performance-tuning/references/setup-usd-performance-tuning/references/runtime-context-header.md.
That reference owns output_path, the canonical setup-preflight.json
location, Format A/Format B, and the "do not improvise a silent probe"
anti-pattern.
Required outcomes:
Missing or unreadable preflight: invoke
setup-usd-performance-tuning.Present preflight: print Format A and wait for the user to choose Continue, Change Kit, Switch to standalone, or Re-run probe.
Confirmed runtime in the same session: use compact Format B for follow-up status.
[Kit: {runtime_context.kit.application} {runtime_context.kit.version} | SO: {runtime_context.sceneOptimizer.version} | AV: {runtime_context.assetValidator.version}]Runtime artifact token budget
Before reading Kit logs, Asset Validator CSVs, Scene Optimizer logs, Tracy CSVs,
or other runtime output, follow
references/runtime-artifact-token-budget.md. Keep raw artifacts on disk, read
summary JSON first, and use bounded log snapshots instead of full dumps or live
streams.
Plan-time vs execution-time approval
approval_required at planning time is reserved for requests that explicitly name a destructive operation. Use the following rule when deciding between ready_to_plan and approval_required:
approval_requiredat planning time — the user's request itself names a destructive operation: "flatten this stage", "decimate the meshes", "merge prototypes", "delete unused prims", or any specific named mutation that cannot be undone within the same workflow. In this case the agent's first response must be an approval prompt that names the operation, before the agent commits to a plan that executes it.ready_to_planat planning time — the user's request is general: "optimize this scene", "make it load faster", "reduce GPU memory", "improve interactivity". The agent lays out the full plan, including any destructive operations the plan would invoke (for exampleso-run-operationswithmergeMaterials), without withholding the plan itself. Approval for each destructive operation is requested alongside plan approval.
The distinction is between authorising a plan and authorising a destructive action. A general optimisation request authorises planning; it does not authorise execution of specific destructive operations.
For structured runtime-test responses and similar planning summaries:
A future
restructure-decisionprompt is a planned user-decision gate, not a reason to set the top-level responsedecisiontoapproval_requiredfor a generic optimization request.For a generic optimization request, set
decision: "ready_to_plan"and include the full intended chain in bothcommitted_milestonesandplanned_phases, throughoptimization-report.It is valid for
gates_observedto includeasks_user_for_restructure_decisionwhile the top-leveldecisionremainsready_to_plan.Whenever a chain names profile phases, use the exact labels
profile-stage:baselineandprofile-stage:after; do not emit the ambiguous bareprofile-stagetoken.Start structured milestone lists with
omniverse-usd-performance-tuningas the owning entry skill. Includesetup-usd-performance-tuningonly as additional Phase 0 context, not as a replacement for the entry skill milestone.For broad optimization requests, preserve the milestone subsequence from Output Format above exactly, with optional extra analysis steps inserted only where they do not reorder it.
Do not list
so-run-validatorsorso-interpret-validatorsbeforerestructure-decisionin broad optimization milestone summaries. Phase-aware validator routing still happens throughusd-validation-runner; the SO validator executor/interpreter milestones appear after the restructure decision path in the structured plan contract.
Output expectation
End-to-end optimization work should produce both an optimized USD stage, when
mutation is executed, and a structured optimization report conforming to
the optimization-report reference's scripts/optimization-report.schema.json. The HTML report must be rendered
from references/report-templates/optimization-report.html.template via
render_preview.py — never hand-write HTML. Diagnosis-only work should still
end with a report or summary that states no optimized stage was written.
Purpose
Route digital twin USD performance requests into the right diagnostic and optimization workflow while preserving evidence before mutation.
Prerequisites
Stage path or enough context to identify the target asset.
User goal: diagnosis only, validation, profiling, or processor execution.
Runtime availability status from
setup-usd-performance-tuningwhen not already known.Permission status for in-place mutation vs writing a separate optimized output.
Examples
"This USD loads slowly; triage what to check first."
"Route a low-FPS CAD scene through the performance workflow."
Triage order
Runtime gate. Follow the mandatory session-start gate above before validation, profiling, or optimization. Do not scan, probe, install, or pick Kit/standalone runtimes directly in this skill;
setup-usd-performance-tuningowns probe/chooser/install dispatch and writes the preflight consumed here.Identify the target problem:
Load time.
FPS or interactivity.
GPU or system memory.
Crash or device lost.
CAD conversion quality.
Validation failure.
Gather minimum context:
Stage path and size.
Whether the stage is local, mounted, or
omniverse://remote. For remote assets, route throughomniverse-authenticationbefore first open.Kit or USD runtime.
Whether the workload is CAD, VFI, AIF, Isaac, or generic OpenUSD.
Whether in-place mutation is allowed.
Whether the user wants diagnosis only or processor execution.
Route:
USD composition questions:
usd-structure-assessment(composition is now part of the SA umbrella; deeper detail inskills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/composition-audit.md).Validation and content issues:
usd-validation-runner(master router; routes tovalidate-*family orso-run-validatorsbased on intent).Edit/output decisions:
usd-edit-target-planner(also owns variant/payload gates).Repeated copied hierarchy or high mesh count with no instancing:
usd-hierarchy-dedupe-candidates.Restructure decision (monolithic stage, asset boundary materialization):
restructure-decision.CAD converter settings: read
references/cad-conversion/README.md(niche pre-USD concern; see reference for details).Scene Optimizer:
so-run-validators,so-interpret-validators,so-run-operations.
Optimization ordering
Follow the canonical ordering in workflow.md § Operation ordering invariants. The high-level rule: prototypes first → per-asset validation → stage-level operations last. The workflow reference owns the full invariant list (meshCleanup before decimateMeshes, deduplication before decimation, never merge if instanced, etc.) and the analysis-only ops catalogue.
Rules
Always run composition audit before mutation.
Always validate before and after processor execution.
Optimize prototypes before per-asset validation.
Do not run whole-stage mesh deduplication on very large CAD scenes before checking for hierarchy-level reuse.
Do not recommend a fixed optimization stack without bottleneck evidence.
Do not invent numeric thresholds or expected percentage wins.
Prefer canonical SO ops over specialty / documentary ones. The op curation in
references/operations/_curation.jsonclassifies every op ascanonical,specialty,analysis,documentary, ordeprecated. When more than one op could resolve the same finding, recommend the canonical one first and only reach for a specialty op when the user explicitly asks or the rationale warrants it. Specifically:For vertex welding, prefer canonical
meshCleanupwith explicit flags over the standalonemergeVerticesop. The standalone op is a legacy/specialty surface; use upstreamusd-optimizefor the operation mechanics and local approval policy before mutating.For hierarchy dedupe, recommend
usd-hierarchy-dedupe-candidates+apply-restructure(the USD-authored rewrite path).For per-mesh dedupe, recommend
deduplicateGeometry(canonical) overfindCoincidingGeometry(analysis — produces a report, not a change).Do not recommend
documentary-status ops (e.g.,boxClip,deletePrims,removeAttributes,removeUntypedPrims,mergeoutside its narrow non-instanced case) without an explicit user request. Documentary ops survive in the per-opreferences/operations/<key>.mdrouting stubs for completeness but are excluded from agent-initiated recommendations.Specialty ≠ documentary. Ops classified as
specialtyin_curation.jsoneither (a) have validator-finding evidence that wires them into theso-interpret-validatorschain (e.g.sparseMeshes,optimizePrimvars), or (b) are load-bearing escape hatches needed for specific downstream contexts (e.g.primitivesToMesheswhen output must beUsdGeomMesh,utilityFunctionfor instancing toggles and material rebinding,pythonScriptforso-create-proxyrecipes). Recommend specialty ops when their validator fires OR when their downstream context applies — the suppression above only targetsdocumentaryops.
Limitations
Does not replace downstream reference instructions; load each required reference before executing it.
Does not install runtimes directly; follow setup or install references when requirements are missing.
Does not authorize mutation when the user has not allowed writes.
Troubleshooting
If runtime status is unclear, run
setup-usd-performance-tuningbefore profiling or validation.If the reported problem is vague, gather stage path, workload type, and whether diagnosis or execution is requested.
If the workflow suggests mutation before evidence, return to baseline profiling and composition audit first.
References
Before routing, read:
skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/optimization-tradeoffs.md— identify which pipeline phase the scene is in (extraction, structuring, or optimization). The right action depends on the phase.skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/factory-level-structuring.md— understand the three pillars (assets, aggregation, animation) and the seven-step structuring pattern.
If you have network access, prefer the live URLs (noted in each reference file) for the most current version.
Required execution flow
Read references/workflow.md for the canonical Phase 0-7 flow, including
Kit/standalone branches, validator-stack routing, operation ordering,
termination conditions, duration hints, and the optional iteration pattern.
The compact root map at references/skill-map.md only routes agents
into this workflow.
Do not treat downstream phase names as plain checklist labels. Before executing
each step, load that phase's nested README.md reference and follow its
instructions. Claude Code only exposes the public catalog skill; it does not
recursively inject profile-stage, usd-structure-assessment, or other nested
references.
The final deliverable must come from optimization-report: save both the structured JSON report and the generated Markdown summary. Do not substitute an ad hoc SUMMARY.md or chat-only recap for the optimization report.
For deeper subtopic guidance, consult the references:
skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/composition-audit.md,skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/layer-health.md- subtopic detail for SA's Phase 1 checklist.skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/instancing-readiness/references/instancing-tradeoffs.md- merge safety, decision tree for instancing choices.skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/usd-edit-target-planner/references/variants-payloads.md- deeper variant/payload trade-offs (gates are inline in usd-edit-target-planner).references/cad-conversion/README.md- CAD converter settings.references/upstreams/usd-optimize.md- upstream SO mechanics and prebuilt package resolution.skills/omniverse-usd-performance-tuning/references/usd-validation-runner/references/so-run-validators/references/infrastructure.md- local handoff for SO validator infrastructure.skills/omniverse-usd-performance-tuning/references/usd-validation-runner/references/validation-scoping.md- tier 1/2/3 plan + scene-aware adjustment.skills/omniverse-usd-performance-tuning/references/optimization-report/references/optimization-report-template.md- the data contract every phase populates.
For full Kit runtime profiling (FPS, frame time, Hydra/RTX metrics), refer to the external profiling skills at NVIDIA/omniperf.
Files
- ATTRIBUTION.mdAdded by AutoGineer1.0 KiB
- BENCHMARK.md22.5 KiB
- LICENSEAdded by AutoGineer10.0 KiB
- SKILL.md17.2 KiB
- agents/openai.yaml402 B
- evals/evals.json4.8 KiB
- references/cad-conversion/README.md2.5 KiB
- references/cad-conversion/scripts/conversion-report.schema.json1.3 KiB
- references/compare-profiles.md2.4 KiB
- references/compare-profiles/README.md9.7 KiB
- references/omniverse-authentication/README.md3.8 KiB
- references/operations/CLASSIFICATION.md4.5 KiB
- references/operations/EXECUTION.md4.5 KiB
- references/operations/README.md8.0 KiB
- references/operations/_curation.json14.5 KiB
- references/operations/_template.md1.5 KiB
- references/operations/boxClip.md1.0 KiB
- references/operations/computeExtents.md1.1 KiB
- references/operations/countVertices.md1.1 KiB
- references/operations/decimateMeshes.md2.6 KiB
- references/operations/deduplicateGeometry.md1.1 KiB
- references/operations/deduplicateHierarchies.md1.5 KiB
- references/operations/deleteHiddenPrims.md1.1 KiB
- references/operations/deletePrims.md1.0 KiB
- references/operations/diceMeshes.md1.1 KiB
- references/operations/editStageMetrics.md1.1 KiB
- references/operations/findCoincidingGeometry.md1.1 KiB
- references/operations/findFlatHierarchies.md1.1 KiB
- references/operations/findOccludedMeshes.md4.8 KiB
- references/operations/findOverlappingMeshes.md1.1 KiB
- references/operations/fitPrimitives.md1.1 KiB
- references/operations/flattenHierarchy.md1.1 KiB
- references/operations/generateAtlasUVs.md1.1 KiB
- references/operations/generateNormals.md1.1 KiB
- references/operations/generateProjectionUVs.md1.1 KiB
- references/operations/generateScene.md1.1 KiB
- references/operations/manifest.json38.6 KiB
- references/operations/manifoldMeshes.md1.1 KiB
- references/operations/merge.md1.1 KiB
- references/operations/mergeVertices.md1.1 KiB
- references/operations/meshCleanup.md1.1 KiB
- references/operations/optimizeMaterials.md1.1 KiB
- references/operations/optimizePrimvars.md1.1 KiB
- references/operations/optimizeSkelRoots.md1.1 KiB
- references/operations/optimizeTimeSamples.md1.1 KiB
- references/operations/organizePrototypes.md1.1 KiB
- references/operations/pivot.md1.0 KiB
- references/operations/primitivesToMeshes.md1.1 KiB
- references/operations/printStats.md1.0 KiB
- references/operations/probe-snapshots/so-110.0.4.json1.8 KiB
- references/operations/pruneLeaves.md1.1 KiB
- references/operations/pythonScript.md1.0 KiB
- references/operations/remeshMeshes.md1.1 KiB
- references/operations/removeAttributes.md1.1 KiB
- references/operations/removePrims.md1.1 KiB
- references/operations/removeSmallGeometry.md1.1 KiB
- references/operations/removeUntypedPrims.md1.1 KiB
- references/operations/removeUnusedUVs.md1.1 KiB
- references/operations/rtxMeshCount.md1.1 KiB
- references/operations/scripts/operation-curation.schema.json1.2 KiB
- references/operations/scripts/operation-manifest.schema.json1.8 KiB
- references/operations/shrinkwrap.md1.0 KiB
- references/operations/sparseMeshes.md1.1 KiB
- references/operations/splitMeshes.md1.0 KiB
- references/operations/subdivideMeshes.md1.1 KiB
- references/operations/triangulateMeshes.md1.1 KiB
- references/operations/utilityFunction.md1.1 KiB
- references/optimization-report/README.md14.6 KiB
- references/optimization-report/references/optimization-report-template.md10.4 KiB
- references/optimization-report/scripts/optimization-report.schema.json9.7 KiB
- references/output-workspace.md3.1 KiB
- references/profile-stage/README.md13.7 KiB
- references/report-templates/README.md1.4 KiB
- references/report-templates/optimization-report.design-fixture.json6.4 KiB
- references/report-templates/optimization-report.html.template8.6 KiB
- references/report-templates/optimization-report.md.template1.7 KiB
- references/report-templates/render_preview.pyScript8.2 KiB
- references/runtime-artifact-token-budget.md3.8 KiB
- references/setup-usd-performance-tuning/README.md12.2 KiB
- references/setup-usd-performance-tuning/references/install-asset-validator-standalone/README.md3.8 KiB
- references/setup-usd-performance-tuning/references/install-kit/README.md2.6 KiB
- references/setup-usd-performance-tuning/references/install-so-standalone/README.md11.0 KiB
- references/setup-usd-performance-tuning/references/install-so-via-kit/README.md3.7 KiB
- references/setup-usd-performance-tuning/references/kit-discovery.md2.9 KiB
- references/setup-usd-performance-tuning/references/runtime-context-header.md13.2 KiB
- references/setup-usd-performance-tuning/references/runtime-probe.md4.5 KiB
- references/setup-usd-performance-tuning/references/standalone-runtime.md2.7 KiB
- references/setup-usd-performance-tuning/scripts/probe-snapshot.schema.json1.7 KiB
- references/setup-usd-performance-tuning/scripts/setup-preflight.schema.json2.8 KiB
- references/skill-map.md6.3 KiB
- references/so-run-operations/README.md3.5 KiB
- references/so-run-operations/references/batch-mode.md4.5 KiB
- references/so-run-operations/references/config-from-evidence.md4.4 KiB
- references/so-run-operations/references/invocation.md4.5 KiB
- references/so-run-operations/references/operation-safety.md8.7 KiB
- references/so-run-operations/references/pipelines.md2.4 KiB
- references/so-run-operations/references/so-create-proxy/README.md1.7 KiB
- references/so-run-operations/references/so-create-proxy/references/bounding-box-proxy-modes.md1.5 KiB
- references/so-run-operations/references/so-create-proxy/references/decimate-step-recipes.md1.5 KiB
- references/so-run-operations/references/so-create-proxy/references/decimation-tuning.md1.5 KiB
- references/so-run-operations/references/so-create-proxy/references/proxy-config-recipes.md1.6 KiB
- references/so-run-operations/references/units-and-tolerances.md3.8 KiB
- references/upstreams/usd-optimize.md3.1 KiB
- references/usd-structure-assessment/README.md24.8 KiB
- references/usd-structure-assessment/references/apply-restructure/README.md14.2 KiB
- references/usd-structure-assessment/references/apply-restructure/references/hierarchy-dedupe-rewrite-tool-spec.md8.5 KiB
- references/usd-structure-assessment/references/apply-restructure/references/ref-remap-mode.md2.4 KiB
- references/usd-structure-assessment/references/apply-restructure/references/restructure-mode.md8.2 KiB
- references/usd-structure-assessment/references/asset-structure-principles.md60.1 KiB
- references/usd-structure-assessment/references/composition-audit.md4.8 KiB
- references/usd-structure-assessment/references/factory-level-structuring.md24.0 KiB
- references/usd-structure-assessment/references/instancing-readiness/README.md8.5 KiB
- references/usd-structure-assessment/references/instancing-readiness/references/instancing-guide.md45.0 KiB
- references/usd-structure-assessment/references/instancing-readiness/references/instancing-tradeoffs.md5.6 KiB
- references/usd-structure-assessment/references/layer-health.md3.1 KiB
- references/usd-structure-assessment/references/optimization-tradeoffs.md8.6 KiB
- references/usd-structure-assessment/references/restructure-decision/README.md16.5 KiB
- references/usd-structure-assessment/references/usd-edit-target-planner/README.md6.3 KiB
- references/usd-structure-assessment/references/usd-edit-target-planner/references/output-saving.md2.1 KiB
- references/usd-structure-assessment/references/usd-edit-target-planner/references/variants-payloads.md4.2 KiB
- references/usd-structure-assessment/references/usd-hierarchy-dedupe-candidates/README.md5.7 KiB
- references/usd-structure-assessment/references/usd-hierarchy-dedupe-candidates/references/instance-candidate-finder-spec.md34.2 KiB
- references/usd-structure-assessment/scripts/audit-report.schema.json1.9 KiB
- references/usd-structure-assessment/scripts/optimization-plan.schema.json1.5 KiB
- references/usd-structure-assessment/scripts/usd-structure-assessment-report.schema.json9.5 KiB
- references/usd-validation-runner/README.md13.0 KiB
- references/usd-validation-runner/references/so-interpret-validators/README.md3.6 KiB
- references/usd-validation-runner/references/so-interpret-validators/references/follow-up-queries.md4.6 KiB
- references/usd-validation-runner/references/so-interpret-validators/references/rule-reference.md8.2 KiB
- references/usd-validation-runner/references/so-run-validators/README.md2.9 KiB
- references/usd-validation-runner/references/so-run-validators/references/infrastructure.md1.6 KiB
- references/usd-validation-runner/references/validate-usd-asset-validator.md13.7 KiB
- references/usd-validation-runner/references/validation-scoping.md23.8 KiB
- references/usd-validation-runner/scripts/asset-validator-validation-report.schema.json2.7 KiB
- references/usd-validation-runner/scripts/validation-report.schema.json1009 B
- references/workflow.md24.5 KiB
- skill-card.md2.5 KiB
- skill.oms.sig39.9 KiB
references/profile-stage/README.md
Profile Stage
<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
When to Use
Use when profiling a USD stage before/after optimization; do not use to interpret regressions alone.
Instructions
Confirm the target asset, artifact, or user intent and check the prerequisites listed below.
Read only the referenced files needed for the current phase, failure mode, or output contract.
Follow the workflow, rules, and safety gates in this reference before invoking downstream references or shell commands.
Return the result using the Output Format section and name any blocked prerequisite or unresolved user decision.
Pre-flight Checklist
Before running profile measurements, re-read and confirm:
[ ]
references/runtime-artifact-token-budget.md— keep raw profile output on disk, read bounded summaries only.[ ] Output workspace policy from
references/output-workspace.md.[ ] Profiling mode (quick vs full) matches what was used for baseline — never compare across modes.
[ ] For full mode: multi-sample warm protocol (discard first, average rest).
Output Format
Return a concise status or report that names the input, selected runtime or evidence source, actions planned or performed, artifacts written, blockers, and the next validation or user-decision step. When a schema or template is referenced below, conform to that contract.
Use this reference to capture measurable performance data. Run it before optimization to establish a baseline, and after to verify improvement.
Purpose
Capture repeatable quick or full performance metrics for a USD stage so optimization decisions and before/after comparisons are evidence-based.
Runtime artifact token budget
Follow
skills/omniverse-usd-performance-tuning/references/runtime-artifact-token-budget.md
for Kit logs, Tracy captures, and CSV exports. Do not load full .tracy files,
Tracy CSVs, or Kit logs into context. Extract compact metrics and keep the raw
captures on disk.
Prerequisites
A readable USD stage path.
pxrPython API for quick mode.Kit, Isaac Sim, or compatible runtime plus Tracy support for full mode.
Same profiling mode and environment for any baseline/after comparison.
Examples
"Profile this USD stage in quick mode before optimization."
"Capture a full Kit runtime profile after mesh cleanup."
Quick Mode (USD-level, always available)
Requires only the pxr Python API. No Kit, no GPU needed. Measures:
Stage open time (cold + warm) — composition cost.
Prim traversal time — scene graph complexity.
Attribute resolution time — value resolution across composition arcs.
Transform computation time — XformCache world transforms.
Material binding resolution time — ComputeBoundMaterial cost.
Usage
from pxr import Usd, UsdGeom, UsdShade, UsdUtils
from statistics import median
import gc
import time
stage_path = "/path/to/stage.usd"
def open_once_ms(path):
t0 = time.perf_counter()
stage = Usd.Stage.Open(path)
elapsed_ms = (time.perf_counter() - t0) * 1000
del stage
gc.collect()
return elapsed_ms
# Stage-open timing. Prefer running this script in a fresh process for each
# baseline/after capture. Treat cold_open_ms as the first measured open in this
# capture process, not a guaranteed OS-cold read.
cold_open_ms = open_once_ms(stage_path)
_warmup_open_ms = open_once_ms(stage_path)
warm_open_samples_ms = [open_once_ms(stage_path) for _ in range(5)]
warm_open_ms = median(warm_open_samples_ms)
warm_open_spread_pct = (
(max(warm_open_samples_ms) - min(warm_open_samples_ms)) / warm_open_ms * 100
if warm_open_ms
else 0.0
)
stage = Usd.Stage.Open(stage_path)
# Traversal — measure only the default-prim hierarchy (authored scene graph),
# excluding prototype prims (/__Prototype_*). Prototypes are internal to USD
# instancing and their traversal cost is a composition-setup cost, not a
# scene-graph complexity cost. Comparing before/after traversal is only
# meaningful when both measurements cover the same logical scope.
all_prims = list(stage.Traverse())
# Filter out prototype prims for the traversal measurement.
# stage.Traverse() DOES visit /__Prototype_* prims when prototype_count > 0,
# so we must exclude them to measure authored scene-graph complexity only.
def is_prototype_prim(prim):
"""Return True if prim lives under a /__Prototype_* root."""
path_str = str(prim.GetPath())
return path_str.startswith("/__Prototype_")
authored_prims = [p for p in all_prims if not is_prototype_prim(p)]
t0 = time.perf_counter()
for _ in range(10):
# Re-traverse but measure only authored scope traversal time
prims = [p for p in stage.Traverse() if not is_prototype_prim(p)]
traverse_ms = (time.perf_counter() - t0) * 1000 / 10
# Full traversal including prototypes (for reference / completeness)
traverse_full_ms_t0 = time.perf_counter()
for _ in range(10):
list(stage.Traverse())
traverse_full_ms = (time.perf_counter() - traverse_full_ms_t0) * 1000 / 10
# Instance-proxy traversal (only meaningful when instance_count > 0).
all_prims_with_proxies = list(stage.Traverse(Usd.TraverseInstanceProxies()))
# Attribute resolution
t0 = time.perf_counter()
for prim in authored_prims:
for attr in prim.GetAttributes():
attr.Get()
resolve_ms = (time.perf_counter() - t0) * 1000
# Transform computation
xf_cache = UsdGeom.XformCache()
xformable = [p for p in authored_prims if p.IsA(UsdGeom.Xformable)]
t0 = time.perf_counter()
for prim in xformable:
xf_cache.GetLocalToWorldTransform(prim)
xform_ms = (time.perf_counter() - t0) * 1000
# Stage stats
stats = UsdUtils.ComputeUsdStageStats(stage)Quick mode output
{
"mode": "quick",
"stage_path": "/path/to/stage.usd",
"cold_open_ms": 485.2,
"warm_open_ms": 104.1,
"warm_open_samples_ms": [106.2, 101.9, 104.1, 103.8, 105.0],
"warm_open_sample_count": 5,
"warm_open_spread_pct": 4.1,
"open_timing_context": "fresh_process",
"traverse_ms": 0.84,
"traverse_full_ms": 1.02,
"attribute_resolution_ms": 169.9,
"transform_ms": 10.2,
"prim_count": 2742,
"prim_count_authored": 2742,
"prim_count_with_instance_proxies": 2742,
"layer_count": 230,
"instance_count": 0,
"prototype_count": 0,
"total_attributes": 62076
}traverse_ms measures only authored prims (excludes /__Prototype_* subtrees);
traverse_full_ms measures the full stage.Traverse() including prototypes.
Use traverse_ms for before/after comparisons — it represents the user-visible
scene graph complexity. traverse_full_ms is diagnostic-only (composition setup
cost).
prim_count is the total from stage.Traverse() (includes prototype prims);
prim_count_authored excludes /__Prototype_* subtrees (the authored scene graph);
prim_count_with_instance_proxies is the rendered-geometry footprint (what
Hydra walks). When instance_count > 0 these three diverge — report all so
the optimization-report can attribute regressions to the right axis.
Stage-open Timing Protocol
Use this protocol for cold_open_ms and warm_open_ms; do not treat a single
post-optimization warm open as a verdict.
Prefer a fresh process for each baseline and after capture. If the capture must run inside the same long-running process that performed optimization, set
open_timing_contexttosame_process_warmand lower confidence.For each stage path, record one first-open timing, run one unreported warmup open, then measure at least five warm opens. Set
warm_open_msto the median and includewarm_open_samples_ms,warm_open_sample_count, andwarm_open_spread_pctwhen possible.If the optimized file was just written, run the same warmup/sample protocol before comparing it to the baseline. Do not compare a first after-write open to a warmed baseline.
If warm samples are noisy (for example, max-min exceeds 15% of median) or the before/after delta is within the measured spread, mark warm-load evidence as inconclusive in
compare-profilesrather than a regression.
Full Mode (Kit runtime, requires Isaac Sim + GPU)
Captures actual rendering performance via Tracy. Measures everything in quick mode plus:
FPS (steady-state frame rate).
Frame time (mean, p50, p95, min, max).
Hydra sync time — USD → Hydra scene population.
RTX render time — GPU rendering passes.
Shader compilation time — first-run shader cache cost.
Stage load event timing — from Kit's internal instrumentation.
Prerequisites
Isaac Sim or Kit SDK with RTX renderer.
Scene Optimizer
omni.kit.profiler.tracyextension.GPU with display (headless with virtual display works).
Usage
Launch Isaac Sim with Tracy profiler:
from isaacsim import SimulationApp
app = SimulationApp({
'headless': True,
'extra_args': [
'--/app/profilerBackend=tracy',
'--/app/profileFromStart=true',
'--/profiler/enabled=true',
'--/profiler/gpu=true',
'--/profiler/gpu/tracyInject/enabled=true',
'--/app/profilerMask=1',
'--enable', 'omni.kit.profiler.tracy',
]
})Capture the trace with the Tracy capture binary bundled in
omni.kit.profiler.tracy extension. Export with csvexport.
Treat Tracy CSV exports as large artifacts: run an analyzer that emits compact startup/runtime summaries, or read only bounded heads/tails and targeted zone matches. Never paste the full CSV into the report.
For detailed capture procedure and analysis, refer to the external
profiling skills at NVIDIA/omniperf/.agents/skills/profiling/SKILL.md
and NVIDIA/omniperf/.agents/skills/nsys-analyze/SKILL.md.
Full mode output
{
"mode": "full",
"stage_path": "/path/to/stage.usd",
"quick_metrics": { "...same as quick mode..." },
"kit_metrics": {
"fps_mean": 43.2,
"frame_time_mean_ms": 23.1,
"frame_time_p95_ms": 25.8,
"hydra_sync_ms": 4.4,
"rtx_render_ms": 3.1,
"stage_load_ms": 580,
"shader_compile_ms": 8200,
"tracy_zone_count": 101707,
"trace_file": "/path/to/trace.tracy"
}
}Full mode: startup vs runtime separation
When capturing Tracy data, separate the zone report into two sections:
Startup zones — count=1 or proportional to extension/device count. Report total startup time.
Runtime zones — count matches frame count. Report per-frame averages.
Classification: if zone count is within ±10% of the rendered frame count, it is a runtime zone. Otherwise it is startup.
Output should include:
{
"startup_zones": [
{"name": "compileShaderGroupForDevice", "total_ms": 6998, "count": 178}
],
"runtime_zones": [
{"name": "App Update", "mean_ms": 15.7, "count": 139},
{"name": "hydraRenderViews", "mean_ms": 9.6, "count": 104}
],
"startup_total_ms": 25646,
"runtime_mean_frame_ms": 15.7
}This separation enables compare-profiles to correctly classify tradeoffs
(startup cost increase + runtime improvement = net positive, not a regression).
When to use which mode
Quick mode for structural optimization (instancing, layer packaging, reference remapping). Measures composition cost which is what these changes affect.
Full mode for geometry optimization (mesh cleanup, decimation, material consolidation). Measures rendering cost which is what these changes affect.
Always run the same mode before and after for a valid comparison.
What quick mode can and cannot prove (standalone-path caveat)
Quick mode is the only available mode when the Phase 0 runtime is
standalone Scene Optimizer (no Kit). The agent must be explicit in the
final optimization-report about which claims quick-mode metrics support
and which they do not.
Quick mode CAN prove:
Stage open time (cold + warm) — composition + I/O cost.
Prim / layer / instance / prototype counts — structural complexity.
Attribute resolution + transform compute — composition-arc evaluation cost.
Aggregate disk-size deltas on prototype / sub-asset files (compared separately, not part of quick mode itself).
Quick mode CANNOT prove:
Steady-state FPS or frame time (no renderer).
VRAM footprint (no GPU allocator).
Hydra sync / RTX render / shader compile costs.
Real draw-call count under the renderer (SO analysis-mode
rtxMeshCountreports a count, but the renderer's actual draw-call count depends on Hydra batching, instance promotion, and material switch grouping that only the runtime sees).
When this reference ran in quick mode only, the report's verdict should
explicitly note that render-time claims (FPS, frame time, VRAM, draw-call
count) are unmeasured. Improvements predicted by rtxMeshCount or
prototype sharing are plausible but not verified. See
skills/omniverse-usd-performance-tuning/references/optimization-report/references/optimization-report-template.md §"Degraded path (SO
unavailable)" and §"Quick-mode-only caveat" for the report wording.
Rules
Use the Stage-open Timing Protocol above for
cold_open_msandwarm_open_ms.Do not compare quick mode baseline to full mode post-optimization (or vice versa).
Store profile results as JSON for the compare-profiles skill.
Limitations
Quick mode measures USD-level structure and composition, not rendered FPS.
Full mode requires a compatible Kit runtime, GPU/display setup, and Tracy capture tooling.
A single profile cannot determine improvement; compare matching baseline and after results.
Troubleshooting
If
pxrimports fail, run setup to choose a Kit or standalone USD Python runtime.If full mode cannot load Tracy, verify
omni.kit.profiler.tracyis enabled in the selected Kit runtime.If warm-open samples vary widely, rerun the protocol in fresh processes; if variance persists, mark warm-load evidence inconclusive.
Requirements and compatibility
Written for: OpenAI Codex
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 Python
The author says: Orchestrator skill. Downstream phases may require Kit, Scene Optimizer, Asset Validator, USD Python, writable output paths, and omniverse:// authentication selected by setup-usd-performance-tuning.
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 Omniverse
- Publisher
- OpenAI (Official)
- Distributed by
- OpenAI
- Source
- openai/plugins · plugins/nvidia/skills/omniverse-usd-performance-tuning · commit d420d13
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (written by AutoGineer)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA Omniverse or OpenAI.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download omniverse-usd-performance-tuning.zip