Мне уже давно было интересно, насколько геморройно сейчас тренить лоры для условного Illustrious ручками, без сервисов, по логичной причине — это же бесплатно. И вот, наконец, дошли руки, я сел и постарался разобраться. И ниже я попробую поделиться опытом и рассказать об ошибках.
Для начала об источнике. Я пошёл, наверное, одним из самых болезненных путей — хотелось всё же оригинальности, поэтому я нашёл в закоулках памяти штуку, по которой я видел лишь одну крошечную лору, лишь на одного персонажа, в остальном на условном civit.ai пусто и ничего нет. Так что, да, вместо классического "мы ограбим *бору, слив все теги в датасет, и пойдём тренировать" пришлось:
- скринить само аниме и потом размечать
- чтобы увеличить хоть немного датасет, найти CG игры, по которой сделано аниме и взять часть данных оттуда (и тоже разметить!).
Меня хватило лишь на 70 изображений, дело прошло страшно медленно и нудно. Это мало: из репозитория kohya_ss для обучения кафтану потребовалось 31 изображение, а здесь - 4 персонажа, да ещё и на некоторых скриншотах они по двое-трое, да ещё и в двух вариациях.
Сразу отмечу, что ошибки при этом были. Их стоило исправить следующим образом.
- Было бы неплохо попробовать поапскейлить к типичному разрешению, покропать-подвигать картинки, чтобы расширить датасет и улучшить результаты. Я, в конечном итоге генерил изображение в том же разрешении, что и данные из датасета и это прокатило. Но за условные 1024х1024 ручаться трудно, скорее всего, всё разъедется.
- Хорошо было бы расширить датасет за счёт вариантов с удалённым фоном и хотя бы какого-никакого фанарта. Но, последнее не наш случай — история древняя и ужасно обскурная.
- Можно было бы заставить какого-нибудь гопатыча частично разметить, может быть это и сократило бы время.
Теперь, что касается самого kohya_ss. Я брал его отсюда и оно вполне рабочее по мануалу завести удалось, но необходимо учесть следующее.
- Установка питона может подломать вам встроенный питон в автоматике (лечится выпиливанием питона из PATH).
- cuDNN у меня не завёлся для питона — не удалось постановить nvidia-pyindex, потому что оно где-то там внутри себя не смогло раскодировать конфигурационные файлы. Это опциональное требование, хоть и должно было ускорить обучение. Жаль, в конечном итоге я так и наплевал на эту библиотеку и пошёл дальше.
Сам интерфейс представляет довольно сильную боль — он ОГРОМЕН. И те настройки, которые придётся менять по условному гайду размазаны где попало, вплоть до того, что есть целое issue, отвечающее на вопрос "а куда мне писать --network_train_unet_only?. Сейчас довольно сообразительные ребята скажут — ну, наверное, интерфейс подскажет, что же заполнено неверно в виде сообщения? Держите карман шире — в него полетят исключения из питона в консоли! Да, там есть валидация, но результаты показываются в консоли, и после того, как простая валидация пройдёт, за дело принимается pyTorch и у него своё мнение, насколько правильно вы заполнили форму. Здесь есть одна особенность, которая мне усложняла путь — а именно, что по какой-то причине интерфейс откуда-то сам достаёт лишние и кривые значения и их надо стирать руками. Например, в моём случае он пытался продолжить тренировку из несуществующего чекпойнта, и помогло стирание соответствующего поля. Ещё о датасете — если вы берёте туториал для него из EDG, то сто́ит учесть, что в папке датасета скрипты ищут не папку IMG, а пресловутую папку в формате "<число_эпох>_<имя>". Ну и CosineAnnealingLR у меня не заработал — я просто взял встроенный модуль и стёр соответствующее поле. В итоге борьба с нейросетевой бюрократией заняла 1-1,5ч.
Само обучение прошло за 9ч на 30 эпох (где-то 17-18 минут на каждую). Это сильно напомнило как на втором курсе, я ручками тренил перцептрон: так же всё делится по эпохам, процесс показывает средние потери (0,125 в начале, ~0.086 в конце). Получилось ли хоть что-то, стоило ли обучение лоры миллиарда испарённых лично моим компом рек и сотен высохших рыбок? Покажу результаты ниже.
Нет, этих картинок не было в датасете (вес лоры - ~0.6, ~0.8).
По меркам качества - слабо, но работает. Я виню, конечно, датасет и свою некоторую леность в его составлении — исправив ошибки выше, можно было добиться результатов лучше, но в целом это довольно ок. Как мне кажется, если попробовать накинуть условные Hires.fix, ADetailer и прочее, то можно улучшить результат, но — терпимо.
Пойдёт ли эта лора на civit.ai? Ну разве что кто-то попросит. Пока не вижу особого смысла.




Комментариев нет:
Отправить комментарий