Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно. Необходимо обновить браузер или попробовать использовать другой.
LoRA и QLoRA: чем отличаются и что выбрать для дообучения большой языковой модели
В мире искусственного интеллекта и дообучения больших языковых моделей (LLM) возникло множество методов, позволяющих адаптировать модели под конкретные задачи без необходимости дообучения всех параметров. Два таких подхода — LoRA и QLoRA — стали популярными благодаря своей эффективности и экономии ресурсов. Однако, несмотря на схожесть в цели, они имеют существенные различия в реализации, применении и требованиях к оборудованию.
LoRA (Low-Rank Adaptation) и QLoRA (Quantized Low-Rank Adaptation) представляют собой методы параметрической эффективной дообучаемости (PEFT), разработанные для снижения затрат на обучение и хранение моделей. Эти методы позволяют изменять поведение модели, используя лишь небольшое количество дополнительных параметров, что делает их идеальными для использования на устройствах с ограниченными ресурсами.
В данной статье рассматриваются ключевые особенности LoRA и QLoRA, их различия, а также рекомендации по выбору подходящего метода в зависимости от задачи и доступных ресурсов.
Что такое LoRA?
LoRA (Low-Rank Adaptation) — это метод параметрической эффективной дообучаемости (PEFT), предложенный в 2021 году. Основная идея LoRA состоит в том, чтобы адаптировать большую модель, изменяя лишь небольшое количество параметров, вместо дообучения всех весов. Это достигается за счёт введения низкоранговых матриц, которые добавляются к весам модели.
Механизм работы LoRA
LoRA работает с линейными слоями модели, заменяя их на комбинацию оригинального веса и низкорангового изменения. Например, если веса модели представлены как матрица W, то в LoRA добавляется матрица ΔW = A × B, где A и B — матрицы низкой размерности. Таким образом, изменённый вес становится:
Код:
W' = W + ΔW = W + A × B
Это позволяет сохранить основную информацию модели, но при этом внести изменения, соответствующие новой задаче.
Преимущества LoRA
Экономия ресурсов: LoRA требует значительно меньше памяти и вычислительных ресурсов по сравнению с полным дообучением.
Быстрое дообучение: Изменение происходит за относительно короткое время.
Сохранение оригинальной модели: Оригинальные веса остаются неизменными, что позволяет использовать их в других задачах.
Простота применения: LoRA легко интегрируется в существующие системы и фреймворки, такие как Hugging Face Transformers.
Ограничения LoRA
Не подходит для всех моделей: LoRA эффективен, когда модель имеет линейные слои, но не всегда применим к слоям с высокой нелинейностью.
Ограниченная точность: В некоторых случаях точность LoRA может быть ниже, чем у полного дообучения, особенно при сложных задачах.
Что такое QLoRA?
QLoRA — это развитие LoRA, которое включает в себя квантование весов модели. Основная цель QLoRA — уменьшение объема памяти, необходимого для хранения модели, и ускорение процесса обучения и инференса. QLoRA применяет квантование с низкой точностью (например, int4) к весам модели, сохраняя при этом эффективность LoRA.
Механизм работы QLoRA
QLoRA сочетает два принципа:
Квантование: Веса модели сжимаются до формата с низкой точностью (например, int4 или int8).
LoRA: Добавляются низкоранговые изменения для адаптации модели.
Таким образом, QLoRA позволяет дообучать модели даже на устройствах с ограниченной памятью, таких как потребительские видеокарты.
Преимущества QLoRA
Снижение требований к памяти: Квантование позволяет сократить объем памяти, необходимый для хранения модели.
Сохранение качества: Несмотря на квантование, качество модели остаётся высоким благодаря LoRA.
Удобство для инференса: Модель может быть использована в реальных приложениях с меньшими затратами.
Ограничения QLoRA
Сложность реализации: Требуется дополнительная настройка и калибровка для достижения высокой точности.
Снижение точности при сильном квантовании: При использовании очень низких форматов (например, int4) точность может значительно упасть.
Сравнение LoRA и QLoRA
| Характеристика | LoRA | QLoRA |
|----------------|------|-------|
| Требования к памяти | Низкие | Очень низкие |
| Требования к вычислениям | Средние | Низкие |
| Уровень квантования | Отсутствует | Присутствует |
| Сложность реализации | Простая | Сложная |
| Точность | Высокая | Высокая (при правильной настройке) |
| Подходит для | Обычные устройства | Устройства с ограниченными ресурсами |
Когда использовать LoRA?
LoRA идеально подходит для:
Дообучения моделей на устройствах с достаточным объемом памяти.
Задач, где требуется высокая точность.
Простых и быстрых решений, где не требуется квантование.
Когда использовать QLoRA?
QLoRA рекомендуется для:
Работы на устройствах с ограниченной памятью (например, потребительские видеокарты).
Инференса на устройствах с низкой производительностью.
Сценариев, где важна экономия ресурсов и быстрое развертывание.
Как выбрать между LoRA и QLoRA?
Выбор между LoRA и QLoRA зависит от нескольких факторов:
1. Доступные ресурсы
Если у вас есть доступ к мощным GPU с большим объемом VRAM, LoRA может быть предпочтительным выбором, поскольку он позволяет достичь высокой точности без необходимости квантования.
Если же вы работаете на устройствах с ограниченными ресурсами, QLoRA станет лучшим решением, поскольку позволяет эффективно использовать ограниченные ресурсы.
2. Требования к точности
Для задач, где важна максимальная точность, LoRA может быть предпочтительнее, поскольку он не теряет информации при квантовании.
Для задач, где допустима небольшая потеря точности, QLoRA может быть хорошим выбором, особенно если вы хотите уменьшить объем памяти и ускорить инференс.
3. Сложность внедрения
LoRA проще в реализации и интеграции, тогда как QLoRA требует дополнительных шагов по калибровке и настройке.
Примеры использования
Пример 1: Дообучение LLaMA через LoRA
Для дообучения модели LLaMA с использованием LoRA можно использовать библиотеку Hugging Face PEFT. Ниже приведён пример конфигурации:
Python:
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
config = LoraConfig(
r=8,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none"
)
peft_model = get_peft_model(model, config)
Пример 2: Дообучение LLaMA через QLoRA
Для QLoRA необходимо использовать квантование, например, с помощью библиотеки bitsandbytes:
При работе с LoRA и QLoRA важно соблюдать следующие рекомендации:
Проверка совместимости: Убедитесь, что используемая модель поддерживает LoRA или QLoRA.
Тестирование точности: После дообучения проверьте точность модели на тестовых данных.
Контроль ресурсов: Следите за использованием памяти и процессора, особенно при использовании QLoRA.
Сохранение оригинальных весов: Не перезаписывайте оригинальные веса модели, чтобы сохранить возможность повторного использования.
Заключение
LoRA и QLoRA являются мощными инструментами для дообучения больших языковых моделей. LoRA предоставляет эффективное решение для задач, где важна точность и доступны ресурсы. QLoRA — это более продвинутый подход, который позволяет дообучать модели даже на устройствах с ограниченными ресурсами, при этом сохраняя высокую точность. Выбор между ними зависит от целей проекта, доступных ресурсов и требований к точности.
Для успешного применения этих методов важно понимать их особенности, правильно настраивать параметры и следить за результатами дообучения. Использование Hugging Face и других библиотек значительно упрощает процесс, но требует внимательного подхода к каждой детали.
Чек-лист выбора метода
[ ] Проверить, поддерживает ли модель LoRA или QLoRA.
[ ] Оценить объем доступной памяти и вычислительных ресурсов.
[ ] Определить уровень точности, необходимый для задачи.
[ ] Оценить сложность внедрения и необходимость дополнительной настройки.
[ ] Проверить совместимость с используемыми библиотеками (например, PEFT, Transformers).
[ ] Провести тестирование на тестовых данных.
[ ] Убедиться, что оригинальные веса модели не будут перезаписаны.
[ ] Оценить возможность дальнейшего использования модели в других задачах.
Если коротко: LoRA и QLoRA — это не отдельные алгоритмы обучения, а способы параметрически эффективного дообучения. Кроме них есть как другие PEFT-методы, так и полноценное дообучение, обучение с подкреплением, preference-оптимизация и методы экономии памяти.
Ниже — основные варианты, которые реально используются для LLM.
────────────────────
1. Full Fine-Tuning: полное дообучение всех весов
Это классический вариант: берут базовую модель и обучают все её параметры на целевом датасете.
Когда подходит
Нужно максимально возможное качество под конкретный домен.
Есть много GPU/VRAM.
Нужна глубокая перестройка модели: стиль, формат, предметная область, сложный reasoning.
Вы можете позволить себе хранить несколько полных копий модели под разные задачи.
Плюсы
Обычно даёт максимальное качество.
Нет ограничений, связанных с рангом, целевыми модулями или заморозкой основной части весов.
Модель можно полностью адаптировать под стиль, формат, предметную область.
Минусы
Очень высокое потребление памяти.
Для модели уровня 7B полное дообучение в fp16/bf16 с оптимизатором типа Adam может требовать десятки и сотни GB VRAM в зависимости от batch size, sequence length и оптимизаций.
Каждая задача требует отдельной полной копии модели.
Выше риск катастрофического забывания базовых навыков.
Дороже хранить и деплоить несколько вариантов.
Что обычно используют вместе с full fine-tuning
DeepSpeed ZeRO-1/2/3
FSDP
gradient checkpointing
8-bit Adam
bf16 или fp16
CPU/NVMe offloading
GaLore и другие memory-efficient optimizer/gradient projection подходы
Примерно по памяти:
7B full FT без серьёзных оптимизаций — часто требует очень много VRAM.
13B full FT — уже практически недоступно на одной потребительской карте без offload.
70B full FT — обычно только кластер, ZeRO/FSDP, offload и большие вычислительные ресурсы.
────────────────────
2. Adapter Tuning: встраивание небольших адаптеров
Adapter-based методы добавляют в модель маленькие обучаемые модули, обычно внутри или рядом с Transformer-блоками.
Основные варианты
Houlsby adapters
Адаптеры вставляются после attention и feed-forward слоёв.
Обычно содержат bottleneck-проекцию: down-projection, нелинейность, up-projection.
Pfeiffer adapters
Похожи на Houlsby, но обычно размещаются только после feed-forward блоков.
Часто дают меньше накладных расходов.
Parallel adapters
Адаптер работает параллельно с основным слоем, а не последовательно после него.
Может быть стабильнее и быстрее.
MAM Adapter
Комбинация prefix tuning и adapter tuning.
Пытается получить преимущества обоих подходов.
Плюсы
Обучается только небольшая часть параметров.
Можно держать одну базовую модель и много адаптеров.
Хорошо подходит для multi-task сценариев.
Адаптеры можно отключать, включать, комбинировать.
Минусы
Добавляют накладные расходы при инференсе.
Не всегда легко сливаются с базовой моделью без изменения архитектуры.
Качество может быть ниже, чем у хорошо настроенного LoRA, особенно если адаптеры маленькие.
Нужно аккуратно выбирать места вставки и bottleneck size.
Prefix Tuning добавляет обучаемые виртуальные токены в начало последовательности, но не обычные текстовые токены, а непрерывные векторы, которые подаются в attention.
Как работает
К входу добавляется несколько обучаемых hidden states.
Модель видит их как префикс.
Сам текст задачи может оставаться неизменным.
Обучаются только параметры префикса.
Когда подходит
Очень мало VRAM.
Нужно быстро адаптировать модель под классификацию, извлечение данных, простые instruction-задачи.
Хочется минимально менять модель.
Плюсы
Очень мало обучаемых параметров.
Низкие требования к памяти.
Можно держать разные префиксы под разные задачи.
Минусы
Часто слабее LoRA на сложных generative-задачах.
Может быть нестабильным при малом количестве данных.
Виртуальные токены занимают часть контекста.
Не всегда удобно интерпретировать, что именно выучил префикс.
Пример:
Python:
from peft import PrefixTuningConfig
config = PrefixTuningConfig(
task_type="CAUSAL_LM",
num_virtual_tokens=20,
)
────────────────────
4. Prompt Tuning
Prompt Tuning обучает мягкий prompt — набор continuous embeddings, которые добавляются к входу.
Отличие от Prefix Tuning
Грань между Prompt Tuning и Prefix Tuning часто размыта, но обычно:
Prompt Tuning обучает embeddings на входе.
Prefix Tuning может обучать префиксы на разных слоях attention.
P-Tuning v2 развивает идею обучаемых prompt-векторов по всей модели.
Когда подходит
Очень ограниченные ресурсы.
Много задач, но одна базовая модель.
Нужны лёгкие task-specific адаптеры.
Плюсы
Минимальный объём обучаемых параметров.
Очень дёшево хранить.
Можно быстро переключать задачи.
Минусы
На небольших моделях часто работает хуже, чем LoRA.
Для сложных задач может не хватить выразительности.
Требует хорошего initialization prompt.
Может быть чувствителен к learning rate и длине prompt.
Пример:
Python:
from peft import PromptTuningConfig
config = PromptTuningConfig(
task_type="CAUSAL_LM",
num_virtual_tokens=8,
prompt_tuning_init="TEXT",
prompt_tuning_init_text="Classify the following text:",
)
────────────────────
5. P-Tuning / P-Tuning v2
P-Tuning — семейство методов, где обучаются не обычные слова, а непрерывные prompt-векторы.
Особенности
P-Tuning v2 обычно добавляет обучаемые prompt-векторы не только на вход, но и на разные слои Transformer.
Часто работает лучше обычного prompt tuning, особенно на задачах NLU.
Может быть полезен для классификации, NER, извлечения сущностей, QA.
Плюсы
Очень экономичен по параметрам.
Может быть эффективен при большом количестве задач.
Хорошо сочетается с frozen backbone.
Минусы
Для сложной генерации может уступать LoRA.
Требует аккуратной настройки длины prompt и инициализации.
Может занимать часть контекстного окна.
────────────────────
6. IA3 / (IA)^3
IA3 означает Infused Adapter by Inhibiting and Amplifying Inner Activations.
Идея
Вместо добавления новых матриц или адаптеров метод обучает небольшие scaling-векторы, которые умножаются на активации внутри модели.
Обычно воздействуют на:
keys;
values;
feed-forward activations.
Плюсы
Очень мало обучаемых параметров.
Часто меньше overhead, чем у классических адаптеров.
BitFit обучает только bias-параметры модели, а основные веса оставляет замороженными.
Когда подходит
Очень простой baseline.
Мало ресурсов.
Нужно проверить, можно ли вообще адаптировать задачу без серьёзного обучения.
Плюсы
Максимально простая реализация.
Очень мало обучаемых параметров.
Низкий риск сильно сломать базовую модель.
Минусы
Обычно слабее LoRA, адаптеров и prefix tuning.
Для сложных generative-задач часто недостаточен.
Не все архитектуры удобно поддерживают нужные bias-слои.
────────────────────
8. DoRA
DoRA — Weight-Decomposed Low-Rank Adaptation.
Идея
DoRA разделяет вес на направление и масштаб, а затем адаптирует их более гибко, чем обычный LoRA.
Условно:
LoRA учит низкоранговую добавку к весу.
DoRA дополнительно лучше контролирует масштаб и направление весового вектора.
Когда может быть полезен
Когда обычный LoRA недообучается или нестабилен.
Когда хочется получить ближе к full fine-tuning качеству, но с PEFT-экономией.
Для задач, где важна стабильность адаптации.
Плюсы
Часто даёт лучшее качество, чем vanilla LoRA, при сопоставимом бюджете.
Лучше приближает эффект полного дообучения.
Может быть полезен для сложных instruction-задач.
Минусы
Чуть сложнее обычного LoRA.
Не всегда поддерживается из коробки во всех стеках.
Может требовать более аккуратного подбора learning rate.
────────────────────
9. AdaLoRA
AdaLoRA — адаптивный вариант LoRA.
Идея
В обычном LoRA ранг r обычно фиксирован для всех целевых модулей. AdaLoRA пытается распределить ранг более умно: каким-то слоям дать больше ёмкости, каким-то меньше.
Когда полезен
Когда непонятно, какие слои важнее для задачи.
Когда хочется автоматизировать выбор ранга.
Когда нужно эффективнее использовать бюджет параметров.
Плюсы
Более гибкое распределение ёмкости.
Может дать лучшее качество при том же числе параметров.
Полезен, если нет ресурсов вручную тюнить r по слоям.
Минусы
Сложнее отладка.
Больше переменных в конфигурации.
Не всегда даёт заметный выигрыш на простых задачах.
────────────────────
10. LoRA-варианты и связанные методы
Вокруг LoRA появилось много модификаций. Некоторые из них:
LoRA+
Разные learning rate для матриц A и B.
Может ускорять сходимость.
rsLoRA
Rank-stabilized LoRA.
Пытается стабилизировать обучение при больших рангах.
LoftQ
LoRA с quantization-aware инициализацией.
Полезен при работе с квантованными моделями.
PiSSA
Инициализация LoRA через principal singular values/singular vectors.
Может быть полезен для более осмысленного старта адаптации.
MoLE / Mixture of LoRA Experts
Несколько LoRA-экспертов, которые комбинируются или выбираются динамически.
Полезно для multi-domain или multi-task задач.
LoRAHub
Идея композиции множества LoRA-модулей.
Больше про повторное использование и комбинирование адаптеров.
────────────────────
11. Sparse Fine-Tuning и mask-based методы
Это методы, где обучается не вся модель, а разреженная часть весов.
Примеры
DiffPruning
Обучает разреженный delta к весам.
Пытается получить эффект fine-tuning при малом числе изменяемых параметров.
FishMask
Использует информацию о важности параметров для выбора маски.
Обучает только выбранную подмаску весов.
MeZO
Memory-efficient zeroth-order optimization.
Может быть полезен при экстремальных ограничениях памяти, но это уже отдельный класс оптимизаторов.
Когда подходит
Нужен очень маленький объём изменяемых параметров.
Хочется альтернатива LoRA/adapter.
Есть специфичные требования к хранению и деплою.
Минусы
Часто сложнее в настройке.
Меньше зрелых production-инструментов.
Качество может сильно зависеть от задачи и маски.
────────────────────
12. GaLore и другие методы экономии памяти для почти полного обучения
GaLore — это не PEFT в духе LoRA, а метод, который пытается обучать модель почти полноценно, но экономит память за счёт low-rank projection градиентов.
Идея
Градиенты проецируются в низкоранговое пространство.
Оптимизатор работает с уменьшенным представлением.
Это позволяет снизить память под optimizer states.
Когда полезен
Хочется качество ближе к full fine-tuning.
LoRA/QLoRA не дают нужного результата.
Есть ограничения по памяти, но full FT в лоб не влезает.
Плюсы
Может быть эффективнее LoRA на некоторых задачах.
Позволяет обновлять больше параметров модели.
Хорошо сочетается с gradient checkpointing и ZeRO.
Минусы
Сложнее, чем LoRA.
Требует поддержки в тренировочном стеке.
Может быть медленнее или требовать аккуратного подбора гиперпараметров.
────────────────────
13. Quantization-Aware Training
QAT — обучение с учётом будущего квантования.
Важно не путать
QLoRA — обычно LoRA поверх квантованной базовой модели.
QAT — модель обучается или дообучается так, чтобы быть устойчивой к квантованию.
GPTQ, AWQ, GGUF quantization — чаще post-training quantization, а не сам метод обучения.
Когда нужен QAT
Модель будет работать в int8/int4.
Нужно минимизировать деградацию после квантования.
Нужно адаптировать модель под домен: медицина, юридика, код, SOC, DevOps, поддержка.
Нужно убрать нежелательные форматы или галлюцинации в узкой задаче.
Может сочетаться с
full fine-tuning;
LoRA;
QLoRA;
adapters;
prefix tuning;
IA3;
DoRA.
────────────────────
15. Instruction Tuning
Instruction Tuning — частный случай SFT, где модель учат реагировать на инструкции.
Примеры задач
Ответить по контексту.
Извлечь сущности.
Преобразовать текст в JSON.
Написать SQL по схеме БД.
Сделать summary.
Классифицировать обращение.
Сгенерировать конфиг, манифест, правило, regex.
Важно
Для instruction tuning критично качество данных:
разнообразие инструкций;
корректные ответы;
отсутствие противоречий;
единый формат;
отсутствие утечек PII и секретов;
проверка на prompt injection внутри обучающих примеров.
────────────────────
16. Continued Pretraining
Если нужно не просто научить модель отвечать в нужном формате, а дать ей новые знания, используют continued pretraining.
Когда нужен
Модель должна знать внутренний код, документацию, стандарты, регламенты.
Нужно адаптировать модель к специфичному языку предметной области.
Обычный SFT не помогает, потому что модели не хватает фактических знаний.
Есть большой корпус текстов: документация, тикеты, codebase, RFC, runbooks.
Форматы данных
Обычный текст.
Код.
Markdown.
JSON/YAML.
Логи.
Диффы.
Пары вопрос-ответ.
Контекст-продолжение.
Минусы
Требует больше данных и ресурсов.
Может вызвать катастрофическое забывание.
Нужно тщательно смешивать доменные и общие данные.
Сложнее оценить качество, чем у SFT.
────────────────────
17. RLHF
RLHF — Reinforcement Learning from Human Feedback.
Идея
Модель учат не только на готовых ответах, а на предпочтениях людей:
Код:
prompt -> answer A
prompt -> answer B
human: A better than B
Затем обучают reward model и оптимизируют политику модели.
Классический pipeline
SFT.
Сбор preference-данных.
Обучение reward model.
Оптимизация политики через PPO или другой RL-алгоритм.
Когда нужен
Нужно улучшить стиль, полезность, безопасность.
Есть качественные preference-данные.
Есть ресурсы на сложный pipeline.
Нужен контроль над поведением модели.
Минусы
Сложно.
Дорого.
Нестабильно.
Требует хорошей reward model.
Риск reward hacking.
Требует мониторинга деградации базовых навыков.
────────────────────
18. DPO
DPO — Direct Preference Optimization.
Идея
DPO пытается оптимизировать предпочтения напрямую, без отдельной reward model и сложного RL-цикла.
Когда полезен
Есть preference-данные.
Хочется проще, чем RLHF/PPO.
Нужно улучшить стиль, тон, безопасность, формат.
Нужно дообучить модель на парах лучший/худший ответ.
Плюсы
Проще RLHF.
Меньше компонентов.
Часто стабильнее PPO.
Хорошо сочетается с LoRA/QLoRA.
Минусы
Нужны качественные preference-данные.
Может переобучиться на шумные предпочтения.
Не всегда заменяет полноценный RLHF.
Пример использования через trl:
Python:
from trl import DPOTrainer
────────────────────
19. IPO, KTO, ORPO, SimPO, GRPO
Это семейство preference-optimization методов, альтернативных или родственных DPO.
IPO
Identity Preference Optimization.
Пытается улучшить стабильность preference-оптимизации.
KTO
Kahneman-Tversky Optimization.
Может работать с данными, где есть не только пары, а оценки хороший/плохой ответ.
ORPO
Odds Ratio Preference Optimization.
Объединяет SFT и preference-оптимизацию.
SimPO
Упрощённый preference optimization без reference model в некоторых реализациях.
Может быть проще и дешевле.
GRPO
Group Relative Policy Optimization.
Часто используется в reinforcement-сценариях, где ответы оцениваются относительно группы.
Когда это нужно
Есть данные вида preferred/rejected.
Нужно выровнять поведение модели.
Нужно уменьшить вредные, токсичные или нежелательные ответы.
Нужно улучшить следование инструкциям.
────────────────────
20. Rejection Sampling Fine-Tuning / RFT
Rejection Sampling Fine-Tuning — подход, где модель сама генерирует много ответов, затем лучшие из них отбираются и используются для дальнейшего обучения.
Pipeline
Модель генерирует несколько ответов на один prompt.
Ответы оцениваются:
reward model;
unit tests;
linting;
формальные проверки;
LLM-as-judge;
человек.
Лучшие ответы добавляются в SFT-датасет.
Модель дообучается на улучшенных данных.
Где особенно полезен
Код.
Математика.
Формальные задачи.
Генерация SQL.
Генерация конфигов.
Задачи с проверяемым результатом.
Плюсы
Можно автоматически улучшать датасет.
Хорошо работает, если есть объективная проверка.
Может быть дешевле полноценного RLHF.
Минусы
Нужен хороший критерий отбора.
Если reward model плохая, модель начнёт оптимизировать артефакты.
Может усилить bias или галлюцинации, если отбор некачественный.
────────────────────
21. Curriculum Learning
Curriculum Learning — это стратегия обучения, а не отдельный PEFT-метод.
Идея
Сначала модель обучают на более простых примерах, затем постепенно усложняют.
Пример
Короткие инструкции.
Простые ответы.
Более длинные контексты.
Сложные multi-step задачи.
Edge cases.
Negative examples.
Safety-примеры.
Когда полезно
Модель нестабильно обучается.
Данные разного качества.
Есть сложные и простые примеры.
Нужно уменьшить переобучение на шумных данных.
────────────────────
22. Multi-Task Learning
Модель обучают сразу на нескольких задачах.
Примеры задач
классификация;
summarization;
QA;
code generation;
SQL generation;
extraction;
rewriting;
safety refusal;
tool calling;
structured output.
Плюсы
Модель становится более универсальной.
Улучшается generalization.
Можно использовать одну модель под несколько сценариев.
Минусы
Задачи могут конфликтовать.
Нужно балансировать датасеты.
Нужно следить, чтобы одна задача не деградировала другую.
────────────────────
23. Mixture of Experts и adapter routing
Если задач много, можно использовать не одну большую адаптацию, а набор экспертов или адаптеров.
Варианты
LoRA per task.
Adapter per task.
Prefix per task.
Mixture of LoRA experts.
Router, который выбирает адаптер по задаче.
Dynamic adapter loading.
Когда полезно
Одна базовая модель должна обслуживать много задач.
Нужно быстро переключать домены.
Нужно экономить память и хранение.
Есть требования изоляции задач.
Минусы
Сложнее деплой.
Нужен routing.
Возможны конфликты между адаптерами.
Нужно тестировать комбинации.
────────────────────
24. Что выбрать на практике
Если нужно быстро и недорого дообучить LLM
Используйте:
LoRA;
QLoRA;
DoRA;
AdaLoRA.
Обычно это лучший старт.
────────────────────
Если VRAM очень мало
Смотрите в сторону:
QLoRA;
IA3;
Prompt Tuning;
Prefix Tuning;
P-Tuning v2;
BitFit как самый простой baseline.
────────────────────
Если нужно максимальное качество
Смотрите в сторону:
Full Fine-Tuning;
GaLore;
DoRA;
LoRA с большим рангом и правильными target modules;
Continued Pretraining + SFT;
Preference optimization после SFT.
────────────────────
Если нужно научить модель следовать инструкциям
Используйте:
SFT;
Instruction Tuning;
LoRA/QLoRA как параметрический метод;
DPO/KTO/ORPO, если есть preference-данные.
────────────────────
Если нужно улучшить безопасность, стиль, тон, отказ от вредных ответов
Используйте:
SFT на безопасных примерах;
DPO;
KTO;
RLHF;
rejection sampling;
red-team evaluation.
────────────────────
Если нужно дать модели новые знания
Используйте:
Continued Pretraining;
RAG вместо попытки вшить все знания в веса;
SFT поверх RAG;
доменные датасеты с контролем качества.
Важно: для фактических знаний часто лучше использовать RAG, чем пытаться полностью вшить знания в модель через fine-tuning.
────────────────────
Если нужно адаптировать модель под код
Используйте:
Continued pretraining на коде;
SFT на instruction-code задачах;
LoRA/QLoRA;
Rejection sampling с unit tests;
Evaluation на HumanEval, MBPP, internal repo tests.
────────────────────
Если нужно много задач на одной базовой модели
Используйте:
LoRA per task;
adapters;
prefix tuning;
mixture of adapters;
router-based PEFT.
────────────────────
25. Пример сравнения по смыслу
Без точных цифр, потому что всё зависит от модели, batch size, sequence length и стека:
Full Fine-Tuning
Максимальное качество.
Максимальная цена.
Нужны большие GPU.
LoRA
Хороший баланс качества и ресурсов.
Подходит для большинства задач.
Легко хранить адаптеры отдельно.
QLoRA
LoRA на квантованной базовой модели.
Хорошо для ограниченного VRAM.
Часто лучший выбор для локального дообучения.
DoRA / AdaLoRA
Потенциально лучше обычного LoRA.
Полезны, если LoRA не даёт нужного качества.
Adapters
Хороши для multi-task.
Могут добавлять overhead.
Prefix/Prompt Tuning
Очень дешёвые.
Могут быть слабее на сложных generative-задачах.
IA3
Очень компактный.
Может быть хорошей альтернативой LoRA.
DPO/KTO/ORPO
Не замена SFT/LoRA, а следующий этап выравнивания поведения.
────────────────────
26. Практический рекомендуемый pipeline
Для большинства задач разумный pipeline выглядит так:
Подготовить данные.
Очистить от секретов, PII, мусора.
Проверить формат ответов.
Сделать train/validation split.
Выбрать базовую модель.
Начать с LoRA или QLoRA.
Оценить качество.
Если качества мало:
увеличить ранг;
добавить больше target modules;
улучшить данные;
попробовать DoRA/AdaLoRA;
попробовать full FT или GaLore.
Если нужно улучшить поведение:
собрать preference-данные;
применить DPO/KTO/ORPO.
Сделать regression evaluation.
Проверить безопасность и prompt injection устойчивость.
Сохранить базовую модель и адаптеры отдельно.
────────────────────
27. Минимальный пример конфигурации LoRA
Python:
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("TARGET_MODEL")
config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=[
"q_proj",
"k_proj",
"v_proj",
"o_proj",
"gate_proj",
"up_proj",
"down_proj",
],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
model = get_peft_model(model, config)
model.print_trainable_parameters()