В прошлом месяце Stability AI выпустила Stable Diffusion XL 1.0 (SDXL) и открыла её исходный код, не требуя каких-либо специальных разрешений для доступа к ней.

Релиз прошёл в основном незамеченным, потому что шумиха вокруг генеративного искусственного интеллекта немного поутихла. Все в области искусственного интеллекта слишком заняты генерирующим текст ИИ, таким как ChatGPT. Примечательно, что SDXL одна из первых моделей с открытым исходным кодом, которая может изначально генерировать изображения с разрешением 1024x1024 без махинаций, что позволяет отображать гораздо больше деталей. На самом деле SDXL состоит из двух моделей: базовой модели и дополнительной модели уточнения, которая значительно улучшает детализацию, и, поскольку уточнение не приводит к снижению скорости генерации изображений, я настоятельно рекомендую использовать её, если это возможно.

Сравнение относительного качества моделей SD. Обратите внимание на значительное увеличение при использовании рафинёра. Ссылка
Сравнение относительного качества моделей SD. Обратите внимание на значительное увеличение при использовании рафинёра. Ссылка

Отсутствие ажиотажа, вокруг SDXL не означает, что он скучен. Теперь, когда модель имеет полную поддержку в библиотеке Python diffusers от Hugging Face с соответствующими оптимизациями производительности, мы можем использовать её, поскольку демонстрации SDXL в diffusers просты и легко настраиваются:

import torch
from diffusers import DiffusionPipeline, AutoencoderKL

# загрузка SDXL and рафинёра
vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix",
                                    torch_dtype=torch.float16)
base = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    vae=vae,
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
_ = base.to("cuda")

refiner = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0",
    text_encoder_2=base.text_encoder_2,
    vae=base.vae,
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
_ = refiner.to("cuda")

# генерация с использованием обеих моделей 
high_noise_frac = 0.8
prompt = "an astronaut riding a horse"
negative_prompt = "blurry, bad hands"

image = base(
    prompt=prompt,
    negative_prompt=negative_prompt,
    denoising_end=high_noise_frac,
    output_type="latent",
).images

image = refiner(
    prompt=prompt,
    negative_prompt=negative_prompt,
    denoising_start=high_noise_frac,
    image=image,
).images[0]

Я загрузил облачную виртуальную машину с новым графическим процессором среднего уровня L4 GPU (всего 0,24 доллара за час с Spot instance на Google Cloud Platform) и приступил к работе. С L4 GPU генерация каждого изображения 1024x1024 пикселей занимает около 22 секунд, но вы можете генерировать только одно изображение за раз на GPU среднего уровня, в отличие от предыдущих моделей Stable Diffusion, поскольку они использовали 100% мощности GPU, поэтому необходимо немного больше терпения. Вы можете генерировать картинки с меньшим разрешением быстрее, но это настоятельно не рекомендуется, потому что результаты будут намного хуже.

diffusers также реализовали поддержку двух новых функций, с которыми я не экспериментировал в своих предыдущих статьях о Stable Diffusion: взешивание промптов и обучение и инференс Dreambooth LoRA. Поддержка взвешивания промптов с помощью diffusers принудительно использует библиотеку compel в Python для более математического взвешивания промптов. Вы можете добавить любое количество + или - к заданному слову, чтобы увеличить или уменьшить его «важность» в результирующих позиционных эмбеддингах текста и, следовательно, в окончательной генерации. Вы также можете обернуть фразы: например, если вы генерируете пейзаж Сан-Франциско Сальвадора Дали, маслом на холсте, а вместо этого получаете фотореалистичный Сан-Франциско, вы можете обернуть художественную часть промпта, такую ​​​​как - пейзаж Сан-Франциско Сальвадора Дали (маслом на холсте)+++, чтобы Stable Diffusion вёл себя так, как и ожидалось. В моём тестировании, обёртки устраняют большую часть сложностей с промптами, появившиеся в Stable Diffusion 2.0 и выше, особенно с повышенными значениями точности соответствия изображения с запросом (classifier-free guidance) (по умолчанию Guidance_scale равен 7,5; я предпочитаю использовать 13).

Во всех сгенерированных примерах моделью LoRA в этой статье используется guide_scale, равный 13.

LoRA the Explorer

Но что наиболее важно, так это поддержка Dreambooth LoRA, которая делает возможным создание моделей Stable Diffusion "на заказ". Dreambooth — это метод тонкой настройки Stable Diffusion на очень небольшом наборе исходных изображений и ключевом слове-триггере, позволяющем использовать «концепцию» из этих изображений в других контекстах с заданным ключевым словом.

Пример работы Dreambooth; Источник
Пример работы Dreambooth; Источник

Обучение Stable Diffusion, даже небольших версий модели, требует много дорогих GPU для обучения часами. Вот тут-то и появляются LoRA: вместо этого обучается небольшой адаптер для визуальной модели, что можно сделать на одном дешёвом GPU за 10 минут, а качество итоговой модели + LoRA сравнимо с полной тонкой настройкой (в просторечии, когда люди ссылаются на тонкую настройку Stable Diffusion, обычно это означает создание LoRA). Обученная LoRA представляет собой небольшой дискретный двоичный файл, что позволяет легко делиться им с другими или в репозиториях, таких как Civitai. Небольшой недостаток LoRA заключается в том, что вы можете иметь только один стиль в одном LoRA адаптере: можно объединить несколько LoRA, чтобы получить преимущества от всех, но это деликатная наука.

До того, как Stable Diffusion LoR'ы получили широкое распространение, существовала текстовая инверсия, которая позволяет кодировщику текста извлекать концепцию, но обучение занимает несколько часов, а результаты могут быть неуклюжими. В предыдущей публикации я тренировал текстовую инверсию на шуточном датасете - Уродливом Сонике, так как его не было в исходном наборе данных Stable Diffusion и, следовательно, он был бы уникальным. Результаты итоговой модели были неоднозначными.

Уродливый Соник, но недостаточно уродливый.
Уродливый Соник, но недостаточно уродливый.

Я подумал, что тренировка LoRA на датасете Ugly Sonic станет хорошей проверкой потенциала SDXL. К счастью, Hugging Face предоставляет скрипт train_dreambooth_lora_sdxl.py для обучения LoRA с использованием базовой модели SDXL, которая работает «из коробки», хотя я немного подправил параметры. Сгенерированные образы "Уродливого Соника" из обученной LoRA, мягко говоря, намного лучше и связнее по нескольким промптам.

Некрасивый Соник, но с зубами.
Некрасивый Соник, но с зубами.

НЕВЕРНО!

Достигнув такого успеха, я решил повторить ещё один эксперимент по текстовой инверсии, обучив LoRA на сильно искажённых, мусорных изображениях, промпты которых задавались как неправильные, в надежде, что LoRA сможет использовать негативное условие и избегать создания таких изображений, чтобы генерировать более качественные изображения. Я написал блокнот Jupyter для создания синтетических "неправильных" изображений, используя сам SDXL, на этот раз с использованием различных весовых коэффициентов промпта, чтобы получить более отчетливые примеры типов плохих изображений, таких как размытые и плохие руки. Иронично, что нам нужно использовать SDXL для создания изображений низкого качества с высоким разрешением.

Примеры синтетических "неправильных" изображений, которые непреднамеренно напоминают обложки альбомов панк-рока 2000-х годов.
Примеры синтетических "неправильных" изображений, которые непреднамеренно напоминают обложки альбомов панк-рока 2000-х годов.
Другие примеры синтетических неправильных изображений, которые фокусируются на аспекте зловещей долины современных изображений, сгенерированных ИИ, в которой они выглядят нормальными с первого взгляда, но при ближайшем рассмотрении обнаруживается нарастающий ужас. Вот почему важно генерировать примеры с полным разрешением (1024x1024).
Другие примеры синтетических неправильных изображений, которые фокусируются на аспекте зловещей долины современных изображений, сгенерированных ИИ, в которой они выглядят нормальными с первого взгляда, но при ближайшем рассмотрении обнаруживается нарастающий ужас. Вот почему важно генерировать примеры с полным разрешением (1024x1024).

Я обучил и загрузил LoRA в базовую модель Stable Diffusion XL (рафинировщику не нужна LoRA) и написал блокнот Jupyter, чтобы сравнить результаты с заданным промптом из:

  • Базовая модель + Рафинёр без LoRA (бейзлайн)

  • Пайплайн без LoRA, использующий слово неправильно в качестве отрицательного промпта (чтобы убедиться, что нет эффекта плацебо)

  • Пайплайн с LoRA, использующий слово неправильнов качестве негативного промпта (наш целевой результат)

Каждая генерация имеет одно и то же начальное число (seed), поэтому композиция фотографий должна быть одинаковой для всех трёх поколений, а влияние как неправильного отрицательного промпта, так и LoRA по сравнению с базовой версией должно быть очень очевидным.

Начнем с простого промпта из демонстраций SDXL 0.9:

A wolf in Yosemite National Park, chilly nature documentary film photography - Волк в национальном парке Йосемити, холодная документальная киносъемка природы
A wolf in Yosemite National Park, chilly nature documentary film photography - Волк в национальном парке Йосемити, холодная документальная киносъемка природы

Неправильный промпт на базовой модели добавляет некоторую листву и глубину изображению леса, но LoRA добавляет гораздо больше: более чёткое освещение и тени, более детализированную листву и изменяет перспективу волка, чтобы он смотрел в камеру, что интереснее.

Мы можем получить другую перспективу волка с похожей композицией фотографии, добавив к промпту «extreme closeup - крайний крупный план» и повторно используя один и тот же сид.

An extreme close-up of a wolf in Yosemite National Park, chilly nature documentary film photography - Экстремальный крупный план волка в национальном парке Йосемити, холодная документальная киносъемка природы
An extreme close-up of a wolf in Yosemite National Park, chilly nature documentary film photography - Экстремальный крупный план волка в национальном парке Йосемити, холодная документальная киносъемка природы

В этой генерации LoRA сделала гораздо лучшую текстуру, яркость и резкость, чем другие. Но примечательно, что простое добавление неправильной подсказки меняет перспективу.

Еще один хороший тестовый пример — фотография еды, особенно странная фотография еды, на подобии этих. Может ли SDXL + неправильный LoRA обрабатывать неевклидовы гамбургеры с некоторым взвешиванием промптов, чтобы убедиться, что они странные?

a large delicious hamburger (in the shape of five-dimensional alien geometry)++++, professional food photography - большой вкусный гамбургер (в форме пятимерной инопланетной геометрии)++++, профессиональная фуд-фотография
a large delicious hamburger (in the shape of five-dimensional alien geometry)++++, professional food photography - большой вкусный гамбургер (в форме пятимерной инопланетной геометрии)++++, профессиональная фуд-фотография

Ответ заключается в том, что он не может, даже после нескольких быстрых попыток разработки промпта. Тем не менее, этот результат все еще интересен: базовый SDXL, похоже, воспринял «инопланетную» часть промпта более буквально, чем ожидалось (и придал ей симпатичную шляпу в виде булочки!), но LoRA лучше понимает дух промпта, создавая «инопланетный» бургер, который людям было бы трудно съесть, плюс более блестящая эстетика подачи.

Заметным улучшением в Stable Diffusion 2.0 стала читаемость текста. Могут ли SDXL и неправильный LoRA сделать текст еще более читаемым, например, газетные обложки с большим количеством текста?

lossless PDF scan of the front page of the January  2038 issue of the Wall Street Journal featuring a cover story about  (evil robot world domination)++ - Сканирование в формате PDF без потерь первой страницы январского номера Wall Street Journal за 2038 год с заглавной статьей о (мировом господстве злых роботов) ++
lossless PDF scan of the front page of the January 2038 issue of the Wall Street Journal featuring a cover story about (evil robot world domination)++ - Сканирование в формате PDF без потерь первой страницы январского номера Wall Street Journal за 2038 год с заглавной статьей о (мировом господстве злых роботов) ++

Разборчивость текста определенно улучшилась по сравнению с Stable Diffusion 2.0, но, похоже, она одинакова во всех случаях. Что примечательно в LoRA, улучшила набор текста на обложках: макет страницы стал более «современным» с различными макетами статей, а заголовки имеют правильный относительный размер шрифта. Между тем, базовая модель даже с неправильным промптом имеет скучный макет и почему-то на состарившейся желтоватой бумаге.

А как насчет людей? Решает ли неправильный LoRA печально известную проблему ИИ с руками, тем более что мы включили много таких примеров в обучающие данные LoRA? Давайте изменим президентский промпт Тейлор Свифт из моей первой попытки со Stable Diffusion 2.0:

USA President Taylor Swift (signing papers)++++, photo taken by the Associated Press - Президент США Тейлор Свифт (подписание документов)++++, фото Associated Press
USA President Taylor Swift (signing papers)++++, photo taken by the Associated Press - Президент США Тейлор Свифт (подписание документов)++++, фото Associated Press

Посмотрите на правую руку Тейлор: в SDXL по умолчанию она крайне нереалистична и на самом деле ухудшается при добавлении неправильного промпта, но LoRA это исправила! Цветокоррекция с помощью LoRA намного лучше: рубашка более отчетливо белая, а не желтовато-белая. Однако не смотрите внимательно на ее руки ни в одной из генерации: создавать людей с помощью SDXL 1.0 по-прежнему сложно и ненадежно!

Теперь ясно, что неправильно + LoRA интереснее в каждой генерации, чем просто неправильный отрицательный промпт, поэтому дальше мы просто сравним базовый результат с результатом LoR'ы. Вот еще несколько примеров сравнения базовой модели с неправильной LoRA:

realistic human Shrek blogging at a computer workstation, hyperrealistic award-winning photo for vanity fair - Руки лучше, освещение лучше. Одежда более детализирована, а фон интереснее.
realistic human Shrek blogging at a computer workstation, hyperrealistic award-winning photo for vanity fair - Руки лучше, освещение лучше. Одежда более детализирована, а фон интереснее.
pepperoni pizza in the shape of a heart, hyperrealistic award-winning professional food photography - Пепперони более детализирована и имеет пузыри, меньше пепперони по краям, корочка более хрустящая (?)
pepperoni pizza in the shape of a heart, hyperrealistic award-winning professional food photography - Пепперони более детализирована и имеет пузыри, меньше пепперони по краям, корочка более хрустящая (?)
presidential painting of realistic human Spongebob Squarepants wearing a suit, (oil on canvas)+++++ -У Губки Боба снова появился нос, а на его костюме стало больше пуговиц
presidential painting of realistic human Spongebob Squarepants wearing a suit, (oil on canvas)+++++ -У Губки Боба снова появился нос, а на его костюме стало больше пуговиц
San Francisco panorama attacked by (one massive kitten)++++, hyperrealistic award-winning photo by the Associated Press - LoRA фактически пытается следовать про.
San Francisco panorama attacked by (one massive kitten)++++, hyperrealistic award-winning photo by the Associated Press - LoRA фактически пытается следовать промпту.
hyperrealistic death metal album cover featuring edgy moody realistic (human Super Mario)++, edgy and moody - Пропорции Марио более точны, а освещение персонажей более резкое и чёткое.
hyperrealistic death metal album cover featuring edgy moody realistic (human Super Mario)++, edgy and moody - Пропорции Марио более точны, а освещение персонажей более резкое и чёткое.

Здесь доступна неправильная LoRA, хотя я не могу гарантировать её эффективность в интерфейсах, отличных от diffusers. Все ноутбуки, используемые для создания этих изображений, доступны в этом репозитории GitHub, включая базовый SDXL 1.0 + уточнение + неправильный блокнот LoRA на Colab, который вы можете запустить на бесплатном GPU T4. И если вы хотите увидеть сгенерированные изображения, используемые в этой публикации в более высоком разрешении, вы можете просмотреть их в исходном коде публикации.

Что плохого в том, чтобы быть неправильным?

Я на самом деле не уверен на 100% в том, что здесь происходит. Я думал, что неправильный прием LoRA просто улучшит качество и чёткость сгенерированного изображения, но оказалось, что LoRA заставляет SDXL вести себя более разумно и более точно соответствовать смыслу промпта. На техническом уровне отрицательная подсказка устанавливает область скрытого пространства, где начинается процесс диффузии; эта область одинакова как для базовой модели, использующей неправильный отрицательный промпт, так и для LoRA, которая использует неправильный отрицательный промпт. Моя интуиция подсказывает, что LoRA изменяет эту нежелательную область обширного многомерного скрытого пространства, чтобы она была более похожа на начальную область, поэтому маловероятно, что нормальная генерация попадет в нее и, следовательно, будет улучшена.

Обучение SDXL на плохих изображениях с целью его улучшения технически является формой обучения с подкреплением на основе отзывов людей (RLHF): та же техника, которая используется для того, чтобы сделать ChatGPT настолько мощной, насколько она есть. В то время как OpenAI использует обучение с подкреплением, чтобы улучшить модель на основе положительных взаимодействий с пользователем и неявно уменьшить негативное поведение, здесь я использую негативные взаимодействия с пользователем (т. е. выбор заведомо плохих изображений) для неявного увеличения положительного поведения. Но с Dreambooth LoRA вам почти не нужно столько входных данных, сколько требуется большим языковым моделям.

Для «негативных LoRA» еще есть много возможностей для развития: мои параметры генерации синтетического набора данных можно было бы значительно улучшить, а LoRA можно было бы обучать дольше. Но пока что я очень доволен результатами и буду рад протестировать больше отрицательных LoRA, таких как слияние с другими LoRA, чтобы увидеть, может ли это улучшить их (особенно неправильная LoRA + Ugly Sonic LoRA!)

Хотите верьте, хотите нет, но это только верхушка айсберга. SDXL также теперь имеет поддержку ControlNet для строгого управления общей формой и композицией сгенерированных изображений:

Примеры генераци SDXL с использованием ControlNet с указанием (бывшего) логотипа Twitter/X.
Примеры генераци SDXL с использованием ControlNet с указанием (бывшего) логотипа Twitter/X.

ControlNet также можно использовать с LoRA, но этого достаточно, чтобы поговорить об этом в другой статье.

Комментарии (3)


  1. VPryadchenko
    21.08.2023 21:32
    +2

    и, поскольку уточнение не приводит к увеличению скорости, я настоятельно рекомендую использовать её, если это возможно.

    Все же в оригинале под speed overhead имеется ввиду временные накладные расходы, которые не увеличиваются, поэтому лучше перевести "не приводит к снижению скорости (генерации изображения, прим.)"


    1. ret77876 Автор
      21.08.2023 21:32

      Спасибо, исправил!


  1. Sadler
    21.08.2023 21:32
    +3

    А вот так первый абзац перевёл Google Translate. Найдите десять отличий.

    Релиз прошел в основном незамеченным, потому что шумиха вокруг генеративного искусственного интеллекта немного поутихла. Все в области искусственного интеллекта слишком заняты генерирующим текст ИИ, таким как ChatGPT (включая меня!). Примечательно, что это одна из первых моделей с открытым исходным кодом, которая может изначально генерировать изображения с разрешением 1024x1024 без махинаций, что позволяет отображать гораздо больше деталей. На самом деле SDXL состоит из двух моделей: базовой модели и дополнительной модели уточнения, которая значительно улучшает детализацию, и, поскольку уточнение не требует увеличения скорости, я настоятельно рекомендую использовать его, если это возможно.

    Позабавили всякие "рафинёры" и подобная дичь из-за непонимания Google Translate контекста.