v0.1f
/ai/ Lora Complete Idiot Guide

Lora Complete Idiot Guide

Ну что же, мой дорогой друг, познавая дивный мир нейрохудожеств ты захотел сгенерировать свою вайфу и удивился тому, что простой промт не может воспроизвести ее с должной точностью? Низкоранговая адаптация модели (LoRa) поможет тебе! Или, возможно, ты зашел сюда уже имея дела с лорами и решил сгенерировать свою?
Далее тебя ждет простой, но в то же время подробный гайд по их обучению на локальном компьютере. Для этого тебе потребуется видеокарта белого человека с 6 или более гигабайтами видеопамяти (для 1к серии есть нюансы с необходимостью альтернативных библиотек) и немного терпения.

Данный гайд рассчитан прежде всего для генерацию 2d тяночек на NAI-based моделях. Копродедам - увы, хотя основные положения могут быть справедливы

Описанные действия предполагают актуальную(!) windows 10+, питон 3.10.x, наличие всех основных c++ redistributable, исправные драйвера nvidia и работающий без ошибок WebUi последней версии

Обучающие программы при работе выделают себе большой объем оперативной памяти, а некоторую часть даже используют. Хорошая новость в том что все будет работать и на 16 гигабайтах, но потребуется выставить файл подкачки хотябы 32 гигабайта. Плохая в том, что в момент запуска и окончания обучения производительность компьютера будет отвратительной, желательно закрыть все программы, браузер и пойти попить чаю. На 32+гб ram идет гораздо комфортнее

Тренировка лоры будет описана на примере Shimakaze из лучшей гачадрочильни по корабликам
Shimakaze Скачиваем ДАТАСЕТ (пароль стандартный) и распаковываем в папку без кириллицы и длинного пути.

Установка и запуск

Подготовка скрипта kohya-ss

В первую очередь нам потребуется стянуть sd-scripts, который, собственно, и будет производить обучение. Гайд написан на версии 0.4.5, должен работать и на более новых.
Выбираем папку по душе, открываем в ней PowerShell (правая кнопка по пустому месту - открыть терминал), вводим в него:


git clone https://github.com/kohya-ss/sd-scripts

Пишет в ответ много красненьких букв среди которых имя "git" не распознано?

Иди скачивай git для шиндоуз, как ты webui устанавливал?

Когда все скачалось забиваем следующие команды:

1
2
3
4
5
6
7
8
cd sd-scripts
python -m venv venv
.\venv\Scripts\activate
pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 --index-url https://download.pytorch.org/whl/cu118
pip install xformers==0.0.21
pip install bitsandbytes==0.35.0
pip install tensorboard==2.14.1 tensorflow==2.14.0
pip install -r requirements.txt

  • Продолжаем:
    accelerate config
    

На все вопросы кроме Do you wish to use FP16 or BF16 (mixed precision)? просто нажимаем Enter, на него, (используя стрелочки на намблоке с отключеным NumLock для перемещения), выбираем fp16 или bf16. Последний вариант более предпочтителен, но поддерживается только начиная с RTX30xx.

Оснастка для запуска

Готово, теперь у нас есть машина для обучения, которой нужно скормить нужные параметры. Делать это можно разными способами, прямым вызовом accelerate с кучей параметров или использовать различные оснастки с более удобным представлением параметров.
Среди них есть:

В примере будет рассмотрен именно первый вариант

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

Ниже 2 примера с уже забитыми параметрами:

Открываем любым текстовым редактором, все что необходимо сделать - это изменить линии с 11 по 16 выставив пути к своему кохая-скрипту, модели, VAE, датасету и папке, куда будут сохраняться лоры. VAE подключать крайне рекомендуется чтобы не вылезали поломанные цвета и меньше ломало мелкие детали, выходную папку можно настроить сразу в WebUi чтобы лишний раз не копировать.
Какому датасету? Вот к ЭТОМУ, будь внимателен.
Какую модель указывать?
В зависимости от той модели StableDiffusion, на которой происходит тренировка, результат может меняться. Стоит выбирать или модель, которую вы используете наиболее часто и не содержащую избыточной стиллизации, или ванильную NAI модель. В данном гайде рассматривается именно второй вариант

Если хочешь провести Шимка-тест

воспроизводя результат из гайда - замени в скрипте значения параметроа is_random_seed shuffle_caption (строки 48-49) на 0, тогда у тебя будет использован тот же сид и отключено перемешивание токенов для снижения случайных факторов. При обычной тренировке shuffle_caption должен стоять единицей для получения наилучних результатов


Сохраняем, открываем терминал в папке со скриптом, вызываем его командой ./train_shim_brrr.ps1 (или другим именем скрипта)

Начало писать что-то на мунспике и появилисть прогрессбары

Поздравляю, ты сделал все правильно

Вылетает с ошибками

обычно все необходимое для решения есть в ее описании, не ленись и прочти.

Теперь под шум твоей высокотехнологичной печки стоит описать что мы вообще тут делаем. Если лень читать или хочешь сразу перейти к результатам - проматывай до раздела с использованием

Подготовка датасета

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

Граббер

Как собирать? Если желаемый персонаж относительно известный (или на целевой стиль есть хотябы пара десятков пикч) то помогут нам наши невольные друзья-художники, буры и софт для массового скачивания с них.
Качаем и ставим https://github.com/Bionus/imgbrd-grabber

настраиваешь проксю или подключаем впн если живешь в этой стране

Запускаем, жмем ctrl+T, внизу нажимаем кропку «источники» и выбираем gelbooru (наиболее безпроблемный с отсутствием ограничений на число тегов поиска) или сразу несколько желаемых.
Слева внизу выбираем папку куда все будет сохраняться, в поле имя вставляем %position%.%ext%, сохраняем.
Путь сохранения

Теперь идем в настройки-сохранить-Отдельные файлы журнала, жмем кнопку добавить, указываем ту же папку, имя файла %position%.txt, содержимое %all:unsafe,separator=^,^ %
Текстовые файлы с тегами


Возвращаемся обратно в новое окно, в поле тегов вбиваем желаемое, используя -исключаем то что не хотим, также полезным будет сделать сортировку по оценкам добавив order:score
Поиск

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

Сортировка пикч с бур

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

Пример подходящих пикч

Подходящие

Пример неподходящих пикч

Неподходящие


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

Что касается сфв/левд

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

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


Подписи

Если этого много а пикча хороша - кропаем отсекая ненужное. То же стоит делать если целевой персонаж находится уж очень далеко. Пикчи с соотношением сторон выходящим за 3к1 также кропаем.

Фанатизма здесь не нужно, достаточно убрать только самые крупные огрехи.

Последней проблемой на пути может стать прозрачный фон

Просто заливаем его белым цветом и тут же в текстовом файле с тегами меняем transparent background на white background, simple background, или дропаем эту пикчу.


Что касается размера датасета здесь качество>>>>>>количество, для тренировки лоры на персонажа хватит и 30 пикч если они разнообразны.

Оптимальным по количеству можно назвать диапазон от 50 до 300

Главное - стремиться к относительному разнообразию в ракурсах, одежде (ее отсутствие считается), фонам. Если последние будут монотонными и однообразными или что еще хуже одноцветной заливкой, то это может вызвать дальнейшие проблемы с фонами на генерациях. Что касается стиля - если большая часть пикч в одной стилистике то она будет усвоена и воспроизведена. При не идеальных настройках обучения или скудном датасете это также приведет и к влиянию на фон, хорошо это или плохо - зависит от цели.
Кропать пикчи до квадратов или снижать их разрешение до 512 не нужно - скрипт сделает это сам используя несколько соотношений сторон.

Теггирование датасета

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


Прежде всего необходимо удалить мусорные теги буры, которые будут тратить токены клипа и сбивать с толку сеть:

1
2
3
4
5
6
7
absurdres
highres
commentary request
commentary
artist name
commission
...

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

1
2
3
shimakaze (the white rabbit of wonderland) (azur lane)
shimakaze (world's speediest bunny waitress) (azur lane)
...

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

Если источник пикч датасета – не граббер, что любезно создает готовые файлы с тегами – придется использовать различные оснастки для автотегинга (WD1.4 tagger, DeepDanbooru), или ебошить вручную.

Структура папок

Когда пикчи и теги к ним у нас готовы – нужно раскидать их по папкам. Для этого в первую очередь считаем количество пар пикча-теги, выбираем число шагов обучения (для начала стоит взять 4000 чтобы с запасом), делим это число на 10 (число эпох в нашем обучении), делим на количество и получаем необходимое число повторений каждой пикчи.
Округляем в большую сторону, создаем папку с именем N_a где N - найденное число и перемещаем в нее все пикчи и текстовые файлы с тегами.

Пример

В датасете из начала гайда 61 пикча, предполагается что целевой свитспот лежит в диапазоне 2300-3000, использовано 6 повторений что должно дать хороший результат на 6-8й эпохе.


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

Параметры обучения

Теперь переходим к самому веселому и спорному - параметры обучения.

Если ты гуманитарий

то предварительно загляни сюда


Для начала разберем краткий перечень основных параметров:

  • Число шагов
    описано выше, определяется как число пикч*число их повторений*число эпох. Если их слишком мало - модель не успеет обучиться, если слишком много - будет переобучение, выражающееся в общем распидорашивании, ухудшении обработки тегов, взрывах фона, появлению не удаляемых элементов одежды. В случае невысокого лр может было малозаметно, но проявиться потом рандомно в мелких элементах.
    Недотрен-оптимум-перетрен Пример
  • network_dim
    ранг сети, напрямую влияет на ее размер и количество деталей которое она в теории может вместить. На практике больше 32 разница уже не заметна, но больше не меньше, так что можешь смело оставлять 128
  • network_alpha
    хочешь стабильно работающую модель оставляй единицей, хочешь поломанную, но (изредка) дающую интересный результат - ставь равной network_dim, возможны промежуточные значения. Ходят слухи что второй вариант наиболее предпочтителен для обучения на стиль, но объективных данных мало. Также автор может подтвердить возможность крайне крутых результатов с поломанными моделями, вот только их доля мала а большая часть пикч будет захуевлена в высокой вероятностью. Большое поле для экспериментов, на свой страх и риск.
  • train_batch_size
    количество потоков параллельной тренировки, каждый поток отъедает свою врам. В теории большее число потоков дает более качественное обучение, на практике это не заметно, возможно из-за рандома и сложностей объективного отслеживания. Хочешь исследовать - велкам. Из некоторых экспериментов таки стало ясно что большой батч сайз прощает ошибки настроек, чрезмерный лр проявится не так ужасно, слишком долгая тренировка упорет модель меньше, вот наглядный пример
    Пример BS
    Обе модели перетренены и имеют проблемы с фоном и управляемостью, но та что на низком BS совсем приуныла. При этом на ранних эпохах они схожи и не показывают разницы в темпе обучения.

Главный факт в том что повышение BatchSize снижает время, затрачиваемое на обучение

за счет более эффективного использования ресурсов gpu. Так что ставь сколько влезает в врам

  • scheduler
    планировщик обучения, который будет менять множитель ее скорости в ходе прогресса. Вариантов много, стоит попробовать все, кроме, разве что, постоянного. Косинус дает неплохие результаты.
  • unet_lr
    скорость обучения модели денойзинга, определяет то насколько интенсивно обучатель будет шатать параметры модели, пытаясь натянуть ее на твою пикчу
  • text_encoder_lr
    то же самое но для текстовой модели. Рекомендуется выставлять в диапазоне от половины unet_lr до равной ей/
    Оба пераметра сильно зависят от соотношения alpha и network_dim, также в теории должна быть зависимость от train_batch_size. При низком значении модель не сможет нормально обучиться сколько не трень, при слишком высоком все распидарасит.

Пример грида с различными LR (alpha=1, LR в имени модели, dim=128, BS=12)

Пример LR

Пример слишком низкого LR с разбиением по эпохам

Низкий LR

Пример слишком высокого LR с разбиением по эпохам

Высокий LR


Автор настоятельно рекомендует попробовать сравнительно высокие значения LR (2e-3) и его окрестности с планировщиком косинус, alpha=1, dim=64..128 и числом шагов ~2500. Есть мнение что долгие обучения на низких лр позволяют получить наилучший результат а подобный подход хуев - пруфов этого мы так и не увидели, есть лишь обратное, однако ты, анон, можешь взять и сам сравнить.

  • Число эпох
    в начале каждой эпохи пикчи загружаются в память, проходит перемешивание тегов (если включено) и обучение продолжается с прошлой точки. Как правило промежуточные состояния лоры сохраняются каждую эпоху, соответственно если целевое число шагов обучения хотя бы примерно известно, то нет смысла ставить их более 10 штук, ибо разница между соседними будет малозаметна. Есть мнение что большее число эпох позволяет получить некоторые преимущества (при этом возможно настроить сохранение модели раз в N эпох, а не на каждую), однако есть и негативные эффекты и ничего из этого не было как-то запруфано, поэтому ориентироваться стоит прежде всего на число шагов, а на эпохи. Если видишь в треде кто-то обучает с десятками-сотнями эпох на аниме персонажа - смело кидай в него камень, может родит пруфы и таки внесет революцию.
  • save_precision, mixed_precision
    Выбирай или fp16 или bf16. Последний формат предпочтителен так как покрывает больший диапазон значений (пусть и с меньшей точностью но это не так важно), но работает только на последних видеокартах.

Менее важные параметры

Разрешение тренировки - для sd1.x моделей, коими являются почти все анимублядские оставляй 512 и не трогай
clip_skip = 2 аналогично прошлому
max_token_length - число обрабатываемых токенов, подбирается по наиболее длинному набору тегов из пикч, просто скопируй его в промт webui и посмотри на счетчик справа. Меньше - лучше (в теории), небольшая обрезка при их превышении не создаст проблем
keep_tokens - число тегов (не токенов как в названии!), которые будут оставаться на первом месте при их перемешивании, именно для этого мы стремились ставить тег персонажа в самое начало
shuffle_caption - признак перемешивания тегов, должно быть включено

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

Использование и тестирование лоры

Вызов лор

Вызвать лору можно двумя способами:

  • через промт штатными средствами sd-webui (кнопка show extra networks под Generate и вкладка Lora) откроет их список и по клику вставит в промт конструкцию типа <lora:NAME:1> где 1 - ее вес
  • через аддон

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

В случае аддона рекомендуется зайти в настройки webui, найти в поиске "Extra paths to scan for LoRA models" и прописать в ней %путь_до_сд%\stable-diffusion-webui\models\Lora чтобы использовать стандартную папку с лора-моделями, куда они должны быть скопирвоаны.


Для начала выбираем последнюю эпоху сгенерированной выше лоры, выставляем вес 0.8, выбираем модель anything-v4.5, выставляем следующие параметры генерации


Imgur
Imgur


Вбиваем промт:

best quality, masterpiece, ultra-detailed, shim, 1girl, animal ears, armpits, azur lane, black footwear, black gloves, black hairband, black skirt, blush, brown thighhighs, cake, clothes lift, cup, female focus, food, frilled hairband, full body, gloves, standing, long hair, looking at viewer, panties, rabbit ears, shoes, skirt lift, solo, [white|blue] striped panties, thick eyebrows, thighhighs, underwear, white hair, yellow eyes
Negative prompt: (worst quality, low quality:1.4), multiple views

и неистово генерируем!


Если все выполнено правильно то встретить нас должно что-то на подобии пикрелейдет

Шимка


Конкретный результат может несколько отличаться из-за разных сидов обучения


Если же вы видите следующий пик

Отсутствие лоры
значит что-то пошло не так и лора вообще не применилась, нужно нажать налочку Enable или поискать ошибки в консоли.


Шимка-тест

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


BS12 BS2


Небольшие отличия возможны, поскольку как при обучении, так и при генерации используется xformers.


Использование гридов

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

Есть мнение что они вообще нихуя не характеризуют и не нужны

Разумеется это шиза ерунда, однако есть в этом утверждении разумное зерно - может попасться оче хуевый или наоборот хороший сид в котором реальные недостатки не проявятся а косяки исходной модели SD будут приняты за проблемы с лорой. Поэтому делаем всегда несколько штук с разными промтами и/или заказываем несколько генераций сразу.

После задания промта и параметров, включем аддон, выбираем (любую) модель и мотаем в самый низ в скриптах выставляя X/Y/Z plot. По одной из осей выставляем AddNet Model и в строке через запятую перечисляем нужные модели, по другой AddNet Wight и выставляем интервал весов, запускаем генерацию.


Imgur


В случае ошибки при задании параметров генерация не запустится

ищите ошибке в консоле

Грид


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

Качество лор

Если почитать различные ресурсы, где обсуждаются аи-генерации, можно встретить смехуечки и общие слова о низком качестве большей части лор, что выкладывают пользователи на популярных ресурках, наподобии https://civitai.com/. Или, возможно, вы и сами замечали что при применении некоторых из них куда-то уплывает стиль, ломается фон, глаза и лица первращаются в кашу, вместо задуманного промтом генерируется непонятно что. Разумеется, причиной этого является сама используемая лора, а вызвано это может быть плохим датасетом, неподходящими настройками обучения или несовместимостью с используемой моделью SD.
Также, проблемы могут проявиться, например, при одновременном использовании нескольких лор, или же в том, что отдельные детали персонажа воспроизводятся не так как хотелось бы. Например, если внимательно поиграться с лорой Шимки из гайда, то можно заметить проскакивающие ошибки с ее бровями (другой цвет, форма, дублирование) и воспроизведение прекрасного андербуба на оригинальном костюме лишь в ~30% случаев. Повесть о том как решать эти проблемы, а также некий разбор параметров обучения с большим числом примеров не только на персонажа будет позже, при удачном стечении обстоятельств. Поучаствовать в обсуждении того что туда попадет ты можешь уже сейчас, заглянув в технотред.

За сим все, вопросы задавай в тред. По успеху не забудь запостить свои мастерписи в nai-тред, параллельно вознося почести местным кемономими-богиням.

Edit
Pub: 04 Nov 2023 14:00 UTC
Edit: 05 Nov 2023 16:14 UTC
Views: 1063