Stable Diffusion — это невероятный инструмент с открытым исходным кодом для быстрого и эффективного создания новых изображений в самых разных областях. Несмотря на свою мощь и удобство, с его помощью сложно создать последовательных, узнаваемых персонажей в определенных стилях.

В Oxen мы твердо верим в возможность улучшения базовых моделей данными, специфичными для предметной области. В этом уроке мы будем использовать репозиторий Oxen и технику тонкой настройки Dreambooth, чтобы создать вариант Stable Diffusion, который может постоянно воспроизводить милых, пушистых мультяшных быков, подобных тому, что сейчас висит на нашей странице 404.

Зачем дорабатывать?

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

  1. Никакие умные подсказки не могут заставить нейронную сеть генерировать вещи, которых она не видела в своих обучающих данных. Мы вполне уверены, что в тренировочных данных стабильной диффузии не было преобладания пушистых мультяшных быков, что приводит к тусклым исходным результатам, которые мы покажем ниже. Нам гораздо проще предоставить эту информацию модели напрямую, чем ждать и надеяться, что будущая версия Stable Diffusion каким-то образом найдет и включит именно те данные, которые мы ищем.
  2. Если вы обучаете или настраиваете модели с открытым исходным кодом с помощью собственных данных, а не полагаетесь на сторонние сервисы, вы можете встроить модель непосредственно в свое приложение. Это, вероятно, сэкономит вам деньги по сравнению с покупкой кредитов у существующих поставщиков и устранит вашу зависимость от поставщика, который может изменить свой API / цены или прекратить работу в любое время.
  3. Тонкая настройка с использованием ваших собственных данных позволяет вам получить конкурентное преимущество, к которому вы не можете получить доступ только с помощью подсказок. Если ваш IP основан исключительно на том, как вы предлагаете общедоступную модель, конкурентам будет намного проще повторить ваши результаты!

Тонкая настройка новых токенов

Dreambooth отлично справляется с обучением моделей новым токенам, которых не было в исходных обучающих данных. Это делает его идеальным для создания новых именованных персонажей — мы будем использовать его, чтобы научить базовую модель стабильной диффузии распознавать и создавать изображения «быка-волка», будущего талисмана нашей компании.

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

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

Настройка программного обеспечения

В этом руководстве используются ресурсы из Руководства по Dreambooth Hugging Face, адаптированные для более удобного использования с вашими собственными наборами данных через Oxen. Далее содержится все, что вам нужно, чтобы создать своего собственного персонажа Stable Diffusion с нуля, но учебник Hugging Face содержит дополнительные сведения о конфигурации для тех, кто работает со сравнительно небольшим объемом оперативной памяти графического процессора. Если у вас возникли проблемы с обучением модели на вашей машине, ознакомьтесь с подсказками в их пошаговом руководстве!

Установить зависимости и шаблон

Мы будем использовать пакет diffusers для тонкой настройки нашей модели с Dreambooth. Клонируйте его репозиторий GitHub локально и установите его вместе со своими зависимостями.

git clone https://github.com/huggingface/diffusers
pip install -U -r diffusers/examples/dreambooth/requirements.txt

cd diffusers
pip install -e .

Настройте конфигурацию Accelerate по умолчанию для обработки шаблона для запуска логического вывода на графических процессорах:

# From a shell...
accelerate config default
# ...or from a notebook
from accelerate.utils import write_basic_config 
write_basic_config()

Получение наших данных от Oxen

Сила Dreambooth заключается в его способности помочь базовой модели узнать о конкретном названном предмете всего из нескольких наблюдений.

Вместо сотен/тысяч примеров с подсказками (например, «Милый мультяшный бык катается на доске для серфинга») мы можем просто указать уникальный именованный идентификатор для всех обучающих примеров (мы использовали «изображение быка-волка», чтобы научить модель нашего будущего талисмана) и передать только изображения.

Таким образом, в этом примере будут использоваться изображения быков, хранящиеся в этом репозитории Oxen. С некоторой помощью ChatGPT в создании широкого спектра подсказок, связанных с быком, мы собрали несколько сотен сгенерированных изображений быка в нашем целевом стиле из различных моделей (о том, как настроить собственную систему генерации изображений RLHF, читайте здесь). ). Поскольку Dreambooth лучше всего работает с небольшими, но последовательными наборами данных, мы выбрали шесть быков, наиболее соответствующих нашему целевому стилю.

Вы можете использовать здесь любые данные, но мы рекомендуем отдавать предпочтение качеству и согласованности, а не количеству, чтобы модель могла получить как можно более последовательное представление вашего персонажа.

После того, как вы создали репозиторий Oxen со своими собственными данными (вот наши для справки), перетащите его в свою локальную среду:

oxen clone https://www.oxen.ai/your-namespace/your-url-here

… ну, это все, что нужно. Мы готовы тренироваться!

Обучение модели

Установление базовой линии

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

Код для создания этого интерфейса доступен здесь и более подробно описан в нашем руководстве Сбор данных отзывов людей для генеративного ИИ.

pip install gradio
import torch
from diffusers import StableDiffusionPipeline
from PIL import Image 
import gradio as gr 

# Run inference with the base stable diffusion model 
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
pipe.to("cuda") # If using CUDA for GPU

def generate_images(prompt):
    images = pipe(prompt, guidance_scale=7.5, num_images_per_prompt=4).images
    return images 

with gr.Blocks() as demo: 
    prompt = gr.components.Textbox(label="Enter Prompt")
    generate = gr.Button("Generate candidate images") 
    images = {}
    with gr.Row()
        for i in range(1,5):
            with gr.Column():
                images[i] = gr.components.Image(label=f"Candidate Image {i}", type='pil')
    generate.click(generate_images, inputs=prompt, outputs=list(images.values()))

demo.launch(share=True)

Это дает нам следующий пользовательский интерфейс, который мы можем использовать для создания некоторых образцов результатов для базовой модели (мы использовали CompVis/stable-diffusion-v1–4, но не стесняйтесь экспериментировать с другими) для трех стратегий подсказок. Мы вернемся к этим трем подсказкам после тонкой настройки, чтобы увидеть, чему научилась модель!

Тонкая настройка с Dreambooth

Сценарий обучения модели, который мы будем использовать, находится в репозитории diffusers git, который мы клонировали ранее, по пути diffusers/examples/dreambooth/train_dreambooth.py.

Сначала мы установим несколько переменных, чтобы правильно параметризовать сценарий для нашего пользовательского варианта использования:

  • MODEL_NAME: базовая модель для начала с Hugging Face
  • INSTANCE_DIR: каталог, содержащий наши изображения для точной настройки — будет указывать на папку images в нашем репозитории волов.
  • OUTPUT_DIR: имя выходной папки модели (и имя модели при загрузке в Huggingface)
  • INSTANCE_PROMPT: уникальное «имя» предмета, который мы хотим, чтобы модель выучила.
export MODEL_NAME = "CompVis/stable-diffusion-v1-4"
export INSTANCE_DIR = "./dreambooth-ox/images"
export OUTPUT_DIR = "stable-diffusion-oxified"
export INSTANCE_PROMPT = "an image of the oxenai ox"

Теперь мы готовы запустить скрипт. Все приведенные ниже флаги используют рекомендуемые настройки Hugging Face. Интерфейс командной строки направит вас на аутентификацию с помощью Hugging Face.

accelerate launch diffusers/examples/dreambooth/train_dreambooth.py \
  --pretrained_model_name_or_path=$MODEL_NAME  \
  --instance_data_dir=$INSTANCE_DIR \
  --output_dir=$OUTPUT_DIR \
  --hub_model_id="YOUR-HF-NAMESPACE/YOUR-MODEL-NAME" \
  --instance_prompt="$INSTANCE_PROMPT" \
  --resolution=512 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=1 \
  --learning_rate=5e-6 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --max_train_steps=400 \
  --push_to_hub

Это заняло около 5 минут на одной NVIDIA A10 с 24 ГБ видеопамяти GPU, которую мы арендовали у Lambda Labs.

Создание новых изображений

Если был установлен флаг --push_to_hub, сценарий подтолкнет результирующую модель к Hugging Face после обучения. Таким образом, мы можем изменить наш код пользовательского интерфейса для вывода следующим образом, чтобы выполнить вывод для новой модели:

# Run inference with the base stable diffusion model 
#OLD: pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
#NEW: 
pipe = StableDiffusionPipeline.from_pretrained("<your-hf-username>/stable-diffusion-oxified")

Полученные результаты

Давайте сравним модели, используя те же 3 подсказки, которые мы применяли до Dreambooth.

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

  1. Модель стала поразительно хорошо производить новые наблюдения в стиле нашего целевого быка, учитывая, как мало тренировочных наблюдений она видела. Это основная компетенция Dreambooth, и мы действительно впечатлены тем, как это получилось!
  2. Как и ожидалось, модель лучше всего вспоминает наш специфический стиль быка, когда мы используем наш обучающий токен an image of the oxenai ox. В третьей подсказке, где мы ссылаемся только на an ox, базовое понимание модели того, как выглядит бык, исходя из ее исходных данных обучения, все еще просвечивает (хотя и немного обусловлено нашими примерами — см. Белый мех и выступающие рога).
  3. Даже без явного упоминания маркера oxenai ox эта тонкая настройка сделала модель более способной создавать мультяшных, пушистых быков — просто посмотрите на разрыв в согласованности между результатами до и после Dreambooth для первой подсказки!

Что дальше?

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

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

В качестве попытки решить обе эти проблемы мы собираемся использовать эту новую модель (и интерфейс RLHF на базе Oxen), чтобы получить дальнейшую оперативную обратную связь для дополнительной тонкой настройки. Мы думаем, что это будет ключом к преодолению разрыва с общим, последовательным персонажем — следите за результатами!

В OxenAI мы хотим видеть, что вы строите! Свяжитесь с нами по адресу [email protected], следите за нами в Twitter [@oxendrove](https://twitter.com/oxendrove), изучите документацию или зарегистрируйтесь в Oxen сегодня. http://oxen.ai/register.

И помните — за каждую звезду на GitHub вол получает крылья.

Нет, правда… мы подключили репозиторий Oxen к веб-хуку GitHub, который запускает Stable Diffusion каждый раз, когда мы получаем звезду. Иди найди свою!