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/
Сценарии: когда это нужно
- Кинопост/реклама/анимация: длинные шоты → резка по кадрам и тайлам, агрегация в один EXR/PNG.
- Большие сцены, риск OOM: рендер регионов (border) вместо целого кадра.
- Деноайз и транскод: вынести в отдельные батчи. См. https://cloudcompute.ru/solutions/rendering/de-noising/, https://cloudcompute.ru/solutions/rendering/video-transcode/
- Гибриды: превью/роутмапы в интерактиве, финал — в headless‑очередь. См. https://cloudcompute.ru/solutions/rendering/
Архитектуры/пайплайны 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 > (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>Чанк > 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-сервер