Как ускорить SDXL: простые оптимизации для генерации изображений
Если вы работаете с моделью Stable Diffusion XL (SDXL), то наверняка сталкивались с её высокой вычислительной сложностью. Генерация одного изображения может занимать десятки секунд даже на мощных GPU, что ограничивает применение модели в реальных проектах. К счастью, существуют простые оптимизации,

Если вы работаете с моделью Stable Diffusion XL (SDXL), то наверняка сталкивались с её высокой вычислительной сложностью. Генерация одного изображения может занимать десятки секунд даже на мощных GPU, что ограничивает применение модели в реальных проектах. К счастью, существуют простые оптимизации, которые позволяют значительно ускорить инференс без существенной потери качества. В этой статье мы разберём методы, опубликованные HuggingFace, и покажем, как применить их на практике.
Что произошло
HuggingFace опубликовал в своём блоге руководство по простым оптимизациям для модели Stable Diffusion XL. Предложенные методы позволяют значительно ускорить инференс модели без существенного снижения качества изображений. Руководство включает конкретные примеры кода и результаты тестов, что делает его полезным для разработчиков и исследователей.
Почему это важно
SDXL — одна из самых мощных моделей генерации изображений, но её высокая вычислительная сложность ограничивает применение на обычных GPU. Оптимизации делают SDXL доступнее для широкого круга пользователей и разработчиков, снижая требования к оборудованию. Это особенно актуально для тех, кто хочет запускать модель на GPU с ограниченной памятью, например, на NVIDIA RTX 3060 или 4060.
Основные методы оптимизации
Как использовать torch.compile для ускорения
Одним из самых эффективных методов является компиляция модели с помощью torch.compile. Эта функция, введённая в PyTorch 2.0, преобразует модель в оптимизированный граф вычислений, что позволяет ускорить выполнение на 20–40%. Для SDXL достаточно обернуть UNet и VAE в torch.compile. Важно отметить, что первая генерация после компиляции будет медленнее, так как происходит компиляция, но все последующие вызовы будут значительно быстрее.
Оптимизация attention с помощью sdpkernel
Attention — один из самых затратных компонентов в диффузионных моделях. Использование sdpkernel с выбором эффективной реализации (например, FlashAttention или MemEfficientAttention) может ускорить этот этап на 10–30%. HuggingFace рекомендует явно задавать sdpkernel в pipeline, чтобы избежать автоматического выбора менее эффективной реализации.
Замена сэмплера для ускорения шагов
Стандартный DDIMScheduler часто требует 50 шагов для получения качественного изображения. Замена на LCMScheduler или DPM++ позволяет сократить количество шагов до 4–10 без заметной потери качества. Это даёт ускорение в 5–10 раз на этапе сэмплирования. Однако стоит учитывать, что разные сэмплеры могут давать разные стилистические результаты, поэтому рекомендуется экспериментировать.
Отключение ненужных компонентов
SDXL включает рефайнер (refiner), который улучшает детализацию, но требует дополнительных вычислений. Для простых задач рефайнер можно отключить, что ускорит генерацию на 20–30%. Также можно отключить другие компоненты, такие как текст-инвертер, если они не используются.
Использование torch.inferencemode
Замена torch.nograd на torch.inferencemode даёт небольшой прирост скорости (около 5%), но при этом снижает потребление памяти. inferencemode отключает ненужные операции, такие как отслеживание градиентов, что особенно полезно при пакетной обработке.
Настройка CPU offload для экономии памяти
Для GPU с ограниченной памятью (например, 8 ГБ) включение enablemodelcpuoffload позволяет выгружать части модели на CPU, когда они не используются. Это снижает пиковое потребление памяти, но может немного замедлить генерацию из-за передачи данных. Альтернатива — sequentialcpuoffload, которая выгружает компоненты последовательно, что ещё более эффективно для памяти, но медленнее.
Результаты тестов на NVIDIA A100
В тестах HuggingFace на NVIDIA A100 комбинация этих методов дала ускорение от 30% до 50% при сохранении качества. Например, использование torch.compile и sdpkernel с FlashAttention сократило время генерации с 10 секунд до 6 секунд на одном изображении. Замена сэмплера на LCM позволила получать изображения за 2 секунды при 4 шагах, хотя качество немного снижалось.
Как применить оптимизации к другим моделям
Методы, описанные в руководстве, применимы не только к SDXL, но и к другим диффузионным моделям, таким как Stable Diffusion 2.1 или DreamBooth. Принципы компиляции, оптимизации attention и CPU offload универсальны, поэтому их можно адаптировать под любую модель на базе PyTorch.
Кого затронут эти оптимизации
Разработчиков и исследователей, работающих с генеративными моделями, а также пользователей, желающих запускать SDXL на своём оборудовании. Оптимизации применимы и к другим моделям на базе диффузии. Особенно полезны они будут для тех, кто использует GPU с памятью 8–12 ГБ, где без оптимизаций SDXL может не запуститься вовсе.
Что пока неизвестно
Не указано, насколько эти методы совместимы с другими библиотеками (например, Diffusers) и как они работают на GPU других производителей, кроме NVIDIA. Также остаётся открытым вопрос о влиянии компиляции на время загрузки модели и совместимости с различными версиями PyTorch. Возможно, в будущем появятся более подробные тесты для AMD и Intel.