Fine-tuning и веса · Fine-tuning and weights · урок 6 · 14 мин
Оценка, merge и serving дообученной модели
Evaluating, merging and serving a fine-tune
Зачем
После урока ты докажешь, что дообученная модель лучше базовой и не опаснее её, решишь, вливать adapter в веса или держать отдельно, и поднимешь несколько adapters на одной базе в vLLM. На собеседовании это вопросы «how do you prove the fine-tune is better?» и «how do you roll back a bad adapter in ten minutes?».
Сначала критерий, потом цифры
Порядок, который показывает зрелость: 1. Baseline (точка отсчёта) — базовая instruct-модель с лучшим prompt, а для фактических задач ещё и с RAG (поиском документов и подстановкой их в context). Fine-tune обязан обыграть именно его, а не голую базу. 2. Критерий выпуска записан владельцем продукта до прогона: например, «формат ≥ 98 %, ни одного нового провала безопасности, ни один язык не хуже baseline больше чем на 1 пункт». 3. Held-out test (запечатанный набор) — новые обращения, пришедшие после сбора обучающих данных, разбитые по клиенту. Иначе ты измеряешь память, а не обобщение.
Что мерить
| Свойство | Чем мерить |
|---|---|
| Формат, вызов tools, суммы | код: валидатор JSON, сверка аргументов, точное совпадение |
| Тон, полезность | LLM-as-judge (модель-оценщик), сверенный с людьми по Cohen's κ (согласие с поправкой на случайность) |
| Каждый язык | отдельная строка отчёта, не среднее |
| Общие умения | регрессионный набор: benchmarks (стандартные наборы тестов) знаний, математики, следования инструкциям |
| Безопасность | safety suite как жёсткий gate, не слагаемое среднего |
| Запоминание | canary-строки и проверка дословных продолжений |
Пояснения к трём строкам. Средняя прячет меньшинство: общий плюс 2 пункта может скрывать минус 5 в казахском. Регрессия общих умений реальна даже при удачном обучении: в карточке казахской модели ISSAI (открыта 10.10.2026) KazCulture вырос 60,3 → 68,7, а английский MMLU упал 91,2 → 89,3. Для открытых benchmarks удобен lm-evaluation-harness от EleutherAI: adapter подключается добавкой peft=ПУТЬ к --model_args, так что база и fine-tune меряются одной командой. Ноль провалов читают честно: по правилу трёх 0 провалов из n независимых разнообразных попыток дают верхнюю границу частоты около 3/n с 95 % уверенностью; 0 из 300 — это «не чаще 1 %», а не «безопасно».
Ещё две строки таблицы требуют техники. Judge (модель-оценщик) сам ошибается и меняется от прогона к прогону, поэтому сначала его оценки сверяют с оценками людей на размеченной выборке ответов, а базу и fine-tune оценивают в одном прогоне одним и тем же judge. Если judge из того же семейства, что и модель, которая писала синтетические обучающие данные, он склонен хвалить «свой» стиль; тогда берут judge другого семейства. Запоминание проверяют так: до обучения вкладывают в train несколько уникальных выдуманных строк (canary), после обучения дают модели их начало и смотрят, допишет ли она остальное; плюс дают начала реальных обучающих записей и ищут дословные продолжения. Дописала canary — модель запоминает, и redaction (удаление персональных данных) надо проверять строже.
Наконец, шум. Выигрыш 3 пункта на 100 задачах по одному прогону может быть случайностью. Убедительно: повторные прогоны на тех же задачах, сравнение по парам задач, выигрыш в каждом языке.
Условный пример решения
| Метрика | Baseline | Fine-tune |
|---|---|---|
| Валидный формат | 91 % | 99 % |
| Тон, judge, 1–5 | 3,6 | 4,2 |
| Русский, точность задачи | 88 % | 90 % |
| Казахский, точность задачи | 79 % | 74 % |
| Safety, провалы | 0 из 300 | 0 из 300 |
| Общие умения | 71 % | 70 % |
Среднее выросло, формат и тон лучше. Но казахский упал на 5 пунктов, а критерий допускал минус 1. Решение — не выпускать: смотреть, сколько казахских примеров было в train, и чинить данные, а не модель.
Merge или отдельный adapter
В PEFT merge_and_unload() вливает B·A в W: получается обычная модель, без накладных расходов adapter при inference (работе на запросах). Метод не меняет модель на месте — результат нужно присвоить переменной — и не хранит веса adapter. Если нужно потом отменить слияние, используют merge_adapter() и unmerge_adapter(). На квантованной базе документация PEFT предупреждает: «unmerging is not exact», потому что слияние заново квантует веса. Поэтому adapter после QLoRA обычно вливают в 16-битную базу, а уже потом квантуют для serving (обслуживания запросов) в GGUF или AWQ (форматы и методы сжатия весов для inference). И оценку повторяют на том артефакте, который реально будет отвечать клиентам: merged и квантованная модель — уже не та, что прошла тест с adapter.
Держать adapter отдельно тоже можно: load_adapter() и set_adapter() переключают их на одной базе, add_weighted_adapter() смешивает несколько (методы linear, svd, ties и другие).
| Merged | Отдельные adapters | |
|---|---|---|
| Скорость | максимальная, без добавки | небольшие накладные расходы на добавку |
| Хранение | полная копия на версию (8B в bf16 — 16 ГБ) | одна база + adapters по десяткам МБ |
| Много задач на одной GPU | нет | да |
| Откат | переключить на прежний артефакт | переключить adapter, база не меняется |
Serving: vLLM multi-LoRA
vLLM (сервер inference с высокой пропускной способностью) обслуживает много adapters на одной базе (документация открыта 10.10.2026):
vllm serve Qwen/Qwen3-8B \
--enable-lora \
--lora-modules style-v1=./adapters/style-v1 style-v2=./adapters/style-v2 \
--max-lora-rank 16
Клиент выбирает adapter полем model в обычном запросе: "model": "style-v1". Флаг --max-lora-rank ставят равным наибольшему рангу среди adapters: большее значение тратит память впустую. Есть и max_loras (сколько adapters одновременно в одном batch) и max_cpu_loras (сколько держать в кэше в памяти CPU). Есть загрузка на ходу через /v1/load_lora_adapter при VLLM_ALLOW_RUNTIME_LORA_UPDATING=True, но документация предупреждает: «It should not be used in production unless it is an isolated, fully trusted environment».
Выпуск и откат
Каждая дообученная модель — новая запись в реестре: хэш весов базы, версия adapter, хэш набора данных, конфигурация обучения, отчёт оценки, model card (паспорт модели: назначение, данные, ограничения). Выкатка идёт через shadow (новая версия отвечает параллельно, но клиенту не показывается) и canary (малая доля трафика) с порогами по каждому языку. Каждый ответ в журнале несёт идентификатор модели и adapter, чтобы через месяц доказать, какая версия ответила клиенту. Откат — переключить на прежний adapter, и его репетируют заранее, а не изобретают во время инцидента.
Схема
Термины · Key terms
- baseline
- базовая модель с лучшим prompt, с которой сравнивают fine-tune
- held-out test
- запечатанный набор новых примеров для итогового решения
- regression suite
- набор тестов общих умений, ловящий просадку после обучения
- safety gate
- порог безопасности, один провал которого блокирует выпуск
- merge_and_unload
- влить adapter в веса базы и убрать его модули
- multi-LoRA serving
- обслуживание нескольких adapters на одной базе
- lm-evaluation-harness
- инструмент EleutherAI для прогона benchmarks, поддерживает adapters
- shadow deployment
- новая версия отвечает параллельно, без показа клиенту
- canary release
- выпуск на малую долю трафика с автоматическим откатом
- model card
- паспорт модели: назначение, данные, оценки, ограничения
Сделай сам
Напиши на бумаге критерий выпуска для дообученного ассистента с двумя языками, русским и казахским, в пять строк: формат, тон, каждый язык, общие умения, безопасность. Для каждой строки укажи, чем мерить (код, judge, человек) и порог. Затем запиши команду vllm serve для базы с двумя adapters, v1 и v2, и одну фразу: как откатиться с v2 на v1.
Обсуди с тьютором: покажи критерий и спроси, какую строку интервьюер атакует первой; попроси сценарий, где все пять строк зелёные, а выпускать всё равно рано.
Проверь себя · ответ под вопросом
1Почему fine-tune сравнивают с «база + лучший prompt», а не с голой базой?
2Что значит 0 провалов безопасности из 300 попыток?
3Зачем оценивать модель повторно после merge и квантования?
Interview questions · US / UK
1You fine-tuned a model and the team says it's better. How do you prove it before it goes to customers?
2Scenario: we shipped a new tone adapter; two weeks later complaints from one language group double while offline scores didn't move. What do you do, in order?
3Would you merge the adapter or serve it separately? How do you roll back in ten minutes?
Ключевые фразы · Say it aloud
- Better than what, at what?Лучше чего и в чём?
- The pass bar is written down before the test.Критерий выпуска записан до теста.
- Score every language separately; the average hides the minority.Каждый язык отдельно: среднее прячет меньшинство.
- Safety is a gate, not part of an average.Безопасность — gate, а не слагаемое среднего.
- I evaluate the artifact I actually serve.Оцениваю именно тот артефакт, который отвечает клиентам.
- Rollback is swapping the adapter.Откат — это смена adapter.
- Every logged answer carries the model and adapter version.Каждый ответ в журнале несёт версию модели и adapter.
Материалы
- vLLM — LoRA Adapters —
--enable-lora,--lora-modules, выбор adapter полемmodel, риски загрузки на ходу (8 мин) - PEFT — LoRA developer guide — разделы про merge,
load_adapter,set_adapter,add_weighted_adapter(10 мин) - EleutherAI lm-evaluation-harness — README: прогон benchmarks для базы и adapter через
peft=(8 мин) - issai/Qwen3.5-35B-A3B-Kazakh — model card — таблица оценок до и после как образец честного отчёта о регрессии (4 мин)