Fine-tuning и веса · Fine-tuning and weights · урок 6 · 14 мин

Оценка, merge и serving дообученной модели

Evaluating, merging and serving a fine-tune

ТемыFine-tuningEvalsInference и serving

Зачем

После урока ты докажешь, что дообученная модель лучше базовой и не опаснее её, решишь, вливать 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», а не с голой базой?
Голая база занижает планку и преувеличивает выигрыш обучения. Хороший prompt мог дать тот же результат без обучения, и тогда fine-tune — лишняя сложность. Честный baseline — то, что мы выпустили бы без обучения.
2Что значит 0 провалов безопасности из 300 попыток?
По правилу трёх это верхняя граница частоты около 1 % с 95 % уверенностью, если попытки независимы и разнообразны. Это не доказательство безопасности. Для границы 0,1 % нужно около 3 000 попыток.
3Зачем оценивать модель повторно после merge и квантования?
Merged и квантованная модель — другой артефакт, чем база с adapter, прошедшая тест. Квантование и повторное квантование при слиянии меняют веса и могут сдвинуть качество. Оценка должна относиться к тому, что реально отвечает клиентам.

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?
Strong answer: Better than base plus best prompt, against a pass bar written by the owner beforehand; held-out set of new conversations split by customer; crisp checks in code, tone via a judge validated against humans; per-language results; general-ability regression; safety as a hard gate; repeated runs to separate signal from noise.
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?
Strong answer: Contain first by swapping back to the previous adapter; check the version ID in logs to confirm complaints track the new adapter; ask why offline eval missed it (language not scored separately, stale test set); add recent real cases per language to the held-out set; gate the next release with shadow and canary per-language thresholds.
3Would you merge the adapter or serve it separately? How do you roll back in ten minutes?
Strong answer: Trade-off: merged is fastest but a full copy per version; separate adapters share one validated base and allow multi-LoRA serving in vLLM; registry with base hash, adapter version, data hash, eval report; every logged answer carries the version; rollback is a rehearsed adapter switch; re-evaluate whatever artifact you actually serve.

Ключевые фразы · Say it aloud

Материалы