Blender Cycles на GPU: headless‑фермы и тайлинг

Задача страницы. Дать практическую схему запуска Blender/Cycles в headless‑режиме на ферме облачных GPU: как резать шоты на кадры/регионы (тайлы), как собирать результаты, какие профили GPU выбрать, как считать стоимость и как мониторить прогресс.

TL;DR

  • Headless‑рендер по кадрам/тайлам → максимальный throughput, удобен для Interruptible (чанк ≤ 120 с, ретраи, NVMe‑кэш).
  • Тайлинг (region render) спасает от OOM и помогает параллелить долгие кадры; итоговый кадр собираем в пост‑процессе.
  • Профили GPU: 24 ГБ (Compact) — предпревью/лёгкие сцены; 48 ГБ (Balanced) — основной профиль; 80 ГБ (HQ) — тяжёлые сцены/4K/8K.
  • Хранилище: ассеты в «тёплом», локальный NVMe как «горячий» кэш, прогрев перед запуском. См. https://cloudcompute.ru/solutions/storage-data/
  • Наблюдаемость: render_frame_seconds, gpu_utilization, gpu_memory_used_bytes, tiles_inflight, p50/p95. См. https://cloudcompute.ru/solutions/monitoring-logging/
  • Экономика: Cost_per_frame = (c_gpu * t_frame / 3600) / U * r. См. https://cloudcompute.ru/solutions/cost-planner/
  • Оптимизация: смешанная точность, кэш шейдеров на NVMe, pinned memory/I/O профилировка. См. https://cloudcompute.ru/solutions/performance-tuning/
  • Для интерактива (artist session) лучше см. https://cloudcompute.ru/solutions/rendering/studio-remote/

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

Архитектуры/пайплайны A. Классическая ферма headless‑рендера (кадры/тайлы)

[Git/LFS, DVC] -> [Warm Storage /assets] -> [Prefetch -> NVMe Cache]
 |
 [Job Queue]
 +--------------+--------------+
 | |
 [GPU Worker #1] [GPU Worker #N]
 (Blender headless) (Blender headless)
 | |
 [Tiles/Frames OUT] [Tiles/Frames OUT]
 /
 +-------> [Stitch/Denoise/QA] ----> [Result Sink]
 |
 [Cold Storage Archive]
  • Единый базовый образ Blender + фиксированные версии аддонов/скриптов.
  • NVMe‑кэш для шейдеров/текстур; prefetch ассетов перед стартом.
  • Очередь хранит задания «кадр» или «регион кадра». Ретраи на уровне задач.

Б. Узел с несколькими GPU (multi‑GPU на одном воркере)

[Worker] -- GPU0, GPU1, GPU2 ...
 ├─ Mode 1: один процесс Blender -> использует все GPU
 └─ Mode 2: несколько процессов (по GPU) -> параллельные кадры/тайлы
  • Mode 1 удобен для монолитных кадров; Mode 2 — для параллелизма по кадрам/тайлам.
  • Для шаринга мощной 80 ГБ карты между задачами можно использовать MIG. См. https://cloudcompute.ru/solutions/mig/

Таблица профилей GPU/VRAM/скоростей (ориентиры)

**Профиль** **VRAM** **Типовые сцены** **Режим** **Отн. throughput (≈)** **Примечания**
**24 ГБ (Compact)** 24 ГБ предпревью, 1080p, ограниченные текстуры Interruptible 1.0 Резать по тайлам 256–512 px; внимательно к пикам VRAM
**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‑запуск (Docker) по диапазону кадров

docker run --rm --gpus all 
 -v /projects/scene:/scenes 
 -v /projects/out:/out 
 -v /projects/scripts:/scripts 
 registry.local/blender-gpu:latest 
 blender -b /scenes/shot.blend -E CYCLES 
 --python-expr "import bpy; p=bpy.context.preferences.addons['cycles'].preferences; 
p.compute_device_type='OPTIX' if 'OPTIX' in str(p) else 'CUDA'; p.get_devices(); 
[d.__setattr__('use', True) for d in p.devices]; bpy.context.scene.cycles.device='GPU'" 
 -s 100 -e 160 -a -o /out/frame_#### -F PNG

Что делает:

  • Включает GPU‑рендер (OPTIX, иначе CUDA), активирует все доступные устройства.
  • Рендерит кадры 100..160, пишет frame_0100.png и т. д.

2) Региональный (тайловый) рендер большого кадра

Запуск контейнера:

docker run --rm --gpus all 
 -v /projects/scene:/scenes 
 -v /projects/out:/out 
 registry.local/blender-gpu:latest 
 blender -b /scenes/shot.blend --python /scenes/tile_render.py

Скрипт /scenes/tile_render.py:

import bpy, os
scene = bpy.context.scene
scene.render.engine = 'CYCLES'
scene.cycles.device = 'GPU'
scene.render.image_settings.file_format = 'OPEN_EXR'
# Гарантируем GPU-устройства
p = bpy.context.preferences.addons['cycles'].preferences
p.compute_device_type = 'OPTIX' if 'OPTIX' in str(p) else 'CUDA'
p.get_devices()
for d in p.devices:
 d.use = True
# Тайлы 2x2 — пример; при OOM делайте 3x3/4x4
tiles = [
 (0.0, 0.0, 0.5, 0.5),
 (0.5, 0.0, 1.0, 0.5),
 (0.0, 0.5, 0.5, 1.0),
 (0.5, 0.5, 1.0, 1.0),
]
frame = 150
os.makedirs("/out/tiles", exist_ok=True)
scene.render.use_border = True
scene.render.use_crop_to_border = True # сохраняем только регион
bpy.context.scene.frame_set(frame)
for i, (xmin, ymin, xmax, ymax) in enumerate(tiles, 1):
 scene.render.border_min_x, scene.render.border_min_y = xmin, ymin
 scene.render.border_max_x, scene.render.border_max_y = xmax, ymax
 scene.render.filepath = f"/out/tiles/tile_{i:02d}.exr"
 bpy.ops.render.render(write_still=True)

Сборка плиток выполняется в отдельной задаче (см. «Stitch» ниже). Для консистентного шума/AA фиксируйте сид сцены (scene.cycles.seed).

3) Сборка тайлов в финальный кадр (пример для PNG)

Для EXR предпочтителен сборщик с поддержкой float‑каналов. Ниже — иллюстрация на PNG.

# stitch_png.py — собираем 2x2 тайла в один PNG (замените размеры под свою сцену)
from PIL import Image
W, H = 3840, 2160 # итоговое разрешение
tiles = {
 (0, 0): "tile_01.png",
 (1, 0): "tile_02.png",
 (0, 1): "tile_03.png",
 (1, 1): "tile_04.png",
}
out = Image.new("RGBA", (W, H))
for (tx, ty), path in tiles.items():
 im = Image.open(path).convert("RGBA")
 x0 = tx * (W // 2)
 y0 = ty * (H // 2)
 out.paste(im, (x0, y0))
out.save("frame_0150.png")

4) Очередь заданий (YAML‑спека для оркестрации)

job:
 name: "shot010_headless"
 mode: "interruptible" # on-demand | interruptible
 gpu_profile: "48GB-Balanced" # 24GB-Compact | 48GB-Balanced | 80GB-HQ
 chunk_seconds: 120
 retries: 3
 inputs:
 scene: "/scenes/shot010.blend"
 frames: [100..160] # диапазоны или список
 tiles: # включайте только при крупном кадре
 grid: [2, 2] # 2x2 -> 4 регионa
 cache:
 nvme_size_gb: 200
 prefetch: ["textures/", "shaders/", "cache/irradiance/"]
 outputs:
 dir: "/out/shot010"
 format: "EXR"
 hooks:
 on_start: ["python /scripts/warmup_cache.py"]
 on_tile_done: ["python /scripts/register_tile.py"]
 on_frame_done: ["python /scripts/stitch_and_denoise.py"]
 on_failure: ["python /scripts/requeue.py --backoff"]

5) Запуск на узле с несколькими GPU (Compose)

services:
 blender-gpu-0:
 image: registry.local/blender-gpu:latest
 command: ["bash","-lc","blender -b /scenes/shot.blend -E CYCLES -s 100 -e 120 -a -o /out/gpu0_#### -F PNG"]
 deploy: { resources: { reservations: { devices: [ { capabilities: ["gpu"], device_ids: ["0"] } ] } } }
 volumes:
 - /projects/scene:/scenes
 - /projects/out:/out
 blender-gpu-1:
 image: registry.local/blender-gpu:latest
 command: ["bash","-lc","blender -b /scenes/shot.blend -E CYCLES -s 121 -e 140 -a -o /out/gpu1_#### -F PNG"]
 deploy: { resources: { reservations: { devices: [ { capabilities: ["gpu"], device_ids: ["1"] } ] } } }
 volumes:
 - /projects/scene:/scenes
 - /projects/out:/out
``` **Наблюдаемость/метрики/алерты**

Базовый подход:[ 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="cycles"} — гистограмма по кадрам.
- tile\_render\_seconds{grid="2x2"} — длительность рендера тайла.
- gpu\_utilization, gpu\_memory\_used\_bytes — загрузка и VRAM.
- io\_read\_mb\_s, io\_write\_mb\_s — давление на I/O.
- job\_queue\_depth, tiles\_inflight — состояние очереди.

**Алерты:**

- p95 render\_frame\_seconds растёт > X% к базе N минут.
- gpu\_utilization < 60% при глубокой очереди → I/O‑бутылочное горлышко.
- VRAM близко к лимиту → усилить тайлинг/снизить разрешение/перейти на больший профиль.
- tiles\_inflight не растёт при увеличении очереди → проблема со скедулингом.

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

См.[ 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, r — коэффициент ретраев (interruptible).
- **Тайл:
 t\_frame ≈ max(T\_tile\_i) при параллельном рендере всех тайлов, плюс t\_stitch.
 При ограниченном числе воркеров — учитываем расписание тайлов по слотам.
- **Пакет N кадров:
 Cost\_total = N \* Cost\_per\_frame + Overhead\_io + Cost\_denoise/transcode
- **Когда выгоден interruptible:
 Если Discount\_gain &gt; (r - 1) и чанк укладывается в ≤ 120 с.

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

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

- **Лицензии/серийники/аддоны** — только через секреты; не в bake образов.
- **Приватные ассеты** — доступ по временным токенам; артефакты → холодное хранилище.
- **Изоляция проектов** — сегментация сетей/тегов, ограниченный egress.
- **Логи** — без чувствительных путей/имён, ретеншн по политике

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

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

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

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

</td></tr><tr><td>OOM по VRAM

</td><td>Сцена/текстуры слишком велики для профиля

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

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

</td><td>Разный шум/AA на границах

</td><td>Фиксировать seed; глобальный денойз после stitch

</td></tr><tr><td>Низкий GPU util при длинных кадрах

</td><td>I/O‑узкое место или денойзер на CPU

</td><td>NVMe‑кэш, префетч, вынести денойз в GPU‑батч

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

</td><td>Версии Blender/аддонов различаются

</td><td>Единый контейнер‑образ, smoke‑тесты

</td></tr><tr><td>Частые прерывания ломают кадры

</td><td>Чанк &gt; 120 с, без ретраев

</td><td>Тайлинг; включить ретраи; критичные кадры — On‑Demand

</td></tr><tr><td>Долгая компиляция шейдеров

</td><td>Нет «горячего» кэша

</td><td>Сохранять кэш на NVMe, прогрев при старте

</td></tr><tr><td>Статтеры в «стиче» видео

</td><td>Узкий сетевой канал/дисковая запись

</td><td>Отдельная очередь для stitch/transcode, лимиты I/O

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

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

1. **Выберите шаблон**:[ https://cloudcompute.ru/solutions/templates/](https://cloudcompute.ru/solutions/templates/)
 - «Blender headless (batch)» — для оффлайн‑фермы.
 - Для интерактива см. <https://cloudcompute.ru/solutions/rendering/studio-remote/>
2. **Профиль GPU**: 24/48/80 ГБ по таблице sizing выше.
3. **Режим**: оффлайн — **Interruptible** (чанк ≤ 120 с); критичные/длинные кадры — **On‑Demand**.
4. **Хранилище**: подключить «тёплое» хранилище ассетов и NVMe‑кэш. См.[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/)
5. **Оркестрация**: описать задания YAML‑спекой очереди; включить ретраи/префетч.
6. **CI/CD контейнеров**: закрепить версии Blender/аддонов. См. <https://cloudcompute.ru/solutions/containers-ci-cd/>
7. **Наблюдаемость**: включить GPU/рендер‑метрики и алерты p95. См.[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/)

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

- Единый контейнер‑образ, smoke‑рендер прошёл на нескольких воркерах.
- NVMe‑кэш прогревается; ассеты префетчатся локально.
- Чанк укладывается в ≤ 120 с; ретраи включены.
- Тайлинг протестирован: швов нет, seed фиксирован, stitch корректен.
- Метрики/алерты заведены; p50/p95 контролируются.
- Экономика посчитана: Cost\_per\_frame и Cost\_total соответствуют бюджету.
- Политики безопасности и ретенции применены.

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

- Хаб «Рендеринг»: <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/)
- Throughput vs Latency: <https://cloudcompute.ru/solutions/throughput-vs-latency/>
- Interruptible‑паттерны: <https://cloudcompute.ru/solutions/interruptible-patterns/>
- Multi‑GPU/MIG:[ https://cloudcompute.ru/solutions/multi-gpu/](https://cloudcompute.ru/solutions/multi-gpu/) • <https://cloudcompute.ru/solutions/mig/>
- Деноайзинг: <https://cloudcompute.ru/solutions/rendering/de-noising/>
- Транскодирование видео: <https://cloudcompute.ru/solutions/rendering/video-transcode/>
- Удалённые GPU‑станции: <https://cloudcompute.ru/solutions/rendering/studio-remote/>
- Пайплайны ассетов: <https://cloudcompute.ru/solutions/rendering/asset-pipelines/>

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

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