Дообучение модели через LoRA: что нужно, сколько времени и денег
Готовая модель отвечает грамотно, но не так, как надо: путает вашу терминологию, отвечает слишком общо, не держит нужный формат. Первая мысль - дообучить её на своих данных. Мысль правильная, но не первая по очереди: в половине случаев задача решается без обучения, а из оставшейся половины почти всё закрывается лёгким дообучением на одной видеокарте.
Разберём, когда дообучение действительно нужно, чем LoRA отличается от полного обучения, сколько потребуется данных и памяти, за какое время и деньги это делается и как понять, что результат получился.
Сначала три способа, и обучение среди них последний
Промпт. Подробная инструкция с примерами прямо в запросе. Меняется за минуты, ничего не стоит, откатывается мгновенно. Закрывает большинство задач про тон, формат и структуру ответа.
Поиск по своим документам. Модель не знает вашей базы знаний, но её можно подмешивать в запрос: нужные куски документов находятся поиском и подставляются в контекст. Это правильный способ дать модели знания, потому что знания меняются, а переобучать модель на каждое изменение прайса никто не будет.
Дообучение. Меняет поведение модели на уровне весов. Нужно, когда первые два способа упёрлись: модель стабильно не держит формат, инструкция раздулась до страницы, или нужен узкий стиль и терминология, которую в инструкции не объяснить.
Ключевое правило, которое экономит недели: знания добавляют поиском, поведение - дообучением. Попытка вложить в модель свежие факты через обучение приводит к тому, что модель уверенно повторяет устаревшее.
Чем LoRA отличается от полного дообучения
Полное дообучение меняет все веса модели. В память при этом нужно положить не только сами веса, но и градиенты с состояниями оптимизатора, поэтому требования вырастают примерно в три-четыре раза относительно обычного запуска. Для модели на 7 миллиардов параметров это уже десятки гигабайт сверх обычного.
LoRA идёт другим путём: базовые веса замораживаются, а рядом обучаются небольшие добавочные матрицы. Их размер - доли процента от модели. Отсюда три следствия:
- Памяти нужно немногим больше, чем для инференса. Дообучение 7B помещается в одну карту, а не в стойку.
- Результат весит десятки мегабайт, а не десятки гигабайт. Адаптеров можно держать несколько под разные задачи и переключать.
- Базовая модель остаётся нетронутой, откатиться можно в любой момент.
Есть и более экономный вариант, когда базовая модель держится в памяти квантованной, а адаптеры обучаются поверх. Это позволяет дообучать модели, которые в полной точности в карту не влезли бы. Как считать нужный объём памяти, разобрано в статье сколько видеопамяти нужно для нейросети.
Для подавляющего большинства прикладных задач полное дообучение не нужно вовсе.
Что понадобится
Данные. Набор пар вида запрос и правильный ответ, оформленных так же, как модель будет использоваться в бою. Это главный пункт, к нему вернёмся отдельно.
Базовая модель. Открытая модель подходящего размера. Здесь работает правило: хорошо дообученная модель поменьше обычно полезнее универсальной большой. Она дешевле в эксплуатации и отвечает быстрее.
Карта с достаточной памятью. Для LoRA на моделях до 7-8 миллиардов параметров хватает одной карты. Дальше растёт вместе с размером модели.
Root-доступ на сервере. Версии библиотек в этой области меняются каждый месяц, и ставить окружение придётся своё, см. что такое root-доступ.
Данные решают больше, чем настройки
Здесь и находится вся работа. Гиперпараметры подбираются за полчаса, данные готовятся неделями, и именно от них зависит результат.
Сколько нужно. Для стиля и формата ответа часто хватает нескольких сотен хороших примеров. Для узкой предметной области счёт идёт на тысячи. Больше не всегда лучше: тысяча вычищенных примеров даёт результат заметно лучше, чем десять тысяч собранных как попало.
Каким должен быть пример. Ровно таким, какой ответ вы хотите получать в проде. Модель копирует то, что видит: если в обучающих ответах встречается вода и оговорки, она научится воде и оговоркам.
Что убрать из набора. Дубли, противоречия, примеры с ошибками, персональные данные. Противоречивые примеры особенно вредны: модель получает два разных правильных ответа на один вопрос и учится непредсказуемости.
Отложить часть. Небольшую долю примеров откладывают и в обучении не используют - на них потом проверяют результат. Без этого оценить, стало лучше или хуже, невозможно.
Настройки, которые действительно влияют
Крутить всё подряд не нужно, значимых параметров немного.
| Параметр | Что делает | С чего начать |
|---|---|---|
| Ранг адаптера | Ёмкость обучаемой части | Небольшой, увеличивать при нехватке |
| Скорость обучения | Насколько сильно модель меняется за шаг | Значение по умолчанию из примеров |
| Число проходов | Сколько раз модель увидит данные | Один-два, дальше растёт переобучение |
| Длина примера | Сколько текста помещается в один пример | По реальной длине ваших запросов |
Главный риск - переобучение: модель начинает дословно воспроизводить обучающие примеры и хуже работает на всём остальном. Признак простой: на отложенной выборке качество падает, хотя на обучающей растёт. Лечится меньшим числом проходов и большим разнообразием данных.
Сколько времени и денег
Считать удобно от часа аренды, потому что карта нужна не постоянно, а на время эксперимента.
Порядок величин для модели на 7-8 миллиардов параметров и набора в несколько тысяч примеров: один прогон занимает часы, а не дни, на одной современной карте. Значит стоимость одного эксперимента при почасовой оплате измеряется сотнями рублей, а не десятками тысяч.
Важно закладывать, что прогон будет не один. Обычная схема: первый запуск на маленькой выборке, чтобы поймать ошибки в данных и коде, затем два-три полноценных с разными настройками. Даже с запасом это остаётся дешевле, чем покупка карты ради задачи, которая может не повториться - расчёт окупаемости разобран в статье купить видеокарту или арендовать GPU.
Почасовая аренда здесь и нужна: карта занята ровно то время, пока идёт обучение, см. почасовая оплата.
Как понять, что получилось
Цифры функции потерь во время обучения говорят мало. Проверять надо на задаче.
- Отложенная выборка. Прогнать примеры, которых модель не видела, и сравнить с эталонными ответами.
- Сравнение с исходной моделью. Обязательный шаг: базовая модель с хорошим промптом иногда оказывается лучше дообученной. Это нормальный результат эксперимента, а не повод считать работу неудачной.
- Ручная проверка. Полсотни ответов, прочитанных глазами, находят то, что не видит ни одна метрика.
- Проверка на общих вопросах. Дообучение может испортить то, что модель умела раньше. Если после обучения она разучилась отвечать на обычные вопросы, набор был слишком узким.
Что делать с готовым адаптером
Результат - файл с обученными матрицами. Дальше два пути.
Держать отдельно. Адаптер подключается к базовой модели при запуске. Удобно, когда адаптеров несколько под разные задачи, и позволяет мгновенно вернуться к исходной модели.
Слить с моделью. Адаптер встраивается в веса, получается самостоятельная модель. Немного быстрее в работе и проще в развёртывании, но откатиться уже нельзя.
Для боевого сервиса дообученную модель разворачивают так же, как любое приложение: процесс под управлением службы, обращения через локальный порт, наружу веб-сервер. Порядок разобран в статье как выложить приложение на сервер.
Частые ошибки
Дообучают вместо поиска по документам. Модель не запоминает факты надёжно и не умеет их обновлять. Знания подмешивают в контекст, а не вшивают в веса.
Начинают с обучения, минуя промпт. Часть задач решается инструкцией за вечер. Проверять это надо до аренды карты.
Собирают данные как попало. Противоречивые и грязные примеры дают модель, которая ведёт себя непредсказуемо, и понять причину потом крайне сложно.
Не откладывают проверочную выборку. Оценивать результат оказывается не на чем, остаётся полагаться на ощущения.
Не сравнивают с исходной моделью. Без базовой точки невозможно сказать, что дообучение вообще что-то улучшило.
Берут модель побольше на всякий случай. Модель вдвое больше требует вдвое больше памяти и дороже в эксплуатации круглосуточно, а выигрыш на узкой задаче часто нулевой.
Частые вопросы
Чем LoRA отличается от полного дообучения? При LoRA основные веса заморожены, обучаются только небольшие добавочные матрицы. Памяти нужно немногим больше, чем для обычного запуска, а результат весит десятки мегабайт вместо десятков гигабайт.
Сколько данных нужно для дообучения? Для стиля и формата ответа - несколько сотен качественных примеров. Для узкой предметной области - тысячи. Чистота набора важнее его размера.
Сколько памяти нужно для LoRA? Немногим больше, чем для инференса той же модели. Для моделей до 7-8 миллиардов параметров достаточно одной карты, особенно если база держится квантованной.
Сколько времени занимает обучение? Для модели такого размера и набора в несколько тысяч примеров - часы на одной карте. Закладывайте несколько прогонов: первый почти всегда выявляет проблемы в данных.
Можно ли дообучением добавить модели знания? Ненадёжно. Факты лучше подмешивать в контекст поиском по документам: их можно обновить в любой момент, а переобучать модель ради изменившегося прайса бессмысленно.
Что делать, если после дообучения стало хуже? Сравнить с исходной моделью на отложенной выборке, проверить набор на противоречия и дубли, уменьшить число проходов. Ухудшение на общих вопросах означает, что данные были слишком узкими.
Нужно ли покупать карту для дообучения? Как правило нет. Обучение идёт часами и не каждый день, поэтому почасовая аренда обходится дешевле покупки на всём горизонте актуальности карты.
Нужна карта под дообучение? GPU-серверы с RTX 4090 на 48 ГБ - почасовая оплата от 149 руб, конфигурации под инференс, LoRA и полноценное обучение. Полный root-доступ: ставите свой стек CUDA и PyTorch без ограничений.