Гайд по LoRA

by anon последнее обновление: 12.01.2023


Содержание


Что это

LoRA (Low-rank Adaptation for Fast Text-to-Image Diffusion Fine-tuning), согласно официальному репозиторию — метод файн-тьюнинга Stable Diffusion чекпоинтов, который имеет следующие особенности:

  • вдвое быстрее чем метод DreamBooth;
  • маленький размер выходного файла;
  • результаты иногда лучше, чем у традиционного файн-тьюнинга.

Требования для успешной работы: видеокарта Nvidia, не меньше 6Гб видеопамяти.


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

На данный момент есть два способа использования сети LoRA:

  1. Использовать в качестве дополнительных весов "на лету"
  2. Замерджить вместе с SD чекпоинтом

Способ 1

Установить расширение от kohya-ss для A1111-webui.
По умолчанию файлы сетей хранятся в папке stable-diffusion-webui\models\lora\
Пользоваться просто:

1. Открыть новую панель 2. Включить, выбрать модель, настроить веса по вкусу

Способ 2

Установить расширение от d8ahazard для A1111-webui.
Для начала нужно переименовать файл сети <name>.safetensors в <name>.pt, поместить его по пути stable-diffusion-webui\models\lora\, затем:

1. Открыть новую вкладку 2. Открыть вкладку Settings, нажать чекбокс Use LORA
3. Перейти на вкладку Create, выбрать чекпоинт, выбрать сеть слева и нажать Create Model

Опыт анона

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


Подготовка к тренировке

  1. Клонировать репозиторий sd-scripts от kohya-ss или скачать его
  2. Скачать скрипт (именно через него мы будем запускать тренировку)

PowerShell

Данный скрипт предназначен для PowerShell, но это не значит что он доступен только пользователям последних версий Windows. Не все знают, но PowerShell доступен для всех версий Windows начиная с XP, на Linux, а также на macOS).

  1. Открыть PowerShell и поочерёдно выполнить следующие команды:
    cd <путь к папке sd-scripts>
    
    python -m venv --system-site-packages venv
    .\venv\Scripts\activate
    
    pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116
    pip install --upgrade -r requirements.txt
    pip install -U -I --no-deps https://github.com/C43H66N12O12S2/stable-diffusion-webui/releases/download/f/xformers-0.0.14.dev0-cp310-cp310-win_amd64.whl
    
    cp .\bitsandbytes_windows\*.dll .\venv\Lib\site-packages\bitsandbytescp .\bitsandbytes_windows\cextension.py .\venv\Lib\site-packages\bitsandbytes\cextension.py
    cp .\bitsandbytes_windows\main.py .\venv\Lib\site-packages\bitsandbytes\cuda_setup\main.py
    
    accelerate config
    
  2. После последней команды терминал начнёт задавать вопросы, выбрать следующее:
    In which compute environment are you running?
    - This machine
    Which type of machine are you using?
    - No distributed training
    Do you want to run your training on CPU only (even if a GPU is available)?
    - NO
    Do you wish to optimize your script with torch dynamo?
    - NO
    Do you want to use DeepSpeed?
    - NO
    What GPU(s) (by id) should be used for training on this machine as a comma-seperated list?
    - 0 или all
    Do you wish to use FP16 or BF16 (mixed precision)?
    - fp16

Если PowerShell сыпет ошибками при нажатии на стрелочки

Выключить NumLock на клавиатуре, выбирать варианты при помощи кнопок 8 и 2 на нампаде


Тренировка

  1. Создание датасета
    Датасету необходима определённая структура папок:

Пример структуры папок Пример структуры папок

Где n – количество повторений данного концепта; conceptA, conceptB – имена концептов. Имя концепта может быть любое, оно нигде не используется (кроме особого случая, см. Важные замечания), это скорее заметка для вас, что в этой папке находится. Между количеством повторений и именем концепта обязательно наличие нижнего подчеркивания. Внутри каждой папки концепта должны присутствовать изображения вместе с файлами описания в формате *.txt, их имена должны совпадать. Внутри текстовых файлов должно быть, собственно, описание. Папок концептов может быть сколько угодно, но хотя бы одна должна присутствовать. Обрезать изображения необязательно.
Пример хорошего датасета

Важные замечания

Если у файла image.png не будет соответствующего image.txt, скрипт выдаст ему описание в виде имени концепта. Например, если папка концепта называется 6_photo, будет считаться, что у файла image.png описание photo.
Поддерживаемые форматы изображений: *.jpg, *.png, *.webp. Смотрите чтобы не попался *.jpeg.

Совет №1

Если тренируете на основе аниме моделей (NAI, AnythingV3), описание делать строго в стиле Danbooru/Gelbooru тэгов. Например, 1girl, short hair, green eyes, black hair, school uniform...
Если тренируете на основе SD 1.x/2.x, в описаниях пишите что вы видите на изображении. Например, если изображение – рисунок бородатого рыбака за работой, пишите pencil art of a man fishing, beard; если это фото вашего улыбающегося друга в очках и красной рубашке на фоне заката, пишите photo of friend_name, smiling, wearing glasses, red shirt, sunset in the background)

Совет №2

Если тренируете персонажа/человека, желательно чтобы датасет состоял только из изображений, где он присутствует. И чтобы во всех описаниях было ключевое слово, описывающее этого персонажа/человека. Например, 1.txt: photo of AndrewFriend, jacket, jeans; 2.txt: photo of AndrewFriend, shorts, t-shirt. Вызывать вы данного человека в промте будете соответственно через тег AndrewFriend. Тоже самое работает и для аниме моделей – в этом случае это будет имя персонажа. Например, 1girl, shiina mayuri, short hair, green eyes и т.д. Вызов через shiina mayuri соответственно.
Если тренируете авторский стиль, как и в предыдущем абзаце желательно чтобы датасет состоял только из изображений, нарисованных данным автором. Пример описания: ArtistNameStyle, mountains, night, moon, snowy peaks, stars и т.д. Вызов стиля художника через ArtistNameStyle.

Повторения нужны чтобы придать больше веса той или иной папке. Например, у вас есть папка 2_HighRes с 20 изображениями внутри и папка 1_LowRes с 10 изображениями внутри. Суммарно это даст 50 (2 * 20 + 1 * 10) изображений, и нейронная сеть будет обучаться 80% (2 * 20 / 50) времени на первой папке и 20% (1 * 10 / 50) времени на второй, тем самым уменьшая влияние папки с низкокачественными изображениями.

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

Как с ними работать

Например, если вы тренируете лицо человека (мужчины) и в каждом файле описания есть слова photo of a PersonName, хорошей идеей будет открыть WebUI и нагенерировать изображений по запросу photo of a man. Сколько? Не меньше чем количество изображений лица мужчины из примера.

  1. Редактирование скрипта
    Открыть скрипт любым текстовым редактором и изменить переменные вверху файла под свои нужды. Все переменные достаточно понятно прокоментированы, поэтому пройдёмся по не самым очевидным из них:
    1
    2
    3
    4
    5
    6
    $learning_rate = 1e-4
    $train_batch_size = 1
    $num_epochs = 10
    $network_dim = 128
    $max_token_length = "None"
    $clip_skip = 1
    

$learning_rate: значение 1e-4 рекомендовано для чекпоинтов, основанных на SD 1.x. Для 2.x – непонятно, кто-то говорит что получил ужасные результаты с такими настройками. Но у меня получались достойные лица и на рекомендованных настройках.
$train_batch_size: при увеличении данного значения, вероятно также требуется увеличение $learning_rate.
$num_epochs: больше эпох = больше времени на тренировку, но большое значение не обязательно сделает сеть лучше. В определенный момент тренировки точность практически перестанет расти, поэтому ставить безумно большое значение не имеет смысла. Можно начать с 3. Рекомендую в первый раз оставить значение 10, изменить значение $save_every_n_epochs на 1, значение $save_last_n_epochs на 999 и после окончания тренировки протестировать все 10 эпох на одном сиде, чтобы посмотреть, сколько их примерно нужно.
$network_dim: значения могут быть разные (видел кто-то тренировал на 1024), но было установлено, что выше 128/256 особого смысла лезть нет.
$max_token_length: откройте свой самый большой файл описания, скопируйте его содержимое и поместите в промт WebUI. Справа на счетчике отобразится длина токена. Если меньше 75, можно оставить "None". Если больше 75 – ставьте 150. Если больше 150 – ставьте 225. Значений больше нет.
upd. У меня значение "None" почему-то стало выдавать ошибку.
$clip_skip: 1 для SD-основанных чекпоинтов, 2 для NAI-основанных.

  1. Запуск скрипта

Если не открывается по двойному щелчку

В папке со скриптом ПКМ в свободном месте -> "Открыть в Терминале" -> ввести .\train_network.ps1 и нажать Enter.

Решение проблем

Q: Какие-то проблемы с CUDA.
A: Вероятно не установлен CUDA Toolkit.

Q: У меня карточка 10-й серии и у меня вываливает ошибку при запуске тренировки. Что делать?
A: Скачать альтернативные библиотеки cuda, файл libbitsandbytes_cudaall.dll переименовать в libbitsandbytes_cuda116.dll, поместить по пути sd-scripts\venv\Lib\site-packages\bitsandbytes\ с заменой.

Q: Не работает расширение для подгрузки сетей.
A: Проверьте, чтобы не было аргумента --lowvram в webui-user.bat. С ним пока не работает.

Edit
Pub: 12 Jan 2023 02:29 UTC
Edit: 12 Jan 2023 06:32 UTC
Views: 1696