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)
- Финальные кадры/аниматика; стейджи USD из Solaris/LOPs, рендер headless.
- Разбиение по кадрам и/или регионам (тайлам) для укладывания в чанк ≤ 120 с и стабильной работы Interruptible.
- Denoise/транскод — отдельные батчи; см. https://cloudcompute.ru/solutions/rendering/de-noising/ и https://cloudcompute.ru/solutions/rendering/video-transcode/
Интерактив (художники/техарты)
- Работа с 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 > (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 > 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-сервер