SDXL в 4 шага с латентной последовательностью LoRAs

Красота в 4 шага с таинственной последовательностью LoRAs

Модели с латентной согласованностью (LCM) – это способ сокращения числа шагов для генерации изображения с помощью Stable Diffusion (или SDXL) путем дистилляции исходной модели в другую версию, требующую меньшего числа шагов (4-8 вместо исходных 25-50). Дистилляция – это тип процедуры обучения, который пытается воспроизвести результаты исходной модели с помощью новой модели. Дистиллированная модель может быть спроектирована для бóльшей компактности (такое, например, к вариантам DistilBERT или только что выпущенной Distil-Whisper), или, в данном случае, требовать меньшего числа шагов для выполнения. Это обычно долгий и дорогостоящий процесс, требующий больших объемов данных, терпения и нескольких графических процессоров.

Что ж, это был статус-кво до сегодняшнего дня!

Мы радостно объявляем о новом методе, который позволяет существенно ускорить Stable Diffusion и SDXL, словно они были дистиллированы с помощью процесса LCM! Как вам звучит возможность запускать любую модель SDXL примерно за 1 секунду вместо 7 на 3090 или в 10 раз быстрее на Mac? Читайте далее для подробностей!

Содержание

Обзор метода

Итак, в чем суть? Для дистилляции с латентной согласованностью каждую модель нужно дистиллировать отдельно. Ключевая идея с использованием LCM LoRA заключается в тренировке только небольшого числа адаптеров, известных как слои LoRA, вместо полной модели. Полученные LoRA затем могут быть применены к любой прокаленной версии модели без необходимости их отдельной дистилляции. Если вам интересно увидеть, как это выглядит на практике, просто перейдите к следующему разделу и поиграйте с кодом вывода. Если вы хотите обучить собственные LoRA, вот процесс, который вы будете использовать:

  1. Выберите доступную модель учителя из Хаба. Например, вы можете использовать SDXL (базовую) или любую предварительно обученную или усиленную версию, которая вам нравится.
  2. Обучите LCM LoRA на модели. LoRA – это тип эффективной по производительности уточнения, или PEFT, который гораздо дешевле, чем полное уточнение модели. Дополнительные детали о PEFT можно найти в этом посте в блоге или в документации по диффузорам LoRA.
  3. Используйте LoRA с любой моделью диффузии SDXL и планировщиком LCM; бинго! Вы получите высокое качество вывода всего за несколько шагов.

Для получения более подробной информации о процессе скачайте нашу статью.

Почему это важно?

Быстрый вывод Stable Diffusion и SDXL открывает новые возможности использования и рабочие процессы. Несколько примеров:

  • Доступность: генеративные инструменты могут использоваться более эффективно большим количеством людей, даже если у них нет доступа к самому современному оборудованию.
  • Быстрые итерации: получайте больше изображений и несколько вариантов за краткое время! Это отлично подходит для художников и исследователей, независимо от личного или коммерческого использования.
  • Возможность выполнять производственные нагрузки на разных ускорителях, включая ЦП.
  • Более доступные услуги по генерации изображений.

Чтобы понять, о какой разнице в скорости мы говорим, генерация одного изображения размером 1024×1024 на Маке M1 с использованием SDXL (базовой модели) занимает примерно минуту. С использованием LCM LoRA мы получаем отличные результаты всего за ~6 секунд (4 шага). Это в разы быстрее, и не нужно ждать результатов — это изменяет правила игры. Если используется 4090, ответ получается почти мгновенным (менее 1 секунды). Это открывает возможность использования SDXL в приложениях, где требуется реальное время.

Быстрый вывод с использованием SDXL LCM LoRA

Версия diffusers, выпущенная сегодня, значительно упрощает использование LCM LoRA:

from diffusers import DiffusionPipeline, LCMSchedulerimport torchmodel_id = "stabilityai/stable-diffusion-xl-base-1.0"lcm_lora_id = "latent-consistency/lcm-lora-sdxl"pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")pipe.load_lora_weights(lcm_lora_id)pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)pipe.to(device="cuda", dtype=torch.float16)prompt = "снимок близко стоящего старика под дождем ночью на улице, освещенной фонарями, Leica 35mm Summilux"images = pipe(    prompt=prompt,    num_inference_steps=4,    guidance_scale=1,).images[0]

Обратите внимание, как в коде:

  • Создаётся стандартная цепочка диффузии  с базовой моделью SDXL 1.0.
  • Применяется LCM LoRA.
  • Меняется планировщик на LCMScheduler, который используется в моделях сохранения латентности.
  • Вот и всё!

Это приведет к созданию следующего изображения полного разрешения:

SDXL в 4 шага с использованием LCM LoRAИзображение, сгенерированное с помощью SDXL за 4 шага с использованием LCM LoRA.

Сравнение качества

Давайте посмотрим, как количество шагов влияет на качество генерации. Следующий код будет генерировать изображения с 1 по 8 шаги общего вывода:

images = []для шаги в диапазоне(8):    генератор = torch.Generator(device=pipe.device).manual_seed(1337)    image = pipe(        prompt=prompt,        num_inference_steps=steps+1,        guidance_scale=1,        generator=генератор,    ).images[0]    images.append(image)

Вот 8 изображений, отображаемых в виде сетки:

LCM LoRA generations with 1 to 8 stepsПоколения LCM LoRA с 1 по 8 шагов.

Как и ожидалось, использование всего лишь 1 шага дает примерную форму без различимых особенностей и без текстуры. Однако результаты быстро улучшаются, и обычно они очень удовлетворительны уже после 4-6 шагов. Лично я считаю, что изображение с 8 шагами в предыдущем тесте слишком насыщено и “мультяшно” для моего вкуса, поэтому, вероятно, я бы выбрал изображения с 5 и 6 шагами в этом примере. Генерация настолько быстрая, что вы можете создать множество разных вариантов, используя всего 4 шага, а затем выбрать те, которые вам нравятся, и итерировать, используя еще несколько шагов и уточненные подсказки при необходимости.

Шкала направления и отрицательные подсказки

Обратите внимание, что в предыдущих примерах мы использовали guidance_scale равную 1, что фактически отключает его. Это хорошо подходит для большинства подсказок и наиболее быстрое, но игнорирует отрицательные подсказки. Вы также можете попробовать использовать отрицательные подсказки, указав масштаб направления от 1 до 2 – мы обнаружили, что большие значения не работают.

Качество по сравнению с базовым SDXL

Каково сравнение со стандартным конвейером SDXL в терминах качества? Давайте рассмотрим пример!

Мы можем быстро вернуть наш конвейер к стандартному конвейеру SDXL, выгрузив веса LoRA и переключившись на конфигурацию по умолчанию:

из diffusers import EulerDiscreteSchedulerpipe.unload_lora_weights ()pipe.scheduler = EulerDiscreteScheduler.from_config (pipe.scheduler.config)

Затем мы можем запустить вывод, как обычно для SDXL. Мы соберем результаты, используя разное количество шагов:

images = []для шаги в (1, 4, 8, 15, 20, 25, 30, 50):    генератор = torch.Generator(device=pipe.device).manual_seed(1337)    image = pipe(        prompt=prompt,        num_inference_steps=steps,        generator=генератор,    ).images[0]    images.append(image)

SDXL results for various inference stepsРезультаты конвейера SDXL (тот же подсказ и случайное зерно), используя 1, 4, 8, 15, 20, 25, 30 и 50 шагов.

Как вы можете видеть, изображения в этом примере почти бесполезны до ~20 шагов (вторая строка), и качество все еще заметно увеличивается с увеличением числа шагов. Детали в конечном изображении потрясающие, но для их получения потребовалось 50 шагов.

LCM LoRA с другими моделями

Эта техника также работает с любой другой настроенной моделью SDXL или Stable Diffusion. Давайте посмотрим, как запустить вывод для collage-diffusion, модели, выполненной на основе Stable Diffusion v1.5 с использованием Dreambooth.

Код похож на тот, что мы видели в предыдущих примерах. Мы загружаем настроенную модель, а затем подходящую для Stable Diffusion v1.5 LCM LoRA.

из diffusers import DiffusionPipeline, LCMSchedulerimport torchmodel_id = "wavymulder/collage-diffusion"lcm_lora_id = "latent-consistency/lcm-lora-sdv1-5"pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)pipe.load_lora_weights(lcm_lora_id)pipe.to(device="cuda", dtype=torch.float16)prompt = "collage style kid sits looking at the night sky, full of stars"generator = torch.Generator(device=pipe.device).manual_seed(1337)images = pipe(    prompt=prompt,    generator=generator,    negative_prompt=negative_prompt,    num_inference_steps=4,    guidance_scale=1,).images[0]images

Техника LCM LoRA с моделью Dreambooth Stable Diffusion v1.5, позволяющая 4-х шаговое выводное направление.Техника LCM LoRA с моделью Dreambooth Stable Diffusion v1.5, позволяющая 4-х шаговое выводное направление.

Полная интеграция рассеивателей

Интеграция LCM в diffusers позволяет использовать множество функций и рабочих процессов, входящих в состав набора инструментов рассеивателей. Например:

  • Из коробки поддержка mps для Mac с процессорами Apple Silicon.
  • Оптимизация памяти и производительности, такие как вспышечное внимание или torch.compile().
  • Дополнительные стратегии экономии памяти для сред с низким объемом ОЗУ, включая загрузку моделей.
  • Процессы, такие как ControlNet или преобразование изображений.
  • Скрипты тренировки и тонкой настройки.

Тестирование производительности

Этот раздел не претендует на исчерпывающую информацию, но иллюстрирует скорость генерации изображений на различных компьютерах. Отметим еще раз, насколько легко исследовать генерацию изображений с помощью этих технологий.

Во всех случаях эти тесты выполнялись с размером пакета 1 с использованием этого скрипта от Sayak Paul.

Для карт с большой емкостью, таких как A100, производительность значительно увеличивается при генерации нескольких изображений одновременно, что обычно характерно для рабочих нагрузок в производстве.

Недавно выпущенные LCM LoRA и модели

Бонус: Комбинируйте LCM LoRAs с обычными SDXL LoRAs

Используя диффузоры + интеграцию PEFT, вы можете комбинировать LCM LoRAs с обычными SDXL LoRAs, давая им способность выполнять LCM-инференцию всего за 4 шага.

Здесь мы собираемся объединить LoRA CiroN2022/toy_face с LCM LoRA:

from diffusers import DiffusionPipeline, LCMSchedulerimport torchmodel_id = "stabilityai/stable-diffusion-xl-base-1.0"lcm_lora_id = "latent-consistency/lcm-lora-sdxl"pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)pipe.load_lora_weights(lcm_lora_id)pipe.load_lora_weights("CiroN2022/toy-face", weight_name="toy_face_sdxl.safetensors", adapter_name="toy")pipe.set_adapters(["lora", "toy"], adapter_weights=[1.0, 0.8])pipe.to(device="cuda", dtype=torch.float16)prompt = "мужчина с игрушечным лицом"negative_prompt = "размытое, низкое качество, отрисовка, 3D, пересыщенность"images = pipe(    prompt=prompt,    negative_prompt=negative_prompt,    num_inference_steps=4,    guidance_scale=0.5,).images[0]images

Комбинирование LoRAs для быстрой инференцииОбъединение стандартных и LCM LoRAs для быстрой (4-шаговой) инференции.

Нужны идеи для изучения LoRAs? Посетите наш экспериментальный LoRA the Explorer (версия LCM) Space, чтобы протестировать удивительные творения сообщества и получить вдохновение!

Как обучать модели и LoRAs LCM

В рамках сегодняшнего релиза diffusers мы предоставляем скрипты для обучения и настройки, разработанные в сотрудничестве с авторами команды LCM. Они позволяют пользователям:

  • Производить полную дистилляцию моделей Stable Diffusion или SDXL на больших наборах данных, таких как Laion.
  • Обучать LCM LoRAs, что является гораздо более простым процессом. Как мы показали в этом посте, это также позволяет выполнять быструю инференцию с использованием Stable Diffusion, не прибегая к обучению дистилляции.

Дополнительные сведения можно найти в инструкциях для SDXL или Stable Diffusion в репозитории.

Мы надеемся, что эти скрипты вдохновят сообщество на попытки собственной настройки. Пожалуйста, дайте нам знать, если вы используете их для своих проектов!

Ресурсы

Кредиты

Удивительная работа по моделям скрытой последовательности выполняется командой LCM, пожалуйста, обязательно ознакомьтесь с их кодом, отчетом и статьей. Этот проект является совместной работой команды диффузоров, команды LCM и вкладчика из сообщества Даниэля Гу. Мы считаем, что это свидетельство о возможностях открытого искусственного интеллекта, основы, которая позволяет исследователям, практикам и творцам исследовать новые идеи и сотрудничать. Мы также хотели бы поблагодарить @madebyollin за их постоянный вклад в сообщество, включая автоэнкодер float16, который мы используем в наших скриптах обучения.