Решения

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 < target — уменьшить spp/rayDepth, разрешение, включить денойзер, снизить число сенсоров, добавить GPU.
  • sensor_pub_lag_ms_p95 > SLA — уменьшить частоту/размер кадров, включить backpressure, отделить поток ROS/WS на другой под.
  • gpu_mem_peak/HBM > 0.9 — упростить сцену/текстуры, уменьшить одновременно активные сенсоры, увеличить профиль HBM.
  • frame_drop_rate > 0.01 — повысить буферы, QoS, снизить FPS/битрейт.

Детали по наблюдаемости и логированию:
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/

Траблшутинг

Симптом

Возможная причина

Решение

Просадки FPS/«рывки»

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

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

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

Низкие solver_iterations/«тонкие» коллайдеры

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

Разнобой тайм‑штампов сенсоров

Нет общего physics_dt/rate‑limit

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

«Полосы»/дыры в LiDAR

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

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

OOM VRAM

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

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

Потери кадров в ROS/WS

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

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

Непредсказуемая физика при DR

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

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

Время сборки датасета «скачет»

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

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

См. также: 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/multi-gpu/ — распараллеливание и кластеры.
https://cloudcompute.ru/solutions/gradio-fastapi/ — быстрые UI/панели управления.
https://cloudcompute.ru/solutions/monitoring-logging/ — метрики и логи.
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.

Навигация