NVIDIA Isaac Sim на GPU: физика и сенсоры

Задача страницы. Инженерный гид по запуску и эксплуатации симуляций на базе Isaac Sim: физика (rigid/constraints), сенсоры (RGB/Depth/LiDAR/IMU/Radar), генерация синтетических датасетов и петли RL/контроля. Разберём пайплайны real‑time и батчи, таблицу sizing по профилям 24/48/80 ГБ, конфиги (Docker/K8s/YAML), метрики (сим‑FPS/physics‑dt/сенсорный трейс), экономику и траблшутинг. Паттерны: локальный NVMe‑кэш ассетов/датасетов, отдельные пулы On‑Demand (интерактив/стриминг) и Interruptible (оффлайн‑рендер/датасеты), контейнеризация и наблюдаемость.

TL;DR

  • **Три ключевых сценария:

  • Синтетические датасеты (батч): параметризация сцен → доменная рандомизация → рендер/аннотации → выгрузка на NVMe/объектное хранилище.

  • Реал‑тайм/контроль: headless рендер с низкой латентностью, стрим RGB/Depth/LiDAR/IMU, ROS2‑бридж, замкнутая петля контроллеров.

  • RL/планирование: параллельные envs, ускоренная физика (substeps), офлайн/онлайн оценка.

  • Физика/сенсоры: детерминируемые шаги physics_dt/substeps, согласование временных штампов с сенсорами (rate‑control), правдоподобный шум/DR.

  • Тюнинг GPU: FP16 для пост‑процесса, RTX‑вкл для LiDAR/камер, ограничение ray depth/spp, NVMe‑кэш текстур и USD‑ассетов. См. https://cloudcompute.ru/solutions/performance-tuning/ и https://cloudcompute.ru/solutions/throughput-vs-latency/

  • Наблюдаемость: sim_fps p50/p95, physics_dt, sensor_pub_lag_ms, gpu_util/HBM, frame_drop_rate, dataset_fps. Дашборды — см. https://cloudcompute.ru/solutions/monitoring-logging/ и https://cloudcompute.ru/solutions/llm-inference/observability/

  • Экономика: Cost_per_sim_hour ≈ c_gpu / U, Frames_per_$ ≈ FPS × 3600 / (c_gpu × U), для батча: T_batch ≈ Frames / (FPS × N_gpu × U). Планирование — https://cloudcompute.ru/solutions/cost-planner/

Сценарии (когда это нужно)

  • CV/роботика: генерация датасетов (детекция/сегментация/кейпоинты), сим‑сенсоры с аннотациями, доменная рандомизация (материалы, свет, позы, шум).
  • Навигация/манипуляции: RL/IL/планирование траекторий, оценка контроллеров, HIL/SIL.
  • Цифровые двойники: стенды для регресс‑тестов, стресс‑тесты и проверки безопасных режимов.
  • ROS2/контроль в петле: сенсорный стрим → контроллер → командные топики/экшены → сим‑актуаторы.
  • Сим‑рендеринг/визуализация: интерактивные обзоры сцены, удалённые рабочие станции, предпросмотр батч‑джобов.

Архитектуры/пайплайны 1) Синтетические датасеты (батч‑рендер)

Assets (USD/материалы/HD)
 └─> Param/Randomization (сцены, позы, свет, шум)
 └─> Physics tick (dt, substeps)
 └─> Sensors (RGB/Depth/LiDAR/Segm/Flow)
 └─> Annotations (bbox/mask/keypoints/poses)
 └─> Writer (NVMe: COCO/Parquet + media)
 └─> Catalog/Manifest → Training

Особенности: headless, контроль spp/rayDepth, батчи по сценам/ракурсам, параллельные воркеры.

2) Реал‑тайм петля (ROS2/стриминг)

Controller/Planner
 ↑ cmd/trajectory
Isaac Sim (headless)
 ├─ Physics (fixed dt, substeps)
 ├─ Sensors (RGB/Depth/LiDAR/IMU)
 ├─ ROS2 Bridge (pub/sub) or WS/SSE
 └─ Telemetry (metrics/logs)
 ↓ topics/images/pointcloud/odom

Особенности: rate‑limit сенсоров (Hz), синхронизация timestamp, QoS и backpressure.

3) RL/мульти‑env

Env Manager ─> N parallel envs ─> Step/Reset
 ├─ Physics step (vectorized)
 ├─ Sensors (minimal set)
 └─ Reward/Done
Policy (GPU) <─ rollout buffers ─> Optimizer

Особенности: минимizировать I/O, хранить state в GPU, фиксированная генерация «сидов».

Профили GPU и ориентиры (инженерные диапазоны)

При U≈0.7, headless рендер, RTX‑сенсоры, physics dt=1/60, substeps=2. Значения зависят от ассетов, освещения, разрешений и числа сенсоров.

**Профиль GPU** **Память** **Типичные стеки** **Real‑time сцены\*** **Батч‑рендер FPS\*\*** **Комментарии**
24 ГБ (Compact) 24 ГБ 1–2 RGB 1280×720 + LiDAR(64 лучей), базовая сцена 1 50–120 Интерактив/отладка, малые сцены.
48 ГБ (Balanced) 48 ГБ 2–4 RGB 1920×1080 + LiDAR(128) + Depth, средняя сцена 1–2 120–250 Баланс HQ/скорости, устойчивый p95.
80 ГБ (HQ) 80 ГБ 4–6 RGB 2K + LiDAR(128–256) + Radar/IMU, сложная сцена 2–4 250–500+ Крупные ассеты/DR/мульти‑env.

* Одновременные real‑time сессии на 1 GPU. ** Батч‑кадры/сек для конвейера рендера/аннотаций. Тюнинг и распараллеливание: https://cloudcompute.ru/solutions/multi-gpu/, https://cloudcompute.ru/solutions/performance-tuning/

Конфиги и скелеты кода

Docker Compose (headless симуляция + датасеты + ROS2‑бридж)

version: "3.9"
x-env: &env
 OMNI_HEADLESS: "1"
 RENDER_RES: "1920x1080"
 PHYSICS_DT: "0.0166667" # 60 Гц
 PHYSICS_SUBSTEPS: "2"
 RTX_LIDAR: "1"
 RTX_DENOISER: "1"
 SPP: "2" # samples per pixel
 RAY_DEPTH: "3"
 ASSETS_DIR: "/assets"
 OUTPUT_DIR: "/datasets"
 ROS2_BRIDGE: "enabled" # enabled|disabled
services:
 isaac-batch:
 image: cloudcompute/isaac-sim:latest
 environment:
 <<: *env
 MODE: "batch"
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 volumes:
 - /nvme/assets:/assets
 - /nvme/datasets:/datasets
 - /nvme/cache:/var/cache/isaac
 command: ["python","apps/batch_dataset.py","--scenes","/assets/scenes/"]
 isaac-rt:
 image: cloudcompute/isaac-sim:latest
 environment:
 <<: *env
 MODE: "realtime"
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 ports: ["8100:8100"] # http/ws для стриминга
 volumes:
 - /nvme/assets:/assets
 - /nvme/cache:/var/cache/isaac
 command: ["python","apps/rt_server.py","--host","0.0.0.0","--port","8100"]

K8s (1 GPU/под, headless)

apiVersion: apps/v1
kind: Deployment
metadata: { name: isaac-rt }
spec:
 replicas: 2
 selector: { matchLabels: { app: isaac-rt } }
 template:
 metadata: { labels: { app: isaac-rt } }
 spec:
 containers:
 - name: sim
 image: cloudcompute/isaac-sim:latest
 ports: [{ containerPort: 8100 }]
 env:
 - { name: OMNI_HEADLESS, value: "1" }
 - { name: RENDER_RES, value: "1920x1080" }
 - { name: PHYSICS_DT, value: "0.0166667" }
 - { name: PHYSICS_SUBSTEPS, value: "2" }
 - { name: RTX_LIDAR, value: "1" }
 volumeMounts:
 - { name: assets, mountPath: /assets }
 - { name: cache, mountPath: /var/cache/isaac }
 resources:
 limits: { nvidia.com/gpu: 1, cpu: "4", memory: "24Gi" }
 volumes:
 - name: assets ; hostPath: { path: /nvme/assets }
 - name: cache ; hostPath: { path: /nvme/cache }

Конфиг сцены (YAML): физика, камеры, лидар, датасет‑пайплайн

scene:
 usd: "/assets/scenes/warehouse.usd"
 physics:
 dt: 0.0166667
 substeps: 2
 gravity: [0, 0, -9.81]
 solver_iterations: 8
 robots:
 - usd: "/assets/robots/mobile.usd"
 spawn_pose: [0, 0, 0]
 controllers: ["diff_drive"]
 sensors:
 cameras:
 - name: "front_rgb"
 res: [1920, 1080]
 fov_deg: 90
 rate_hz: 30
 outputs: ["rgb","depth","segm"]
 - name: "rear_rgb"
 res: [1280, 720]
 fov_deg: 100
 rate_hz: 30
 outputs: ["rgb"]
 lidars:
 - name: "roof_lidar"
 rings: 64
 points_per_ring: 1024
 rate_hz: 10
 max_range_m: 120
 ray_depth: 3
 noise_std: 0.02
 imu:
 - name: "imu_1"
 rate_hz: 200
 randomization:
 seeds: 42
 materials: { albedo_jitter: 0.05, roughness_jitter: 0.1 }
 lights: { intensity: [300, 2000], hue_jitter: 0.02 }
 poses: { robot_xy_sigma: 0.3, yaw_sigma_deg: 5.0 }
dataset:
 format: "coco"
 out_dir: "/datasets/run_2025_08_29/"
 shards: 64
 compression: "zstd"
 annotations: ["bbox","mask","depth","pose"]

Python (скелет): загрузка сцены, сенсоры, доменная рандомизация, запись датасета

from omni.isaac.core import SimulationApp
from omni.isaac.core.utils.stage import open_stage, add_reference_to_stage
from omni.isaac.sensor import Camera, LidarRtx
from utils.rand import apply_randomization
from utils.writer import DatasetWriter
cfg = load_yaml("config.yaml")
simulation_app = SimulationApp({"headless": True, "width": cfg["scene"]["sensors"]["cameras"][0]["res"][0],
 "height": cfg["scene"]["sensors"]["cameras"][0]["res"][1]})
open_stage(cfg["scene"]["usd"])
for r in cfg["scene"]["robots"]:
 add_reference_to_stage(r["usd"], "/World/Robot")
cam = Camera("/World/Robot/CameraFront", resolution=tuple(cfg["scene"]["sensors"]["cameras"][0]["res"]), freq=30)
lid = LidarRtx("/World/Robot/Lidar", horizontal_fov_deg=360, vertical_beams=64, rotation_rate=10)
writer = DatasetWriter(cfg["dataset"])
sim_dt = cfg["scene"]["physics"]["dt"]
for frame in range(0, 10000):
 if frame % 30 == 0:
 apply_randomization(cfg["randomization"])
 simulation_app.update() # physics+render tick
 rgb = cam.get_rgba()
 depth = cam.get_depth()
 segm = cam.get_semantic_segmentation()
 cloud = lid.get_point_cloud()
 writer.write(frame_idx=frame, rgb=rgb, depth=depth, segm=segm, point_cloud=cloud)
simulation_app.close()

Python (скелет): ROS2‑бридж (паблиш RGB/Depth/LiDAR, подписка на cmd)

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image, PointCloud2
from geometry_msgs.msg import Twist
class Bridge(Node):
 def __init__(self, sim):
 super().__init__("isaac_bridge")
 self.pub_img = self.create_publisher(Image, "/sim/front_rgb", 10)
 self.pub_cloud = self.create_publisher(PointCloud2, "/sim/roof_lidar", 10)
 self.create_subscription(Twist, "/cmd_vel", self.on_cmd, 10)
 self.sim = sim
 def tick(self):
 self.sim.step()
 img = to_ros_image(self.sim.cam_rgba())
 cloud = to_ros_cloud(self.sim.lidar_cloud())
 self.pub_img.publish(img)
 self.pub_cloud.publish(cloud)
 def on_cmd(self, msg: Twist):
 self.sim.set_cmd(msg.linear.x, msg.angular.z)
def main():
 sim = create_sim_from_yaml("config.yaml")
 rclpy.init()
 br = Bridge(sim)
 rate = br.create_rate(30)
 while rclpy.ok():
 br.tick(); rclpy.spin_once(br, timeout_sec=0.0); rate.sleep()

Python (скелет): RL‑окружение (векторизованное)

class IsaacEnvVec:
 def __init__(self, n_envs=64, dt=1/60):
 self.sim = make_vectorized_sim(n_envs, dt)
 def reset(self):
 states = self.sim.reset_all()
 return obs_from(states)
 def step(self, actions):
 self.sim.apply_actions(actions)
 self.sim.step()
 obs = obs_from(self.sim.state())
 rew, done = compute_reward_done(obs)
 return obs, rew, done, {}
# Обучение: policy.forward(obs) -> actions -> env.step -> rollout buffer -> optimize
``` ## **Наблюдаемость/метрики/алерты**

**Latency/Perf:**

- sim\_fps — кадры симуляции в секунду (цель p95 указать в SLA: напр., ≥ 30 FPS интерактив/≥ 200 FPS батч).
- physics\_dt, physics\_substeps, physics\_step\_ms — стабильность шага.
- render\_ms{pass=rtx|post} — длительность рендер‑пасс.
- sensor\_pub\_lag\_ms{rgb|depth|lidar} — лаг публикации (ROS/WS).
- frame\_drop\_rate — доля потерянных кадров/пакетов.

**GPU/IO:**

- gpu\_utilization, gpu\_mem\_peak\_bytes, rtx\_ray\_count, nvme\_{read,write}\_mb\_s, asset\_cache\_hit\_rate.

**Datasets:**

- dataset\_fps, annotation\_time\_ms, shard\_size\_mb, shard\_count.

**Алерты:**

- sim\_fps\_p95 &lt; target — уменьшить spp/rayDepth, разрешение, включить денойзер, снизить число сенсоров, добавить GPU.
- sensor\_pub\_lag\_ms\_p95 &gt; SLA — уменьшить частоту/размер кадров, включить backpressure, отделить поток ROS/WS на другой под.
- gpu\_mem\_peak/HBM &gt; 0.9 — упростить сцену/текстуры, уменьшить одновременно активные сенсоры, увеличить профиль HBM.
- frame\_drop\_rate &gt; 0.01 — повысить буферы, QoS, снизить FPS/битрейт.

Детали по наблюдаемости и логированию:
[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/) • <https://cloudcompute.ru/solutions/llm-inference/observability/>

## **Экономика и формулы**

Обозначения: c\_gpu — цена/час, U — целевая загрузка, FPS — кадры/сек, N\_gpu — число GPU.

- **Стоимость часа симуляции:
 Cost\_per\_sim\_hour ≈ c\_gpu / U.
- **Батч‑рендер (время партии):
 T\_batch ≈ Frames / (FPS × N\_gpu × U).
- **Кадров на 1 $ (оценка):
 Frames\_per\_$ ≈ FPS × 3600 / (c\_gpu × U).
- **Параллельные envs (RL):
 Env\_per\_GPU ≈ floor( HBM / (state\_mem + sensor\_mem × N\_sensors) ).

Оптимизация бюджета: снижайте разрешение/частоту/spp, используйте профили **24/48/80 ГБ** по сложности сцены и числу сенсоров. См. <https://cloudcompute.ru/solutions/cost-planner/> и <https://cloudcompute.ru/solutions/throughput-vs-latency/>

**Безопасность и политики**

- **Ассеты/лицензии:** храните права на модели/текстуры/сцены; отделяйте частные ассеты по бакетам/ролям.
- **Экспорт/PII:** синтетика без PII; при записи телеметрии — маскирование идентификаторов/координат по политике.
- **Ретеншн:** TTL для временных шардов/логов/кадров; контроль доступа к датасетам.
- **Изоляция:** раздельные пулы GPU для интерактива (On‑Demand) и тяжёлых батчей (Interruptible).
- **Секреты:** только Secret‑хранилища и переменные окружения; ротация ключей.

Подробнее: <https://cloudcompute.ru/solutions/security/> • <https://cloudcompute.ru/solutions/storage-data/>

**Траблшутинг**

<table><tbody><tr><td>**Симптом**

</td><td>**Возможная причина**

</td><td>**Решение**

</td></tr><tr><td>Просадки FPS/«рывки»

</td><td>Слишком высокий spp/rayDepth/разрешение

</td><td>Снизить spp/rayDepth, уменьшить разрешение, включить денойзер/temporal AA

</td></tr><tr><td>«Взрыв» физики/разлёт объектов

</td><td>Низкие solver\_iterations/«тонкие» коллайдеры

</td><td>Увеличить итерации/толщину коллайдеров, уменьшить dt/добавить substeps

</td></tr><tr><td>Разнобой тайм‑штампов сенсоров

</td><td>Нет общего physics\_dt/rate‑limit

</td><td>Синхронизировать частоты, фиксировать dt, буферизовать публикацию

</td></tr><tr><td>«Полосы»/дыры в LiDAR

</td><td>Нулевой или чрезмерный rayDepth/noise

</td><td>Настроить rayDepth/шум, проверить нормали/материалы

</td></tr><tr><td>OOM VRAM

</td><td>Крупные текстуры/много сенсоров

</td><td>Сжать текстуры, отключить неиспользуемые пассы, увеличить HBM‑профиль

</td></tr><tr><td>Потери кадров в ROS/WS

</td><td>QoS/буферов не хватает

</td><td>Увеличить очереди, понизить частоту публикации, отделить стрим‑под

</td></tr><tr><td>Непредсказуемая физика при DR

</td><td>Слишком агрессивная рандомизация

</td><td>Ограничить диапазоны DR, фиксировать seed, поэтапно включать шумы

</td></tr><tr><td>Время сборки датасета «скачет»

</td><td>Узкое NVMe/мелкие шард‑файлы

</td><td>Увеличить shards и целевой размер файла, оптимизировать компрессию

</td></tr></tbody></table>

См. также: <https://cloudcompute.ru/solutions/interruptible-patterns/> • <https://cloudcompute.ru/solutions/performance-tuning/>

**Как запустить в cloudcompute.ru**

1. Откройте **Шаблоны запусков**: <https://cloudcompute.ru/solutions/templates/> — выберите **Isaac Sim (Realtime)** и/или **Isaac Sim (Batch Dataset)**.
2. Выберите профиль GPU: **24/48/80 ГБ** — по сложности сцены/сенсоров и SLA.
3. Смонтируйте диски: /nvme/assets, /nvme/datasets, /nvme/cache.
4. Установите переменные окружения по docker-compose.yml (физика, рендер, сенсоры, ROS2‑бридж).
5. Продакшн: раздельные пулы **On‑Demand/Interruptible**, автоскейл по U/FPS/queue, дашборды и алерты, канареечные изменения сцен/скриптов.

Дополнительно по стеку:
[ https://cloudcompute.ru/solutions/containers-ci-cd/](https://cloudcompute.ru/solutions/containers-ci-cd/) — сборка и выкладка образов.
[ https://cloudcompute.ru/solutions/multi-gpu/](https://cloudcompute.ru/solutions/multi-gpu/) — распараллеливание и кластеры.
[ https://cloudcompute.ru/solutions/gradio-fastapi/](https://cloudcompute.ru/solutions/gradio-fastapi/) — быстрые UI/панели управления.
[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/) — метрики и логи.
[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/) — хранение ассетов/датасетов.

**Чек‑лист перед продом**

- Целевые sim\_fps p50/p95, sensor\_pub\_lag\_ms, стабильный physics\_dt/substeps.
- Калиброваны spp/rayDepth/resolution под SLA и бюджет.
- DR/шумы валидированы, сиды зафиксированы; регресс‑набор сцен пройден.
- NVMe‑кэш ассетов/датасетов подключён; шардирование/компрессия настроены.
- Алерты по FPS/lag/HBM/IO/frames\_drop; дашборды собраны.
- Политики прав/PII/ретеншна/экспорта внедрены.
- Разделены пулы **On‑Demand/Interruptible**; канареечные релизы сцен/скриптов и план отката готовы.
- Нагрузочный прогон ≥ 30 мин на целевой сцене/профиле GPU.

**Навигация**

- Хаб «Решения»: <https://cloudcompute.ru/solutions/>
- Производительность и тюнинг: <https://cloudcompute.ru/solutions/performance-tuning/>
- Throughput vs Latency: <https://cloudcompute.ru/solutions/throughput-vs-latency/>
- Multi‑GPU: <https://cloudcompute.ru/solutions/multi-gpu/>
- Хранилища и данные: <https://cloudcompute.ru/solutions/storage-data/>
- Мониторинг и логи: <https://cloudcompute.ru/solutions/monitoring-logging/>
- Наблюдаемость пайплайнов: <https://cloudcompute.ru/solutions/llm-inference/observability/>
- Рекомендательные системы и аналитика (смежные ETL/ML):
 [ https://cloudcompute.ru/solutions/rapids/](https://cloudcompute.ru/solutions/rapids/) • <https://cloudcompute.ru/solutions/spark-rapids/>
- CI/CD контейнеров: <https://cloudcompute.ru/solutions/containers-ci-cd/>

Готовы запустить?

Запустить GPU-сервер