Объём данных между узлами ComfyUI: хранение в RAM и VRAM
При работе с ComfyUI, особенно с моделями вроде Flux.1, пользователи часто задаются вопросом: какой объём данных передаётся между узлами (нодами) и где эти данные временно хранятся? Понимание этого процесса помогает оптимизировать производительность, избежать нехватки памяти и правильно настроить рабочий процесс (workflow).
Рассмотрим типичный workflow для Flux.1 на видеокарте с 6 ГБ VRAM. Он включает: загрузку текстовых энкодеров (1) - t5-v1_1-xxl-encoder-Q3_K_L.gguf и clip_l.safetensors, два узла ClipText Encode (2,3), загрузчик VAE (7) - ae.safetensors, декодировщик VAE (8), загрузчик модели (4) - flux1-schnell-Q2_K.gguf, генератор пустого пространства (5), KSampler (6) и узлы сохранения (9) с превью (10). Все они соединены связями, и ComfyUI подсвечивает активный узел зелёной рамкой.
Какой объём данных передаётся между узлами?
Объём данных зависит от типа узла и размера промежуточных тензоров. Например, когда KSampler завершает работу, он передаёт в декодировщик VAE латентное представление (latent) размером, как правило, 4 канала × 64 × 64 или 4 × 128 × 128 (для изображений 1024×1024). Это составляет от 2 до 8 МБ в зависимости от разрешения. Когда узел CLIP Text Encode Prompt завершает обработку, он передаёт в KSampler эмбеддинги текста - это тензор размером примерно 77 × 4096 (для T5) или 77 × 768 (для CLIP), что даёт около 1-2 МБ.
Данные между узлами - это не сырые изображения, а сжатые тензоры (латентные представления или эмбеддинги). Поэтому объём относительно невелик по сравнению с финальным изображением (которое может занимать 10-50 МБ в несжатом виде).
Где хранятся данные при передаче: RAM или VRAM?
По умолчанию все промежуточные данные в ComfyUI хранятся в видеопамяти (VRAM). Это касается и тензоров, передаваемых между узлами. Однако если VRAM заканчивается, ComfyUI может начать сбрасывать данные в оперативную память (RAM), что резко замедляет работу из-за медленной шины PCIe. В редких случаях, при включённом режиме --cpu, все вычисления идут через RAM.
В процессе передачи данные остаются в VRAM: узел-источник держит тензор в своей памяти, а узел-приёмник создаёт ссылку на него. Только после завершения работы узла-приёмника память освобождается. Исключение - узлы, работающие на CPU (например, загрузка текстовых энкодеров в формате GGUF), которые могут временно держать данные в RAM.
Как отследить объём и место хранения данных?
В ComfyUI нет встроенного лога передачи данных между узлами, но можно использовать сторонние инструменты:
- NVIDIA-SMI или Task Manager (Windows) - показывают текущее использование VRAM и RAM. Запустите workflow и наблюдайте за пиками.
- Плагин ComfyUI-Manager - добавляет вкладку
System Info, где отображается занятая VRAM и RAM. - Дополнительные ноды - например,
Debug Node(из пакетаComfyUI-Custom-Scripts) выводит размер тензора на выходе любого узла в консоль или в лог. - Логирование через Python - если вы запускаете ComfyUI из командной строки, добавьте флаг
--verboseили--debug, чтобы видеть размеры передаваемых тензоров в stdout.
Практические рекомендации для видеокарт с 6 ГБ VRAM
Чтобы избежать выгрузки данных в RAM, следуйте этим советам:
- Используйте квантованные модели (GGUF, Q2_K, Q3_K) - они занимают меньше VRAM.
- Уменьшите размер батча (batch size) до 1.
- Отключите превью в реальном времени (узел Preview) - он копирует данные в RAM для отображения.
- Используйте
--lowvramили--novramфлаги при запуске, но учтите, что это замедлит скорость.
В итоге, объём данных между узлами ComfyUI составляет от 1 до 10 МБ, и они почти всегда хранятся в VRAM. Отслеживать это можно через мониторинг памяти и специальные ноды-отладчики.