Houdini Karma XPU: VRAM и кэширование на GPU

Задача страницы. Практический гайд по запуску Karma XPU в headless‑режиме (через husk/стейджи USD) на фермах облачных GPU: как держать VRAM под контролем, как кэшировать ассеты/шейдеры на NVMe, как резать кадры на регионы (тайлы), как считать стоимость и наблюдать метрики.

TL;DR

  • Оффлайн‑рендер: headless‑пайплайн по кадрам/тайлам, Interruptible при чанк‑времени ≤ 120 с, ретраи, «горячий» NVMe‑кэш — лучший throughput.
  • Интерактив: DCC/LOPs на удалённых GPU‑станциях, On‑Demand, целимся в p95 input→pixel; см. https://cloudcompute.ru/solutions/rendering/studio-remote/
  • VRAM‑менеджмент: региональный рендер (data‑window/ROI), инстансинг вместо дубликатов, мип‑текстуры, разумный размер волюметрики, аккуратный layout AOV.
  • Кэш: ассеты в «тёплом» хранилище, локальный NVMe для шейдеров/текстур/темпов; прогрев перед запуском. См. https://cloudcompute.ru/solutions/storage-data/
  • Профили GPU: 24 ГБ (Compact) — предпревью/средние сцены; 48 ГБ (Balanced) — основной профиль; 80 ГБ (HQ) — 4K/8K, тяжёлая волюметрика/раскид шейдеров.
  • Multi‑GPU: чаще эффективнее 1 процесс рендера = 1 GPU; для крупных монолитных кадров — совместное использование всех GPU. См. https://cloudcompute.ru/solutions/multi-gpu/
  • Наблюдаемость: p50/p95 render_frame_seconds, tile_render_seconds, gpu_utilization, gpu_memory_used_bytes, io_read_mb_s; алерты при падении util и росте p95. См. https://cloudcompute.ru/solutions/monitoring-logging/
  • Экономика: Cost_per_frame = (c_gpu * t_frame / 3600) / U * r; для интерактива — Cost_per_hour = c_gpu / U. См. https://cloudcompute.ru/solutions/cost-planner/

Сценарии: оффлайн vs интерактив

Оффлайн‑ферма (batch)

Интерактив (художники/техарты)

  • Работа с LOP‑графом, правки света/материалов; стриминг экрана с низкой латентностью.
  • On‑Demand, p95 frame‑time и FPS — ключевые KPI. См. https://cloudcompute.ru/solutions/rendering/

Гибридная модель

  • Превью/лупдев — интерактив, финал — оффлайн‑очередь.
  • Параллельно считаются «длинные» кадры, короткие — на дешёвых прерываемых инстансах. См. https://cloudcompute.ru/solutions/interruptible-patterns/

Архитектуры/пайплайны (ASCII) ###### A.Headless‑ферма Karma XPU (USD → husk)

[Git/LFS, DVC] -> [Warm Storage /assets,/usd] -> [Prefetch -> NVMe "hot" cache] -> [Job Queue]
 |
 +---------------+---------------+
 | |
 [GPU Worker #1] [GPU Worker #N]
 (husk, tile/frame) (husk, tile/frame)
 | |
 [Tiles/Frames OUT] [Tiles/Frames OUT]
 /
 +----------> [Stitch/Denoise/QA] -> [Cold Archive]

Ключевое: единый контейнер с фиксированными версиями, префетч ассетов, NVMe для шейдер/текстур‑кэша, ретраи по тайлам.

B. Узел с несколькими GPU (выбор модели параллелизма)
[Worker Node: GPU0, GPU1, GPU2, GPU3]
 • Mode 1: один процесс husk -> все GPU (монолитный кадр)
 • Mode 2: по 1 husk на GPU -> независимые кадры/тайлы (часто быстрее)

Для карт 80 ГБ возможен шардинг через MIG для мелких задач. См. https://cloudcompute.ru/solutions/mig/

C. Интерактивная сессия (низкая латентность)
[Artist Input] -> [Remote DCC/LOPs на GPU] -> [NVENC/стрим] -> [Viewer]
 метрики: input->pixel p95, fps, nvenc_util, rtt_ms

Профили GPU/VRAM/скорости (ориентиры)

**Профиль** **VRAM** **Типовые сцены Karma XPU** **Режим** **Отн. throughput (≈)** **Примечания**
**24 ГБ (Compact)** 24 ГБ 1080p предпросмотры, средняя геометрия Interruptible / On‑Demand 1.0 Тайлинг 256–512 px при риске OOM
**48 ГБ (Balanced)** 48 ГБ 1080p/1440p, сложные материалы, умеренная волюметрика Interruptible / On‑Demand 1.5–1.8 Базовый профиль фермы
**80 ГБ (HQ)** 80 ГБ 4K/8K, тяжёлая волюметрика/инстансинг On‑Demand / Interruptible 2.2–2.6 Поддержка MIG для шардинга

Индексы относительны и зависят от стейджа/настроек/камеры.

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

1) Headless‑рендер стейджа USD через husk (диапазон кадров)
# Пример: рендер кадров 100..140 в EXR из RenderSettings-прима
docker run --rm --gpus all 
 -v /projects/usd:/usd 
 -v /projects/out:/out 
 -v /nvme:/nvme 
 registry.local/houdini-karma:latest 
 bash -lc 'export TMPDIR=/nvme/tmp; 
husk -f 100 140 -R /Render/settings_karmxpu -o /out/shot.$F4.exr /usd/shot.usd'

Принципы:

  • -R указывает на RenderSettings прим, где выбран Karma XPU и настроены AOV/резолюции.
  • TMPDIR и все временные папки направлены на NVMe.
2) Региональный рендер (тайлы) через override dataWindowNDC

Генерируем «оверлеи» USD с обрезкой (NDC‑координаты 0..1), чтобы укладываться в чанк ≤ 120 с:

# usd_tile_override.py — создаёт USD с ограниченным окном вывода (NDC)
from pxr import Usd, UsdRender, Gf
SRC = "/usd/shot.usd"
DST = "/usd/tiles/shot_tile_01.usda"
RS_PATH = "/Render/settings_karmxpu" # ваш RenderSettings прим
xmin, ymin, xmax, ymax = 0.0, 0.0, 0.5, 0.5 # левый-низ -> правый-верх (NDC)
stage = Usd.Stage.Open(SRC)
rs = UsdRender.Settings.Get(stage, RS_PATH)
attr = rs.GetDataWindowNDCAttr() or rs.CreateDataWindowNDCAttr()
attr.Set(Gf.Vec4f(xmin, ymin, xmax, ymax))
stage.GetRootLayer().Export(DST)
print("Saved:", DST)

Запуск тайла:

docker run --rm --gpus all -v /projects/usd:/usd -v /projects/out:/out -v /nvme:/nvme 
 registry.local/houdini-karma:latest bash -lc '
python3 /usd/scripts/usd_tile_override.py && 
husk -f 150 150 -R /Render/settings_karmxpu -o /out/tile_01.$F4.exr /usd/tiles/shot_tile_01.usda'

Сборка тайлов выполняется отдельной задачей (stitch + denoise), см. ниже.

3) Stitch (EXR): объединение 2×2 в финальный кадр

Для float‑AOV желательно использовать сборщик, сохраняющий каналы без потерь. Ниже — иллюстрация подхода.

# stitch_exr.py — упрощённый пример (адаптируйте под ваши AOV/каналы)
import OpenImageIO as oiio
W, H = 3840, 2160
tiles = {
 (0, 0): "/out/tile_01.0150.exr",
 (1, 0): "/out/tile_02.0150.exr",
 (0, 1): "/out/tile_03.0150.exr",
 (1, 1): "/out/tile_04.0150.exr",
}
spec = oiio.ImageSpec(W, H, 4, oiio.TypeFloat) # RGBA float
out = oiio.ImageBuf(spec); out.zero()
def paste(dst, src_path, x, y):
 src = oiio.ImageBuf(src_path)
 oiio.ImageBufAlgo.paste(dst, x, y, 0, 0, src)
halfW, halfH = W//2, H//2
paste(out, tiles[(0,0)], 0, 0)
paste(out, tiles[(1,0)], halfW, 0)
paste(out, tiles[(0,1)], 0, halfH)
paste(out, tiles[(1,1)], halfW, halfH)
oiio.ImageOutput.create("frame_0150.exr").write_image(out)
4) Очередь батч‑задач (YAML‑спека)
job:
 name: "shot010_karma_tiles"
 engine: "karma-xpu"
 mode: "interruptible" # on-demand | interruptible
 gpu_profile: "48GB-Balanced" # 24GB-Compact | 48GB-Balanced | 80GB-HQ
 chunk_seconds: 120
 retries: 3
 input:
 usd: "/usd/shot.usd"
 render_settings: "/Render/settings_karmxpu"
 frames: [100..160] # диапазон/список
 tiles:
 grid: [2, 2] # 2x2
 cache:
 nvme_size_gb: 200
 warmup: ["textures/", "shaders/"]
 output:
 dir: "/out/shot010"
 format: "EXR"
 hooks:
 on_start: ["python /scripts/warm_cache.py"]
 on_tile_done: ["python /scripts/register_tile.py"]
 on_frame_done: ["python /scripts/stitch_denoise.py"]
 on_failure: ["python /scripts/requeue.py --backoff"]
5) Узел с 2 GPU: по одному процессу husk на GPU (Compose)
services:
 karma-gpu-0:
 image: registry.local/houdini-karma:latest
 command: >
 bash -lc "husk -f 100 120 -R /Render/settings_karmxpu
 -o /out/gpu0.$F4.exr /usd/shot.usd"
 deploy:
 resources:
 reservations:
 devices: [ { capabilities: ["gpu"], device_ids: ["0"] } ]
 volumes:
 - /projects/usd:/usd
 - /projects/out:/out
 - /nvme:/nvme
 karma-gpu-1:
 image: registry.local/houdini-karma:latest
 command: >
 bash -lc "husk -f 121 140 -R /Render/settings_karmxpu
 -o /out/gpu1.$F4.exr /usd/shot.usd"
 deploy:
 resources:
 reservations:
 devices: [ { capabilities: ["gpu"], device_ids: ["1"] } ]
 volumes:
 - /projects/usd:/usd
 - /projects/out:/out
 - /nvme:/nvme
``` **Наблюдаемость/метрики/алерты**

См. базу:[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/) и трассировку:[ https://cloudcompute.ru/solutions/llm-inference/observability/](https://cloudcompute.ru/solutions/llm-inference/observability/)

**Метрики:**

- render\_frame\_seconds{engine="karma-xpu"} — гистограмма по кадрам.
- tile\_render\_seconds{grid="2x2"} — длительность тайла.
- gpu\_utilization, gpu\_memory\_used\_bytes, gpu\_power\_watts.
- io\_read\_mb\_s, io\_write\_mb\_s, shader\_cache\_hits\_total.
- Для интерактива: frame\_time\_seconds (p50/p95), fps\_actual, input\_to\_pixel\_latency\_ms, nvenc\_utilization.

**Алерты:**

- p95 render\_frame\_seconds > целевого на X% в течение N минут.
- gpu\_utilization < 60% при глубокой очереди → узкое место I/O/CPU/кэш.
- gpu\_memory\_used\_bytes → лимит VRAM → включить тайлинг/урезать текстуры/перейти на больший профиль.
- Низкий shader\_cache\_hits\_total → не прогрет кэш; добавить warmup‑шаг.

## **Практики VRAM и кэша**

- **Тайлинг/ROI**: режьте большие кадры 2×2/3×3; после stitch — глобальный denoise.
- **Инстансинг**: заменяйте дубликаты геометрий инстансами; снижает VRAM и время сборки сцены.
- **Текстуры**: используйте мип‑уровни; ограничивайте 8–16 K текстуры; держите «горячие» наборы на NVMe.
- **Волюметрика/ветвейки**: компрессия/диапазон; разделяйте крупные объёмы на блоки, если это ускоряет стриминг.
- **AOV/пасс‑сет**: включайте только необходимые каналы — каждый AOV потребляет память и I/O.
- **Pinned Memory / zero‑copy**: разгружайте I/O узкие места (см.[ https://cloudcompute.ru/solutions/performance-tuning/](https://cloudcompute.ru/solutions/performance-tuning/)).
- **Prefetch**: прогревайте текстуры/шейдер‑кэш до старта (hook on\_start).
- **NVMe‑budget**: резервируйте 150–300 ГБ под «горячее» (набор зависит от проекта).

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

См. планировщик:[ https://cloudcompute.ru/solutions/cost-planner/](https://cloudcompute.ru/solutions/cost-planner/) и баланс: <https://cloudcompute.ru/solutions/throughput-vs-latency/>

**Кадр:**

Cost\_per\_frame = (c\_gpu \* t\_frame / 3600) / U \* r

c\_gpu — цена/час, t\_frame — сек/кадр, U — целевая загрузка GPU (0..1), r — retry‑factor (Interruptible).

**Тайл‑подход:**

t\_frame ≈ max(T\_tile\_i) + t\_stitch # при параллельном рендере всех тайлов

**Пакет N кадров:**

Cost\_total = N \* Cost\_per\_frame + Overhead\_io + Cost\_stitch\_denoise

**Interruptible выгоден**, если скидка по цене перекрывает ретраи: Discount\_gain &gt; (r - 1) и чанк ≤ 120 с.

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

См.[ https://cloudcompute.ru/solutions/security/](https://cloudcompute.ru/solutions/security/)

- **Секреты** (токены DCC/плагины/серверы) — через секрет‑хранилище, не печатать в логи.
- **Приватные ассеты** — временные токены, запрет листинга бакетов, короткий TTL presign.
- **Изоляция проектов** — выделенные сети/учётки; ограниченный egress.
- **Ретеншн** — EXR/лог‑артефакты в «холодное» через N дней; анонимизация путей в логах.

**Траблшутинг (симптом → причина → решение)**

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

</td><td>**Причина**

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

</td></tr><tr><td>OOM по VRAM на крупных кадрах

</td><td>Слишком большие текстуры/волюметрика

</td><td>Тайлинг 2×2/3×3; уменьшить разрешение/уровни мипов; перейти на 48–80 ГБ

</td></tr><tr><td>Долгий «первый кадр»

</td><td>Холодный шейдер/текстур‑кэш

</td><td>Warmup‑скрипт, кэш на NVMe, не чистить между задачами

</td></tr><tr><td>GPU util 30–40% при глубокой очереди

</td><td>Узкое место I/O/CPU

</td><td>Префетч ассетов, pinned memory, увеличить NVMe, разнести stitch/denoise

</td></tr><tr><td>«Швы» между тайлами

</td><td>Несогласованный шум/AA на границах

</td><td>Фиксировать сид, общий denoise после stitch, аккуратные ROI

</td></tr><tr><td>Разные результаты на воркерах

</td><td>Несовпадение версий/настроек AOV

</td><td>Единый контейнер; smoke‑тест эталонного кадра

</td></tr><tr><td>Cadre &gt; 120 с ломается в Interruptible

</td><td>Недостаточное разбиение

</td><td>Резать на тайлы/strips; критичные кадры — On‑Demand

</td></tr><tr><td>Статтеры в интерактиве

</td><td>Сеть/NVENC или сцена не влезает в VRAM

</td><td>Снизить битрейт/разрешение; увеличить профиль VRAM; оптимизировать сцену

</td></tr><tr><td>Медленный stitch/denoise

</td><td>I/O на «тёплом» хранилище

</td><td>Вынос stitch на NVMe, лимит конкурентности, отдельная очередь

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

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

1. **Шаблон**: выбрать на[ https://cloudcompute.ru/solutions/templates/](https://cloudcompute.ru/solutions/templates/)
 - «Karma XPU headless (USD + husk)» — оффлайн‑ферма.
 - «Remote GPU workstation» — интерактив. См. https://cloudcompute.ru/solutions/rendering/studio-remote/
2. **Профиль GPU**: 24/48/80 ГБ по таблице sizing выше.
3. **Режим**:
 
 - Оффлайн — **Interruptible** с чанк‑целями ≤ 120 с и ретраями.
 - Длинные/критичные — **On‑Demand**.
4. **Хранилище/кэш**: «тёплое» для USD/ассетов, локальный NVMe → hot‑кэш. См.[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/)
5. **Оркестрация**: YAML‑спека jobs + hooks; разнесение stitch/denoise в отдельный этап.
6. **CI/CD**: единый контейнер с зафиксированными версиями, smoke‑рендер перед продуктивом. См. https://cloudcompute.ru/solutions/containers-ci-cd/
7. **Наблюдаемость**: включить метрики GPU/рендера и алерты p95. См.[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/)

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

- Единый контейнер Karma XPU, версии зафиксированы; smoke‑кадр совпадает на 2+ воркерах.
- NVMe‑кэш подключён; warmup прогревает текстуры/шейдеры.
- Чанк‑цель ≤ 120 с; тайлинг настроен; ретраи включены.
- Метрики/алерты p50/p95 заведены; дашборды доступны команде.
- Экономика посчитана (Cost\_per\_frame, Cost\_total) для текущего профиля.
- Политики безопасности и ретенции применены; логи без секретов.
- План миграции интерактива/offline понятен; stitch/denoise вынесены.

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

- Хаб «Рендеринг»: <https://cloudcompute.ru/solutions/rendering/>
- Шаблоны запусков:[ https://cloudcompute.ru/solutions/templates/](https://cloudcompute.ru/solutions/templates/)
- Данные и хранение:[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/)
- Оптимизация производительности:[ https://cloudcompute.ru/solutions/performance-tuning/](https://cloudcompute.ru/solutions/performance-tuning/)
- Multi‑GPU/MIG:[ https://cloudcompute.ru/solutions/multi-gpu/](https://cloudcompute.ru/solutions/multi-gpu/) • <https://cloudcompute.ru/solutions/mig/>
- Мониторинг/логи:[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/)
- Наблюдаемость сервисов:[ https://cloudcompute.ru/solutions/llm-inference/observability/](https://cloudcompute.ru/solutions/llm-inference/observability/)
- Throughput vs Latency: <https://cloudcompute.ru/solutions/throughput-vs-latency/>
- Interruptible‑паттерны: <https://cloudcompute.ru/solutions/interruptible-patterns/>
- Пайплайны ассетов: <https://cloudcompute.ru/solutions/rendering/asset-pipelines/>
- Деноайзинг: <https://cloudcompute.ru/solutions/rendering/de-noising/>
- Транскодирование: <https://cloudcompute.ru/solutions/rendering/video-transcode/>
- Родственные движки: <https://cloudcompute.ru/solutions/rendering/blender/> • <https://cloudcompute.ru/solutions/rendering/redshift/>

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

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