Обучение модели с помощью LoRA

Как обучить модель новому лицу, персонажу, стилю, за несколько минут.

Обучение модели с помощью LoRA

Что я получил в итоге:

Обучение модели с помощью LoRA

Из чего:

Обучение модели с помощью LoRA

Гайд подойдет уже достаточно опытным пользователям стабильной диффузии или тем кто может внимательно повторять за всем что написано.

Low-rank adaptation (LoRA) - в последнее время стала крайне популярной из за того что всего за несколько минут можно обучить сеть отрисовывать предмет или следовать определенному стилю. На civitai новые LoRA появляются буквально сотнями в день.

В гайде будет использоваться пример с Google Colab чтобы обучать мог каждый(позже выйдет версия для ПК). Так как на 6гиговых картах памяти может уже и не хватить. Да и не у всех есть даже такая.

Обучение модели с помощью LoRA

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

Вот тут нам и пригождается LoRA (дальше просто Лора). Это метод который позволяет нам обучать модель новой концепции.

Преимущество Лора в том что тренировка не требует много времени и сотен изображений.

Нам понадобится:

  • Гугл аккаунт
  • Аккаунт хаггингфейс (опционально, если вас не устроит набор уже встроенных моделей)
  • Набор данных для обучения (изображения концепта или примеры стиля)

Готовим датасет:

Один из самых понятных пунктов, но это не делает его простым.

Рекомендуется использовать от 25 до 30 изображений. Но если у вас столько нет и не удается собрать вы уже видели какого результата можно добиться даже с семью которые были у меня.

Если вы хотите натренировать лицо то вот неплохой пример как нужно работать с ракурсом. Но плохой пример в том что желательно иметь разное освещение и одежду. Ну или отсекать ее
Если вы хотите натренировать лицо то вот неплохой пример как нужно работать с ракурсом. Но плохой пример в том что желательно иметь разное освещение и одежду. Ну или отсекать ее

Так же все фотографии должны иметь соотношение сторон 1 к 1 и быть в разрешении 512 х 512 ну или 768 x 768. Более высокое разрешение в первую очередь скажется на потреблении видеопамяти, но итоговый результат получится лучше.

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

Так же важный момент в том что на обучение можно отдавать фотографии сгенерированные самой нейросетью. Если у вас есть персонаж которого вы хотите “закрепить” это отличный способ сделать это. Или вы натренировали модель, но она выдает годноту редко. Берете удачные и тоже отправляете в датасет (Как генерировать похожих персонажей это тема для одной из будущих статей, так что не забудьте подписаться).

Кто-то умный

После подготовки изображений переименуйте их в 1.png, 2.png и т.д. Теперь нам нужно подготовить описание к ним. и положить рядом с нашими изображениями по шаблону 1.txt 2.txt и тд. Каждое описание соответствует своей картинке.

Самый важный момент, читать вдумчиво и внимательно, никто и нигде нормально это не объясняет:

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

Для своей я выбрал слово pechenya. (правда по этому запросу сеть генерирует какую-то рыбку, ну да ладно)

Например, случайная фотография из интернета(напоминаю что фотка должна быть квадратная):

Обучение модели с помощью LoRA

Если нашим ключевым словом для активации будет pechenya то txt к этому изображению должен выглядеть примерно так:

pechenya, red dress, trees, street, outdoor, bench, sitting…

То есть, логика такая. Мы даем нейросети картинку, пишем что тут есть наше key_word и пишем то что не имеет прямого отношения к нашему key_word например если не написать red dress нейросеть решит что это часть образа и добавит его в обучение. Если описать все кроме него то мы обучим нейросеть как раз рисовать это самое платье. Лору можно тренировать сразу на несколько концептов за раз. Об этом чуть позже.

Вам нужно думать постоянный ли это признак или я хочу его менять? Постоянно ли ее глаза открыты? Постоянно ли она улыбается? Сидит, стоит? Всегда ли она блондинка с длинными волосами? Так же не советую так же слишком усердствовать и описывать вообще ВСЁ, типа: голубь, плитка, небо, асфальт. 5-8 достаточно

Так же! Не пишите вот так a woman in a white a plastic raincoat on her head and shoulders, holding a plastic bag over her head*. Это должно выглядеть так:* white plastic raincoat, plastic bag.

Я буду тренировать сеть на символе сайта пикабу и мой подготовленный датасет выглядит вот так:

Мой датасет с уже размеченными изображениями доступен тем кто поддерживает меня на <a href="https://boosty.to/neural_academy" rel="nofollow noreferrer noopener" target="_blank">бусти</a>. Тут же я учу вас делать свой.
Мой датасет с уже размеченными изображениями доступен тем кто поддерживает меня на бусти. Тут же я учу вас делать свой.

Уже после того как с датасетом закончили..

Переходим в гугл колаб..

Запустите секцию 1.1:

Обучение модели с помощью LoRA

После того как стрипт отработал и скачал все зависмости(1-3 минуты), рядом с кнопкой плей появится зеленая галочка. Переходим к следующему пункту.

Пункт 2.1 - Выбор модели:

Тут опционально, если вас устраивают модели из списка, то выбираем одну из них и жмем плей.

Обучение модели с помощью LoRA

Я выбираю Stable Diffusion 1.5 для аниме рекомендуется одна из Anything. Для арта можете попробовать OpenJourney. И пропускаю пункт 2.2

Если вы более опытный пользователь и у вас есть другая модель на примете на которой хотите тренировать, пропускаем 2.1, переходим к 2.2. Тут вам понадобится ссылка на модель с сайта хаггингфейс и токен оттуда же. Думаю если у вас возникла такая потребность то вы уже знаете как это сделать.

Пункт 2.3

Обучение модели с помощью LoRA

Для дифузии 1.5 выбираю Sd vae, а для аниме, ну вы сами видите. И снова плей.

Пункт 3.1

Эта команда создаст папки для нашего концепта.

Обучение модели с помощью LoRA

parent_directory - путь к папке. Оставьте так

reg_repeats - не знаю зачем он тут. Насколько мне известно регуляризационные изображения не требуют повторений. Оставляем 1. (Не использовал, но насколько знаю они нужны чтобы избавиться от отличительного стиля персонажа нам это не надо и мы это использовать не будем)

concept_name - имя папки, я называю ее ключевым словом. У меня будет pechenya

class_name - объединит разные концепты в один класс

Можем создать так несколько папок с разными концептами, просто меняйте ключевое слово и снова запускайте блок и заполняйте папки новыми датасетами с новыми ключевыми словами и концепциями. Так модель сможет выучить несколько концептов.

Нажмите на папку слева экрана и пройдите по пути content/LoRA/train_data/имя вашей папки.

Обучение модели с помощью LoRA

Закиньте в нее весь ваш датасет.

Зайдите в папку pretrained_model. Там будет лежать модель которую мы скачивали в пунктах 2.1 и 2.2. Нажмите ПКМ и Скопировать путь.

А теперь летим сразу на пункт. 5.1

Обучение модели с помощью LoRA

v2 - Ставите галку если тренируете на второй версии диффузии

v_parameterization - если на версии 2.1 то и эту

project_name - как будет называться файл Лоры (не влияет на ключевое слово)

pretrained_model_name_or_path - путь до модели, мы его только что копировали, вставляем после папки /content/. У меня будет так /content/pretrained_model/Stable-Diffusion-v1-5.safetensors

vae - путь до vae можно взять там же, в пункте 1.2, не забудьте про слеш в начале. У меня /content/vae/stablediffusion.vae.pt

Остальное не меняем. Это пути для датасетов и куда сохранится модель.

Переходим к 5.2

В целом, кто уже устал вникать можете просто нажить плей и идти дальше, стандартные настройки в целом окей и если что-то не получилось можно уже вникнуть во всё это дело. Остальные читаем.

Пожалуй самая техническая и самая сложная для объяснения вкладка. Буду говорить примитивно. И указывать что на что влияет.

Обучение модели с помощью LoRA

network_dim - во первых это повлияет на итоговый размер вашего файла Лора, примерно 1 за 1 мегабайт. Во вторых чем выше значение тем выше выразительность вашего обучения. 128 как по мне является хорошим соотношением. Его оставляем, но если вашей итоговой модели этой самой выразительности не хватает попробуйте увеличить. Быстрая скорость обучения развязывает руки для экспериментов.

network_alpha - во первых это значение должно быть ниже либо равным network_dim и нужно для предотвращения ошибок точности. Чем ниже значение тем сильнее замедляет обучение. Зачем замедлять обучение? Это точно в другой раз, иначе эта статья не кончится 😅. Я ставлю равным network_dim.

network_train_on - какой текстовый кодировщик использовать, оставьте both.

Обучение модели с помощью LoRA

optimizer_type - выбор типа обучения так сказать. Оставляем по умолчанию. Я видел тесты людей, и этот показывал себя хорошо. Думаю ничего не изменилось.

unet_lr - что-то вроде памяти, имеет информацию о том как элементы взаимодействуют друг с другом. Первое куда стоит смотреть если обучение не получилось. Сначала рекомендую пройтись со стандартными параметрами и что-то крутить только когда вроде все должно было получиться, но не получилось. Если итоговая модель выдает визуальный шум вместо нормального изображения то значение слишком высокое. попробуйте слегка уменьшить и повторить.

text_encoder_lr - управляет тем как ИИ понимает текстовые подсказки. Если не указать возьмёт значение unet_lr. Если ваша модель выдает слишком много нежелательных объектов(могла нахвататься с вашего дата сета) уменьшите это значение. Если наоборот объекты плохо проявляются. Увеличьте или вместо этого увеличьте количество шагов обучения.

lr_scheduler - кривая обучения. Не уверен что вы захотите это читать.

lr_warmup_steps - насколько я вычитал это количество шагов на очень низкой скорости обучения. Не могу сказать наверняка. Как видите у меня тоже есть пробелы. Оставляю 0.

lr_scheduler_args - аргумент для lr_scheduler. Оставляем по умолчанию.

1e-4 это 0.0001 5e-5 это 0.00005 Не знаю зачем они выпендриваются с “e”.

Всё, нажимаем на на кнопку плей.

5.3 Снимите галочку с enable_bucket и нажмите плей.

5.4

Обучение модели с помощью LoRA

Тут я меняю настройку train_batch_size опускаю до единицы. Эта настройка может ускорить обучение, но в тоже время это происходит из за того что сеть берет сразу несколько картинок и берет как бы среднее значение между ними больше подходит для тренировки стиля, для лица тоже может подойти, но для нового концепта как персонаж я предпочел выключить. И clip_skip меняю на 1.

Остальные настройки:

noise_offset - Если коротко дает диффузии больше простора для внесения изменений. В основном влияет на яркость\затемненность картинки. Длинно тут. Собираюсь активно экспериментировать с этой функцией но пока поставлю 0.

max_train_type - проходим с помощью шагов или эпох. Эпохи позволяют делать чекпоинты, поэтому оставляю их.

max_train_type_value - количество для предыдущего пункта. На скрине 20, получается 20 эпох. У нас в папке 7 картинок, папку мы назвали 5_pechenya. 5 значит количество проходов, все проходы одна эпоха. Получаем 7520 = 700 итераций будет пройдено. Рекомендации к общему количеству итераций очень разные и варьируются от 200 и до 10000. Разные настройки влияют на скорость обучения, при меньшей скорости нужно больше шагов еще зависит от тог отчо тренируете, стиль или персонажа и качества датасета. В общем нюансов много. Но через некоторое кол-во тренировок вы примерно найдете для себя середину для разных ситуаций.

train_batch_size - разобрана выше

save_n_epochs_type - по какому типу считать эпохи? Я если честно хз. Колаб у меня закончился пока статью писал, а на стационарном ПК у меня такой настройки нет. По молчанию значит.

save_n_epochs_type_value - коэффициент для пункта выше.

mixed_precision и save_precision - точность. Все ставят f16 и я ставлю.

save_model_as - тип модели при сохранении, оставляйте safetensors остальные можно сказать устарели

max_token_length - максимальная длина промпта

clip_skip - сложно объяснить. Нейросеть работает слоями эта цифра означает сколько последних слоев мы хотим пропустить, обычно она выбирает в зависимости от модели. Тут стоит два так как колаб был рассчитан на аниме модель. Я работаю с СД 1.5 тут лучше поставить 1. Чем раньше остановились тем меньше слоев нейросети обработали подсказку. Комментарий с вики: Некоторые модели были обучены с использованием такого рода настроек, поэтому установка этого значения помогает добиться лучших результатов на этих моделях.

gradient_accumulation_steps - это метод, при котором вы можете тренироваться на пакетах большего размера, чем ваша машина обычно может вместить в память. Это делается путем накопления градиентов в течение нескольких пакетов и только после выполнения определенного количества пакетов оптимизатор активизируется. У меня не было необходимости использовать

seed - делает тоже что и всегда, подмешивает соль

additional_argument - аргументы командной строки

Запускаем:

Обучение модели с помощью LoRA

Процесс завершен, 5 минут 22 секунды, а не часы как тактовой инверсии например.

Можно скачать модель и тестировать или тестировать прямо в колабе перейдя к пункту 6.2(в поле model вставьте путь до модели как делали раньше). А в network_weight Лора, она находится по адресу containt/LoRA/output рядом с папкой куда мы кидали наш датасет. Без доп цифр финальная версия с ними наши контрольные точки, если финальная окажется перетренированной пробуйте другие.

Обучение модели с помощью LoRA

Вот что у меня получилось. Промпт (plumber pechenya, <lora:pechenya:1>)

Обучение модели с помощью LoRA

Клево? Не совсем. У всех одно выражение лица.

В общем один признак слишком сильно прилип. Снизим количество проходов до 5. (max_train_type_value = 5). Нам не нужно повторять все что мы делали до этого момента, если вы этого боялись. 😅 Только пункт 5.4. Меняем значение снова плей. Все закончилось за 1 минуту 27 секунд! Карл! В других способах это снова заняло бы час!

Ну и более того нам вообще не нужно это все повторять так как настройка save_n_epochs_type_value создавала нам контрольную точку каждые 3 эпохи и у нас создался не один, а max_train_type_value деленное на 3 вариантов файлов. Так что мы можем взять файл чуть “помладше”.

Не забудьте скачать итоговую модель, иначе гугл колаб ее удалит через некоторое время как вы отключитесь

Результат:

Обучение модели с помощью LoRA

Уже намного разнообразней и как можете заметить пропала белая обводка, но тут еще не четко прослеживается стиль, так что истина у нас будет где-то посредине между 5 эпохами и 20ю. Это уже вопрос тонкой настройки, которой я для себя сейчас и занимаюсь чтобы сделать идеальный генератор печенек. Ждите =) Благо эксперимент занимает всего пару минут времени. Вот почему Лора настолько популярна и захватывает агрегаторы моделей. Теперь надеюсь увидеть там и ваши работы тоже. Увидимся в чате ✌.

Обучение модели с помощью LoRA

Нюансы:

  • Лора должна хорошо работать на всех пользовательских моделях которые созданы на базе той модели на которой вы ее тренировали. Например я тренировал на 1.5, на 1.5 основана deliberate даже версия deliberate 2. На ней будет хорошо работать. Я мог бы тренировать на самом Deliberate и все было бы тоже самое в том плане что работало бы хорошо со всеми моделями основанными на 1.5.
  • Если посмотреть на результаты генерации то можно увидеть что размер головы занимает примерно одно и тоже количество места. Прямо как в нашем датасете так что хотите больше разнообразия в размере делайте разнообразней датасет.
  • Я много что упустил, возможно сделал ошибки, возможно фактические, просьба сообщать о них чтобы я мог внести исправление. Одно дело делать для себя иногда не задумываясь о том что под капотом, просто знать как отразится на результате и другое в виде гайда.
  • 5,6,7,8,9,10,11,12 - нюансы про которые я забыл

Поделиться результатом или задать вопрос вы можете в нашем комьюнити по ссылке. https://t.me/neuralphotoart_chat

Больше гайдов на моем канале, подписывайтесь чтобы не пропустить: https://t.me/neuralphotoart

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

10K10K показов
20K20K открытий
55 репостов
25 комментариев

Пикабубляди не люди

Ответить

База

Ответить

Не забудьте скачать итоговую модель, иначе гугл колаб ее удалит через некоторое время как вы отключитесь

Если я верно понимаю, то можно в пункте 3.1. смонтировать свой Google-Drive и в п.5.1 указать, чтобы тренированная модель сохранялась сразу к нам в облако.

Ответить

Жесть, пикабу захватывает нейросети :D

Ответить

Спасибо за суперпонятный гайд. Добавлю, что kohya скрипт чувствителен к регистру и если ему в тренировочные картинки скормить файлы с расширениями в верхнем регистре (например "*.JPG" или "*.JPEG"), то он будет ругаться на то, что нет изображений. Убил на выяснение этого факта 2 дня :(

Ответить

А если бы спросил в нашем чате то сэкономил бы 2 дня времени 🙄

Ответить

Ну и в итоге приложуха в гугле уже сдохла давно + все настройки там 20 раз поменялись. Короче статья не актуальна, не тратьте время на эту хуйню.

Ответить