[!NOTE] Автоматический перевод Эта статья была автоматически переведена с оригинальной английской версии.

LLM Файн-тюнинг Руководство: LoRA, QLoRA, DoRA, Unsloth, Axolotl и Деплой

Большинство сбоев файн-тюнинг связаны с ошибками принятия решений. Команда сначала проводит тренировку, чтобы убедиться, что использование подсказок, retrieval, или constrained decoding не позволяет решить проблему; затем оценивает результаты на выборке данных, использованных в тренировке; либо обнаруживает после завершения тренировки, что готовый продукт труден в использовании.

В данном руководстве адаптация рассматривается как эксперимент, имеющий четко определённый путь вывода результатов. Оно начинается с границы принятия решений, затем прослеживает один из вариантов обработки данных, LoRA или QLoRA, оценку эффективности с учётом специфики задачи, экспорт результатов и сервинг.

Кратко: Начинайте тонкую настройку тогда, когда измеренный базовый результат показывает, что изменение поведения модель оправдывает проведение обновления вес. Для корректировки фактов используйте retrieval, а для изменения синтаксиса — constrained decoding. Начинайте с LoRA, если базовая модель модель работает стабильно; при ограничении в виде замороженной вес памяти применяйте QLoRA. Перед тренировкой сохраните набор для оценки, сравните его с ненастроенным базовым вариантом и выберите оптимальный результат деплой перед тем, как окончательно принять тот или иной метод.

Стоит ли вообще выполнять файн-тюнинг?

Прежде чем тратить GPU часов, определитесь с тем, является ли файн-тюнинг подходящим инструментом для решения поставленной перед вами задачи.

Диаграмма принятия решений

Файн-тюнинг против RAG

Файн-тюнинг может влиять на способ, которым модель использует язык домена, однако он представляет собой неэффективный механизм обновления для данных, которые меняются или требуют приведения к конкретным источникам. Retrieval и файн-тюнинг решают разные аспекты этой проблемы и зачастую должны быть интегрированы в одну и ту же систему.

ФункциональностьФайн-тюнингRAG (Retrieval — усиленное генерирование)
Основная функцияИзменяет внутренние параметры веса с целью формирования определённых навыков, стилей или поведенческих паттерновПредоставляет внешний, актуальный контекст в момент инференс
Подходит для• Специфические стили ведения диалога
• Выполнение сложных инструкций
• Работа в узкоспециализированных областях ризонинг
• Данные с высокой скоростью изменения (новости, котировки акций)
• Снижение галлюцинации (граундинг)
• Указание источников
Обработка знанийИзменяется статистическое поведение в веса; точная воспроизводимость результатов не гарантируетсяЗагружает записи или фрагменты текста, которые можно обновить и процитировать
Частота обновленияТребуется переобучение для внесения обновленийМгновенно обновляется при добавлении новых документов

Файн-тюнинг против промпт-инжиниринг

Современные LLMs хорошо реагируют на чёткие промпты и примеры. Перед тем как вкладывать средства в файн-тюнинг, обязательно протестируйте эти варианты.

АспектФайн-тюнингПромпт-инжиниринг
Стоимость настройкиВысокий (кураторство данных, GPU вычисления, итерации)Низкая степень (итеративная отладка промпт)
ГибкостьТребуется дополнительный цикл обучения и выпуска модели.Изменения, связанные с промпт
Формат/стильМожно повысить вероятность возникновения повторяющегося поведения.Часто достаточно для форматирования стиля и простых форматов.
ЛатентностьМожно сократить повторяющиеся инструкции.Это зависит от длины промпт и механизма кэширования поставщика.
Подходит дляСложное поведение, дистилляция, затраты при масштабированииБыстрая итерация и постоянные изменения требований

[!TIP] Сначала попробуйте сформулировать запрос Начните с промпт и типичных примеров. Если проблема касается только синтаксиса вывода, добавьте constrained decoding перед изменением веса.

Файн-тюнинг против constrained decoding

Библиотеки вроде xgrammar и outlines Ограничивают процесс генерации с помощью JSON schema, регулярных выражений или грамматики. В зависимости от выбранного ограничения и бэкенд создаётся автомат или грамматика, которые фильтруют недопустимые следующие токены. Обновление вес не требуется.

Это гарантирует использование поддерживаемого языка вывода, но не подтверждает, что значения являются истинными, полными или семантически корректными. Синтаксически корректный вызов функции всё равно может содержать неверный идентификатор клиента.

АспектConstrained DecodingФайн-тюнинг
НастройкаНемедленно — определить схему и развернуть её.Требуется подготовка данных, вычислительные операции с использованием GPU и процесс итераций.
ГарантияДопустимая синтаксис для поддерживаемого ограниченияИзученное поведение; степень соответствия схеме может варьироваться.
ГибкостьМожно в любой момент изменять схему без необходимости переобучения модели.Заблокировано после обучения
ЛатентностьНебольшая дополнительная нагрузка (модель может приводить к конфликтам с схемой)Снижение уровня (модель) естественным образом влияет на формат вывода
Подходит дляJSON, варианты выбора, грамматики, синтаксис вызова инструментовПоведение при повторных выполнениях задач у базовой версии модель отсутствует

Практический порядок действий:

  1. Начните с использования промптов и примеров в формате few-shot для базовой форматировки.
  2. Добавьте constrained decoding (xgrammar или outlines) при несоответствии синтаксиса.
  3. Выполняйте тонкую настройку только тогда, когда требуются изменения поведения, которые невозможно обеспечить с помощью схемы.

Краткий справочник: соответствие задач решениям

ЗадачаПервый механизм для тестированияПочему?
Отсутствующие знанияRAGМодели генерировать ложные факты. Retrieval обеспечивает достоверный и актуальный контекст.
Неверный формат/тонПромпт-инжинирингСовременные модели хорошо соблюдают инструкции по стилю при использовании примеров из небольших наборов данных
Некорректная синтаксис выходных данныхConstrained decodingОбеспечивает соблюдение поддерживаемой схемы или грамматики в процессе генерации
Повторяющиеся сбои при выполнении задачиФайн-тюнинг (SFT)Обучается на отобранных примерах входных/выходных данных
Несоответствие взаимных предпочтенийОптимизация предпочтенийИспользуются выбранные/отклонённые примеры после того, как поведение задачи становится измеримым.
Латентность/затраты при масштабированииДистилляция (SFT)Обучать более мелкий модель-ученик модель на выходных данных более крупного моделя-учителя
Уменьшить размер модельКвантизацияБез обучения — компрессия веса (FP16→INT4) для ускорения инференс

Сделайте экономическую обоснованность измеримой

Файн-тюнинг может снизить частоту возникновения промпт токены или позволить более небольшому объёму модель достичь поставленной цели, однако ни одна из этих экономий не происходит автоматически. Рассчитайте точку безубыточности, исходя из своего уровня трафика и ценообразования:

[ \text{Запросы на достижение точки безубыточности} = \frac{\text{стоимость обучения + оценки + деплой}} {\text{базовая стоимость/запрос} - \text{скорректированная стоимость/запрос}} ]

Если знаменатель мал, отрицателен или основан на непроверенном предположении относительно качества, то проект пока не имеет экономической обоснованности.

[!TIP] Гибридная конфигурация Распространённой архитектурой является более мелкий модель модель, адаптированный под конкретную задачу, в сочетании с retrieval для обновления фактов. Более крупный модель модель, запущенный с помощью специальных инструкций, следует рассматривать в качестве базового варианта; мелкий модель модель следует сохранять лишь в том случае, если он соответствует тем же критериям качества и безопасности, характерным для данной задачи.


Типы файн-тюнинг

Существуют три основные формы, которые может принимать файн-тюнинг. Они отличаются по типу данных, необходимых для работы, и по тому, что они обучают модель.

Файн-тюнинг Типы

1. Продолжение предварительной обучаемости (без учителя)

Вы обучаете базовую модель модель на большем объёме необработанных текстов без меток. Она продолжает выполнять прогнозирование следующего токен, точно так же, как и во время первоначального этапа предобучения.

Когда его использовать:

Пример: обучение на миллионах клинических записей, что позволяет модель распознавать медицинские сокращения, названия лекарств и стандартные клинические процедуры.

2. Надзорное обучение файн-тюнинг (SFT)

SFT обучается на пометленных парах (входные данные, выходные данные). Вы указываете модель точный выходной результат, который требуется для каждого входного значения.

Когда его использовать:

Обучение на парах (описание SQL-запроса, код SQL) для задачи текст-на-SQL.

{
    "input": "Get all users who signed up last month",
    "output": "SELECT * FROM users WHERE signup_date >= DATE_SUB(NOW(), INTERVAL 1 MONTH)"
}

3. Настройка инструкций

Настройка по инструкциям представляет собой специальный случай SFT, направленный на то, чтобы заставить модели выполнять самые разнообразные запросы на естественном языке. Данные для обучения состоят из пар «инструкция, ответ», взятых из множества различных задач.

Когда его использовать:

Пример: обучение на тысячах разнообразных заданий вроде «Подготовь краткое резюме этой статьи», «Напиши стихотворение на тему X», «Объясни концепцию Y простыми словами».

Сравнение

АспектПродолжение предварительной обучаемостиSFTНастройка инструкций
ДанныеЧистый текстпары (вход, выход)пары (инструкция, ответ)
МеткиНет (без надзора)специфичное для задачиРазнообразные задачи
ЦельЗнания в области доменаКонкретное поведение задачиСледовать любым инструкциям
Объём данныхКак правило, это самый большой корпус данных.Определяется уровнем покрытия задач и разнообразием ошибок.Как правило, имеет более широкий охват по сравнению с задачей-спецификой SFT

[!NOTE] Как на самом деле поступают разработчики SFT и настройка инструкций используют одну и ту же цель, связанную с выбором следующего токен; разница заключается в объёме и способе формирования датасет. Продолжительная предварительная обучающая фаза представляет собой отдельный эксперимент, после которого необходимо проводить тесты как для оценки улучшений в конкретной области, так и для выявления регрессии общих когнитивных способностей.


7-этапный процесс файн-тюнинг пайплайн

Файн-тюнинг представляет собой пайплайн, а не отдельную команду. У каждого этапа есть свои способы возникновения сбоев, и пропуск одного из них обычно приводит к появлению серьёзных проблем с модель позже.

7-этапный Пайплайн

Каждый этап основан на предыдущем:

  1. Подготовка данных — определение единицы оценки, разделение данных, а затем их очистка и форматирование
  2. Модель selection — Выберите подходящую базу. модель и загружаем веса
  3. Настройка обучения — настройка аппаратного обеспечения, гиперпараметров и стратегии оптимизации
  4. Файн-тюнинг — Запустить SFT, DPO, или обучение ORPO
  5. Оценка — Бенчмарк оптимизация производительности и проверка качестваДеплой** — Экспортируйте и предоставляйте свои модель
  6. Мониторинг — отслеживание производительности, техническое обслуживание и постепенная оптимизация

[!WARNING] Данные — это основа


Этап 1: Подготовка данных

Большинство проектов файн-тюнинг проваливаются именно на этом этапе, а не во время обучения. Современная подготовка данных — это гораздо больше, чем простое применение регулярных выражений к файлам CSV.

Данные Пайплайн

5-этапная обработка данных пайплайн

Инструменты вроде DataTrove и Distilabel могут быть полезны при работе с крупными объёмами данных, однако выбор пайплайн должен определяться таксономией сбоев и контрактом данных, а не предпочтениями конкретного инструмента.

1. Прием данных и фильтрация

2. Политика обработки конфиденциальных данных

3. Удаление дубликатов (MinHash LSH)

4. Синтетическое усиление, при необходимости

5. Форматирование

Примеры форматов данных

Формат Alpaca (соблюдение инструкций):

{
    "instruction": "Summarize the following text.",
    "input": "The text to be summarized...",
    "output": "This is the summary."
}

Формат ShareGPT/ChatML (диалоговый):

{
    "conversations": [
        { "from": "user", "value": "Hello, who are you?" },
        { "from": "assistant", "value": "I am a helpful AI assistant." }
    ]
}

Что действительно имеет значение


Этап 2: выбор Модель и аппаратная часть

Выбор базовой модели модель и определение минимального уровня GPU позволяют сужать круг тех составляющих, которые действительно можно обучить.

Начните с наименьшей базы модель, которая уже позволяет пройти обязательные базовые проверки. Подтвердите:

Файн-тюнинг представляет собой шаг адаптации, а не способ устранения проблем с неподходящей базой. Если модель не обеспечивает технические возможности, которые предусмотрены датасет, следует выбрать другую базу перед продолжением тренировки ещё несколько эпох.

Определяйте размер пайплайна, а не уровень маркетинговых услуг

Не существует стабильной таблицы «модель размер → GPU». Пиковое потребление памяти зависит от точности вес, алгоритма оптимизации, количества обучаемых параметров, длины последовательности, размера микропакетов, практики сохранения состояния в активация формате, способа аттеншн реализации и уровня накладных расходов фреймворк. Сначала следует оценить потребление памяти, а затем провести краткий тест на максимально возможную длину данных с использованием конкретной стековой структуры.

Компонент памятиПолная файн-тюнингLoRAQLoRA
База весаТочность обученияЗамороженный, обычно BF16/FP16Замороженные данные, как правило, в формате 4-битного NF4.
ГрадиентыВсе обучаемые весаАдаптер весаАдаптер веса
Состояния оптимизатораВсе обучаемые весаАдаптер весаАдаптер веса
АктивацииЭто зависит от размера пакета и длины последовательности в каждом методе.Та же зависимостьТа же зависимость

Исходная статья QLoRA показала, что в рамках своей специфической конфигурации 65-миллиардный вариант LLaMA модель умещается на одном устройстве с объёмом памяти 48 ГБ GPU. Этот результат представляет собой полезное ограничение, но не гарантию того, что любая современная архитектура с 70 миллиардами нейронов, любая длина контекста, любой ядро обработки или любой инструмент тренировки будут соответственно подходить для работы на таком же устройстве.

Математика памяти

Для модель с (P) параметрами один только веса требует примерно (2P) байт в формате BF16/FP16 или (0.5P) байт при использовании четырёхбитной представления, ещё до учёта метаданных квантизация и буферов рантайм. Полная обучающая процедура в стиле Adam включает градиенты, состояния оптимизатора, а также часто мастер-модели веса с более высокой точностью. Метод LoRA позволяет избежать хранения большинства состояний, подлежащих обучению; кроме того, QLoRA сокращает объём памяти, занимаемый замороженными компонентами типа вес. Тем не менее, при длине последовательностей, превышающих определённый порог, метод Активации может оставаться доминирующим.

Используйте следующий рабочий процесс:

  1. Определите максимальную длину последовательности и размер микропакета, которые необходимо поддерживать.
  2. Оцените объём веса и объём состояний, доступных для обучения, оставляя запас для активации и ядер.
  3. Выполните один шаг вперёд/назад при максимальной длине последовательности.
  4. Запишите пиковый объём выделенной и зарезервированной памяти.
  5. Только после этого корректируйте размер пакета, количество процессоров, длину последовательности или количество GPU.

Этап 3: Методы обучения (PEFT и LoRA)

Полная реализация файн-тюнинг против PEFT

Полная обработка файн-тюнинг (FFT) выполняется каждые вес, в результате чего градиенты и состояние оптимизатора масштабируются вместе со всем модель. Максимальную нагрузку невозможно оценить исключительно по количеству параметров, однако она значительно превышает объём памяти, необходимый для загрузки веса в целях выполнения инференс.

Параметро-эффективный файн-тюнинг (PEFT) подразумевает обучение лишь небольшой группы параметров, при этом остальные фиксируются на текущих значениях. Благодаря этому математические вычисления становятся значительно проще.

LoRA: начальная точка

LoRA (Low-Rank Adaptation) предполагает замораживание заранее обученной матрицы и представление её полученных обновлений с помощью двух более мелких матриц. В оригинальной статье это подход обосновывается гипотезой о том, что полезные обновления для адаптации обладают низким внутренним рангом.

LoRA Архитектура

Для замороженной матрицы (W0 \in \mathbb{R}^{d{out} \times d_{in}}), LoRA обучается на основе:

Адаптированный слой представляет собой:

[W’ = W_0 + \frac{\alpha}{r}BA]

В данном адаптере имеется (r(d*{in}+d*{out})) обучаемых параметров вместо (d*{in}d*{out}), характерных для соответствующей матрицы. Для квадратной матрицы шириной 4 096 при ранге 16 это означает сокращение размерности на 128 раз, а не на 10 000 раз, как утверждалось в отношении произвольных модель. Утверждение из статьи LoRA о сокращении на 10 000 раз касалось конкретной конфигурации GPT-3 объёмом 175 млрд параметров, в которой использовалась адаптация отдельных матриц.

Сравнение методов PEFT

МетодКакие измененияВыбирайте его в тех случаях, когда
LoRAЗамороженная база плюс обучаемые обновления низкого рангаБазовый модель встаёт идеально, и вам требуются небольшие результаты выполнения задач
QLoRALoRA — это замороженная база данных, хранящаяся в 4-битном форматеОсновная память вес является ограничивающим фактором
DoRAОтделяет величину вес от направления, обновлённого с учётом LoRA.Проведение тщательной оценки базового уровня LoRA приводит к возникновению разрыва в качестве, требующего дополнительной сложности в реализации.
Полная файн-тюнингВсе веса моделиPEFT не попадает в цель, и получаемый прирост качества оправдывает использование распределённого обучения и полного чекпоинты.

Когда выбирать тот или иной вариант

DoRA: вес-разложенные LoRA

DoRA (Вес — декомпозированная адаптация низкого ранга) позволяет разделить модуль каждого вектора вес и его направление. При этом к направленной составляющей применяется обновление с использованием LoRA, в то время как модуль определяется отдельно.

DoRA Архитектура

Как это работает:

Вместо того чтобы рассматривать веса как единое целое, DoRA разделяет заранее обученный веса на два компонента:

  1. Амплитуда — это обучаемое значение для каждого вектора вес.
  2. Направление — нормализованный вектор, обновляемый с помощью матриц низкого ранга.

В компактной колонковой нотации:

[W’ = m \frac{V + BA}{\lVert V + BA \rVert_c}]

где:

Что вы получаете за дополнительную структуру:

Объединение адаптеров в рамках многозадачного обучения

Благодаря отдельным адаптерам одна замороженная база может обслуживать несколько задач. Можно направлять запросы к конкретному адаптеру, использовать один движок для работы с несколькими адаптерами при наличии такой возможности или генерировать офлайн-версию объединённого результата. Однако процесс слияния может привести к взаимному влиянию компонентов, поэтому необходимо тщательно проанализировать полученный результат, а не полагаться на то, что исходные адаптеры работают без проблем.

Распространённые методы слияния:

  1. Соединение — объединение параметров адаптеров с целью увеличения эффективного ранга. Метод быстрый и простой.
  2. Линейное соединение — взвешенная сумма адаптеров. Позволяет настраивать веса.
  3. SVD — разложение матрицы для объединения компонентов. Более гибкий подход, но требует больше времени.

Пример: один адаптер предназначен для суммаризации, другой — для перевода; оба объединяются в единый мультизадачный модель.


Этап 4: Файн-тюнинг и согласование предпочтений

SFT обучается на примерах демонстраций. Метод оптимизации предпочтений, в отличие от него, работает на основе сравнений вроде «выбранный ответ A лучше отклонённого ответа B». Используйте его только тогда, когда парная оценка предпочтений является наиболее подходящей метрикой для описания ошибки; при этом фактическая точность и соблюдение правил часто требуют более строгого эвалуаторы, чем просто глобальных предпочтений.

Методы выравнивания

Реализация на основе PPO-связанных RLHF

Изначальный алгоритм представлял собой трёхэтапный процесс пайплайн:

  1. SFT — изучение задачи.
  2. Награда модель — обучение на основе предпочтений людей (отобранных и отклонённых вариантов).
  3. PPO (Proximal Policy Optimization) — метод усиленного обучения для оптимизации политики.

Рабочие затраты обусловлены наличием движущихся компонентов:

DPO

Метод DPO (оптимизация прямых предпочтений) исключает явное задание модель награды и цикл обучения с подкреплением. Он по‑прежнему оптимизирует цель RLHF (максимизацию награды при ограничении через дивергенцию KL), однако делает это в рамках перепараметризованной задачи обучения с учителем, а не с использованием методов машинного обучения с подкреплением.

{
    "prompt": "Explain quantum computing",
    "chosen": "Quantum computing uses qubits...",   # Preferred response
    "rejected": "Well, it's complicated..."        # Non-preferred response
}

Что меняется с операционной точки зрения:

Создание прототипа с использованием DPO проще, чем разработка полноценного PPO пайплайн, однако это не гарантирует автоматического улучшения качества. Результаты зависят от исходной политики обработки, качества пар данных, настроек потерь, эффектов длины последовательностей и протокола оценки. Следует сравнивать его с SFT чекпоинт на тех же наборах данных для тестирования и задачах.

ORPO

ORPO (Odds-Ratio Preference Optimization) объединяет функцию потерь вида отрицательный логарифм вероятности SFT с штрафом, основанным на коэффициенте шансов, применяемым к отклонённым ответам. Благодаря этому методу не требуется отдельная этапа формирования контрольных данных модель, что позволяет выполнять одновременно обучение на задачах и оптимизацию предпочтений.

Как это работает: ORPO использует комбинированную функцию потерь, которая одновременно выполняет две задачи:

  1. Максимизирует вероятность выбранного ответа (обучение задаче).
  2. Наказывает отклонённый ответ с помощью члена, основанного на соотношении шансов (обучение предпочтениям).

Гиперпараметры, которые стоит знать:

from trl import ORPOConfig

config = ORPOConfig(
    learning_rate=8e-6,  # Very low, as recommended by the ORPO paper
    beta=0.1,            # Controls strength of preference penalty
    # ... other params
)

Компромисс:

Выберите вариант из списка данных и схемы оценки:

По умолчанию для всех задач значение равно «нет». Необходимо сохранять базовый уровень, рассчитанный исключительно с использованием SFT, и отчитываться как о метриках задач, так и о метриках предпочтений.


Файн-тюнинг фреймворки

Фреймворки Эти компоненты часто перекрываются и быстро меняются. Необходимо выбирать ту версию, которую требует конкретный путь выполнения, фиксировать версии библиотек, а также сохранять конфигурацию обучения в достаточно универсальном виде, чтобы её можно было воспроизвести вне среды Jupyter Notebook.

Unsloth — высокая скорость и эффективность использования памяти

Unsloth интегрируется с Hugging Face trl и transformers и предоставляет оптимизированные ядра, механизмы сохранения состояния и квантированные пути файн-тюнинг для поддерживаемых модели.

[!ВАЖНО] Порядок импорта имеет значение Следуйте порядку импорта из примера Unsloth для выбранной вами версии. Unsloth применяет патчи во время импорта, поэтому его необходимо импортировать раньше trl и transformers исключает пропуск оптимизаций или ошибки, связанные с конкретной версией.

# ✅ Correct order
from unsloth import FastLanguageModel  # Must be first!
from trl import SFTTrainer
from transformers import TrainingArguments

# Avoid this order with Unsloth's patched path
from trl import SFTTrainer
from unsloth import FastLanguageModel

Идеально подходит для: одиночной GPU обучающей сессии, разработки прототипов, ноутбуков Colab и всех, кто следит за счетами за использование GPU.

Значения скорости обработки и объёма памяти, указанные в документации, могут сильно отличаться в зависимости от модель, длины последовательности, режима обработки пакетами данных, уровня точности и характеристик аппаратного обеспечения. Вместо того чтобы рассматривать приведённые в заголовках коэффициенты как неизменную фреймворк характеристику модели, необходимо измерять фактическую скорость выполнения операций в Бенчмарк токены в секунду и максимальный объём используемой памяти при конкретном запуске.

Axolotl — обучение на основе конфигурации

# config.yaml - no code required
base_model: meta-llama/Meta-Llama-3-8B
adapter: qlora
lora_r: 32
lora_alpha: 16
datasets:
    - path: data/my_data.jsonl
      type: alpaca
sample_packing: true

Запустить с: accelerate launch -m axolotl.cli.train config.yaml

Идеально подходит: для декларативных, воспроизводимых запусков, а также благодаря встроенным опциям запуска для распределённого обучения.

Основное преимущество заключается в декларативной конфигурации, которую можно анализировать, версионировать и повторно использовать как в локальных, так и в распределённых сценариях выполнения.

Сравнение Фреймворк

ИнструментПолезно приПроверьте перед коммитом.
UnslothВам нужен оптимизированный путь supported-модель с краткими примерами его использования.Модель, GPU, квантизация, а также матрица распределённой поддержки
АксолотлВы хотите декларативные конфигурации и встроенные распределённые шаблоны обработки.Точная схема конфигурации и запуска для фиксированной версии выпуска
TRLВам требуется прямой доступ к Hugging Face SFT и инструментам обучения предпочтениям.формат Датасет, шаблон чата, маскировка потерь и интеграция с PEFT
TorchtuneВы хотите рецепты и компоненты, адаптированные под PyTorch.покрытие рецепта Модель и совместимость при экспорте

Практическая демонстрация: файн-тюнинг с Unsloth

Вот полный пример из моего unsloth-finetune-demo хранилище данных. В демонстрации происходит финтюнинг модели Nemotron-Nano под function calling.

Обучение Пайплайн

Быстрое начало

# Clone and setup
git clone https://github.com/slavadubrov/unsloth-finetune-demo.git
cd unsloth-finetune-demo

# Install with uv (recommended)
uv sync

# Run fine-tuning (quick test)
uv run finetune --max-samples 1000

Конфигурация

Интересные аспекты находятся в config.py:

# Model & Dataset
MODEL_NAME = "nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1"  # 4B params, 128K context
DATASET_NAME = "glaiveai/glaive-function-calling-v2"   # 113K examples

# LoRA Configuration
LORA_R = 16        # Adapter capacity; tune against held-out results
LORA_ALPHA = 32    # Update scaling; alpha/r is the classic LoRA scale
MAX_SEQ_LENGTH = 4096

# Candidate modules for this Llama-family model
LORA_TARGET_MODULES = [
    "q_proj", "k_proj", "v_proj", "o_proj",
    "gate_proj", "up_proj", "down_proj",
]

[!NOTE] Соотношение альфа к рангу alpha/r масштабирует традиционную процедуру обновления LoRA. alpha = 2r Это распространённая исходная гиперпараметризация, часто упоминаемая в документации некоторых инструментов, однако она не является гарантией стабильности работы. Изменять параметры порядка сканирования, значения альфы, скорости обучения и целевые модули следует только после того, как данные и базовая конфигурация будут определены.

Основной код обучения

from unsloth import FastLanguageModel
from trl import SFTConfig, SFTTrainer

# Load model with 4-bit quantization
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1",
    max_seq_length=4096,
    load_in_4bit=True,
)

# Add LoRA adapters
model = FastLanguageModel.get_peft_model(
    model,
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
                    "gate_proj", "up_proj", "down_proj"],
    use_gradient_checkpointing="unsloth",  # Lower activation memory; extra compute
)

# The data step creates versioned train_dataset and eval_dataset objects.
# Each row has the chat messages and tool schemas expected by current TRL.

# Train with the current TRL configuration surface.
trainer = SFTTrainer(
    model=model,
    processing_class=tokenizer,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    args=SFTConfig(
        output_dir="outputs/nemotron-function-calling",
        max_length=4096,
        packing=True,
        per_device_train_batch_size=2,
        gradient_accumulation_steps=4,
        learning_rate=2e-4,
        num_train_epochs=3,
        bf16=True,
    ),
)
trainer.train()

Файн-тюнинг с Axolotl

[!NOTE] Вскоре появится демо Я работаю над практическим демонстрационным примером на Axolotl. До его готовности… Руководство по ускорению n-мерного параллелизма Документ Hugging Face является хорошим источником информации по стратегиям обучения с использованием нескольких GPU.

Для конфигурационно-ориентированных и распределённых архитектур Axolotl обеспечивает воспроизводимость рабочего процесса:

# axolotl_config.yaml
base_model: meta-llama/Meta-Llama-3-8B
model_type: LlamaForCausalLM

# QLoRA configuration
load_in_4bit: true
adapter: qlora
lora_r: 32
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules:
    - q_proj
    - k_proj
    - v_proj
    - o_proj
    - gate_proj
    - up_proj
    - down_proj

# Dataset
datasets:
    - path: data/training_data.jsonl
      type: alpaca

# Training settings
sequence_len: 4096
sample_packing: true # Benchmark with your length distribution
micro_batch_size: 2
gradient_accumulation_steps: 4
learning_rate: 0.0002
num_epochs: 3

# Precision and attention path; verify support on the pinned stack
bf16: true
flash_attention: true

Запустить обучение:

axolotl train axolotl_config.yaml

Этап 5: Оценка

Сначала заморозьте конфигурацию оценки перед первым запуском. Как минимум, сравните отрегулированный вариант чекпоинт с исходной версией без настроек в тех же условиях промпт, при одинаковых параметрах декодирования и среде выполнения инструментов. Составляйте отчет об общем качестве только после анализа случаев сбоев, которые проект должен был устранить.

Отслеживайте четыре группы:

  1. Целевая задача: точное совпадение, успешная эксплуатация, оценка по шкале человека или любой другой результат, связанный с конкретным случаем применения.
  2. Регрессия: общие способности системы и ранее поддерживаемые типы задач, которые могут пострадать в результате адаптации.
  3. Безопасность и политика: отказы в выполнении запросов, утечки данных, промпт-инъекция или ограничения, характерные для конкретной области применения.
  4. Эксплуатация: латентность, throughput, объём памяти, размер генерируемых результатов и затраты при заданной конфигурации сервинг.

Автоматизированный бенчмарки

Использовать lm-evaluation-harness для соответствующих стандартизированных задач, а не в качестве замены оценке продукта:

lm_eval --model hf \
    --model_args pretrained=./outputs/merged-model \
    --tasks hellaswag,arc_easy,mmlu \
    --batch_size 8

LLM в качестве джадж

Для оценки субъективного качества более крупный модель может помочь в формировании баллов, однако его необходимо калибровать на примерах, проверенных людьми, при этом идентичность кандидата должна оставаться скрытой:

judge_prompt = """
Rate this response from 1-5 on:
- Relevance
- Accuracy
- Formatting

Response: {model_output}
Expected: {ground_truth}
"""

Оценка в узкоспециализированной области

Обеспечьте наличие реальных примеров по источнику, пользователю, документу или временной шкале в таком близком расположении друг к другу, чтобы почти идентичные данные не могли попасть в разные группы после разделения. Что касается function calling, необходимо проверить всю цепочку операций: выбор инструмента, аргументы, результат выполнения, процедуру восстановления и окончательный ответ. При небольшом объёме выборки следует указывать диапазоны уверенности или количество успешных/неудачных случаев, а также тщательно анализировать каждую тенденцию изменения в критически важном сегменте данных.


Этап 6: Деплой и форматы вывода

Выбирайте артефакт исходя из спецификаций движка сервинг и плана возврата к предыдущему состоянию, а не только на основе размера файла:

Форматы вывода

1. Адаптер LoRA

uv run finetune  # Saves ~100-500MB adapter

2. Объединённый модель

uv run finetune --merge  # Creates a standalone full model

3. Формат GGUF

uv run finetune --gguf q4_k_m  # Creates ~2-4GB quantized model

Этап 7: Сервинг и мониторинг

С vLLM

# Serve the base and expose a PEFT adapter as a model name.
vllm serve nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1 \
    --enable-lora \
    --lora-modules function-calling=./outputs/adapter \
    --host 0.0.0.0 \
    --port 8000 \
    --max-model-len 4096

Запрос через совместимый с OpenAI интерфейс API:

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
response = client.chat.completions.create(
    model="function-calling",
    messages=[{"role": "user", "content": "Book a flight to Tokyo"}]
)

С Ollama (локально)

# Create Modelfile
echo 'FROM ./outputs/unsloth-nemotron-function-calling-gguf/model-q4_k_m.gguf' > Modelfile

# Import to Ollama
ollama create my-function-model -f Modelfile

# Run
ollama run my-function-model

С llama.cpp (CPU)

./llama-cli -m ./outputs/model-q4_k_m.gguf \
    -p "What's the weather in Tokyo?" \
    --ctx-size 4096

Осуществляйте мониторинг выпущенного модель

Цикл жизни модели не завершается при достижении оптимального уровня потерь в процессе обучения. Одной единицей релиза следует считать запись версии базовой модели модель, параметров токенизатор и шаблонов чатов, хэша адаптера, версии датасет, конфигурации обучения и отчёта о оценке. В режиме производства необходимо отслеживать успех выполнения задач, наличие некорректных результатов, сбои правил принятия решений, латентность, а также смещение входных данных с использованием тех же выборок, что и в оффлайн-режиме. Обеспечьте возможность загрузки предыдущих версий модели и укажите порог для возврата к старой версии перед запуском.


Основные выводы

  1. Доработку следует проводить только после того, как ненастроенная базовая модель вместе с таксономией сбоев покажут, что адаптация вес действительно решает поставленную проблему.
  2. Retrieval отвечает за обработку меняющихся данных; constrained decoding — за синтаксис; ни один из этих механизмов не заменяется на SFT.
  3. LoRA сокращает объём параметров, подлежащих обучению. Кроме того, QLoRA компрессирует замороженную базовую часть веса. Не стоит приписывать показатели памяти, связанные с QLoRA, модели LoRA.
  4. Покрытие данных, целостность разделений, происхождение информации и маскировка потерь имеют гораздо большее значение, чем простое копирование конфигурации какого-либо модного оптимизатора.
  5. DPO, ORPO и методы RLHF, основанные на PPO, представляют собой разные экспериментальные подходы, а не иерархию качества с универсальным стандартом.
  6. Оценка целевого поведения, возможных регрессий, уровня безопасности и работоспособности должна проводиться на основе одной и той же базовой модели модель.
  7. Перед началом обучения необходимо выбрать адаптер, объединённую версию или результат GGUF в соответствии с требованиями к сервинг и механизмам отката.

Список литературы

Статьи и исследования

Инструменты обработки данных

Constrained decoding

Обучение фреймворки

Инференс и деплой

Оценка

Руководства и ресурсы