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/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-сервер