Тонкая настройка — штука коварная. Эту технику советуют направо и налево, а применяют часто не там. Вся разница в том, что именно вы хотите изменить в модели.
Сначала вопрос: нужно ли вообще?
Дообучение меняет поведение: формат, стиль, политику решений, специфику домена. Факты оно учит плохо, потому что факты меняются, а модель — неудобное место для их хранения. Поэтому порядок такой:
- Промпт-инжиниринг. Если длинный системный промпт с тремя примерами решает задачу — всё, дело сделано. И завтра вы можете передумать без переобучения.
- Retrieval для знаний. Всё, что должно быть актуальным, цитируемым или проверяемым, — в контекст, а не в веса.
- Дообучение для консистентности, стиля и сжатия. Когда желаемое поведение требует 2000 токенов инструкций и всё равно соскальзывает — обучение надёжнее и дешевле на каждый вызов.
- Дообучение для перехода в меньший класс. Настроенная маленькая модель, которая на одной узкой задаче не уступает большой, — это главный экономический аргумент.
Перед тем как начинать, проверьте лицензию базовой модели. Некоторые лицензии накладывают требования к именованию или атрибуции производных, некоторые запрещают использовать выходы для обучения других моделей. Дообучение не может дать прав, которых не было у базы.
Сколько памяти стоит обучение
От этого зависит весь подход. Для полного дообучения с Adam и смешанной точностью нужно примерно 16 байт на параметр, ещё до активаций. Для 8B модели это 128 гигабайт — нужен мульти-GPU сервер. LoRA на 16-битной базе: 16 гигабайт на замороженную базу, меньше гигабайта на адаптеры. QLoRA — 4 гигабайта на базу в 4-битном формате, плюс несколько гигабайт на адаптеры и активации. Вся настройка 8B модели помещается на одну карту с 24 гигабайтами.
| Подход | Память для 8B | Что обучается | Когда использовать |
|---|---|---|---|
| Полное дообучение | ~128 GB | все веса | большой кластер, сложная задача, максимум качества |
| LoRA (16-bit база) | ~16 GB + <1 GB | адаптерные матрицы | почти всегда для стиля, формата, узких задач |
| QLoRA (4-bit база) | ~4 GB + несколько GB | то же | одна карта 24 GB, ограниченные ресурсы |
Именно поэтому почти все дообучения вне больших лабораторий делаются через LoRA. Low-rank adaptation замораживает базу и тренирует пару маленьких матриц рядом с выбранными весами. Количество обучаемых параметров падает на порядки, а с ними — и состояние оптимизатора. Для описанных выше поведенческих задач результат обычно неотличим от полного дообучения.
Данные — это и есть проект
Здесь вы проведёте большую часть времени, и подозрительно, если план этого не предполагает. Несколько сотен отличных примеров регулярно бьют десятки тысяч посредственных, потому что модель учит то распределение, которое вы ей показали, включая ваши несостыковки.
- Точно совпадайте с боевым форматом. Тот же системный промпт, те же роли сообщений, тот же шаблон чата. Модель, обученная на одном обрамлении и обслуживаемая в другом, обучена работе, которую ей не дадут.
- Будьте безжалостны к консистентности. Половина примеров с одним порядком ключей в JSON, половина с другим — вы научили модель непоследовательности. Противоречия в данных становятся дисперсией в выходе.
- Делите выборку правильно. Разделите до того, как смотреть. Если несколько примеров из одного документа или одного клиента — они должны оказаться по одну сторону разреза, иначе оценка меряет утечку.
- Включайте границы. Отказы, уточнения, обработку битого ввода. Датасет из одних успешных кейсов даст модель, которая не умеет отказывать.
- Думайте о происхождении данных. Выходы другой модели могут быть ограничены её условиями. Тут вопрос лицензии, технического мало.
Ключевые ручки LoRA
Ранг (rank) задаёт, насколько сильно адаптер может менять модель. 8–16 хватает для большинства работ по стилю и формату; для новой способности поднимайте выше, но быстро упрётесь в убывающую отдачу.
Целевые модули на практике важнее ранга. Только attention — дешёвый дефолт. Добавление MLP-проекций помогает на более сложных адаптациях, но реально дороже по памяти.
Эпох — от одной до трёх. Это территория переобучения. Следите за валидационным лоссом и останавливайтесь, когда он пошёл вверх, а не когда закончился план.
Скорость обучения для LoRA — на порядок выше, чем для полного дообучения. Раннее расхождение обычно значит, что лейтрейт слишком высокий; ничего не меняется — слишком низкий или мал ранг.
Честная оценка результата
Валидационный лосс говорит, что обучение прошло. Он не говорит, что модель стала лучше делать работу. Эти вещи регулярно расходятся.
- Сравнивайте с необученной базой на том же отложенном множестве, с теми же промптами и настройками сэмплирования. Без парного базлайна у вас число, с которым нечего сравнить.
- Проверяйте регрессию вне целевой задачи. Узкая настройка ухудшает общие способности: следование инструкциям, отказы, многоходовую когерентность. Держите небольшое общее множество и прогоняйте каждый раз.
- Сначала проверяйте механические свойства. Валидность схемы, обязательные поля, распределение длины. Обычно они улучшаются заметно — ради этого вы всё и затевали.
- Вы можете выиграть eval и проиграть деплой. Если eval-множество взято из того же узкого среза, что и тренировка, — соберите отложенное множество из другой недели.
Запуск: адаптер отдельно или слитая модель
Два варианта, и выбор имеет операционные последствия.
Адаптер отдельно. Бач-серверы могут один раз загрузить базу и цеплять несколько LoRA-адаптеров, маршрутизируя по запросам. Это удобно, когда дообучений несколько: одна копия базы обслуживает их все. Например, vLLM с флагом --enable-lora и списком модулей, а в запросе указываете, какой адаптер нужен.
Слить и отдать один артефакт. Слияние складывает адаптер в веса и даёт обычный чекпоинт, без поддержки адаптеров в рантайме. Это нужно для локального распространения. Код на Python — merge_and_unload, потом конвертация в GGUF и квантизация.
Одна оговорка при слиянии: если вы тренировались на 4-битной базе, сливайте в 16-битную, а не в квантизованную. Слияние в квантизованную базу складывает два приближения, и результат может быть хуже, чем каждый шаг по отдельности. И прогоняйте оценку на том самом артефакте, который собираетесь обслуживать. Квантизация после слияния — это изменение модели, и единственная версия, качество которой вы знаете, — та, что вы протестировали.
Вывод
Дообучение — не волшебная палочка, а инструмент для изменения поведения. Сначала промпт и RAG, потом дообучение, и почти всегда через LoRA. Большая часть проекта — данные, а не код. И не верьте валидационному лоссу — верьте только сравнению с базой на отложенном множестве и проверке на регрессию.
Комментарии (0)
Войдите, чтобы комментировать.
Пока нет комментариев. Будьте первым.