Глава 4.7 — Параметрически эффективное дообучение: LoRA и QLoRA
Содержание
- Почему полное дообучение перестаёт быть практичным
- LoRA: обучение низкорангового обновления вместо полного
- Почему низкорангового обновления достаточно
- Куда встраиваются адаптеры и как они сливаются обратно при инференсе
- QLoRA: квантование замороженной базы
- Арифметика памяти: что вы реально экономите
- Ограничения и когда полное дообучение всё ещё выигрывает
- Взгляд с точки зрения интервью
- Вопросы для самопроверки
- Источники
1. Почему полное дообучение перестаёт быть практичным
Главы 4.5 и 4.6 описывали SFT, RLHF, DPO и их альтернативы так, будто обновление «модели» во время дообучения не влечёт за собой никаких дополнительных сложностей, кроме выбора правильной цели обучения. Это не так. Полное дообучение означает запуск градиентного спуска по каждому параметру предобученной модели, а глава 4.4 уже установила, во что это обходится: градиенты того же размера, что и веса, и — для Adam, оптимизатора, которым пользуется практически каждый, — ещё два буфера того же размера для скользящих оценок моментов. Сложите это в смешанной точности, и полное дообучение потребует порядка четырёх размеров сырого объёма параметров модели только на веса, градиенты и состояние оптимизатора, ещё до того, как будет сохранена хоть одна активация. Для модели с 7 миллиардами параметров это уверенно выходит за пределы того, что вмещает одна потребительская или даже одна датацентровая видеокарта; для чего угодно за пределами примерно 30 миллиардов параметров это требует именно той машинерии шардирования на несколько GPU — ZeRO, FSDP, — которую глава 4.4 разбирала применительно к самому предобучению.
С этой ценой было бы легче смириться, если бы каждый прогон дообучения требовал сдвинуть каждый параметр на значимую величину. Это не обязательно так, и остальная часть этой главы посвящена семейству методов, которые эксплуатируют этот факт напрямую: заморозить почти все предобученные веса и обучать лишь небольшое число новых параметров, улавливающих именно то, что реально требуется целевой задаче. Сделанное хорошо, это уменьшает число обучаемых параметров на несколько порядков, что уменьшает память под состояние оптимизатора и градиенты в те же разы — а именно эти два фактора и доминируют в счёте за память при полном дообучении, — оставляя при этом базовую способность модели, установленную дорогим предобучением, полностью нетронутой.
2. LoRA: обучение низкорангового обновления вместо полного
Low-Rank Adaptation, LoRA, предложенная Ху (Hu) с соавторами, задаёт простой вопрос о любой весовой матрице $W \in \mathbb{R}^{d \times k}$, которую дообучение иначе обновляло бы на месте: что, если вместо обучения произвольного обновления $\Delta W$ той же формы, что и $W$, ограничить $\Delta W$ так, чтобы она была низкоранговой? Конкретно, LoRA полностью замораживает предобученную $W$ и представляет обновление как произведение двух гораздо меньших матриц, $$\Delta W = BA, \qquad B \in \mathbb{R}^{d \times r},\ A \in \mathbb{R}^{r \times k},$$ где ранг $r$ выбирается значительно меньшим, чем $d$ или $k$, — обычно однозначные числа или несколько десятков против скрытых размерностей в тысячи. Прямой проход через адаптированный слой становится $$h = Wx + \frac{\alpha}{r}\,BAx,$$ где $\alpha$ — фиксированный гиперпараметр масштабирования, позволяющий настраивать эффективную скорость обучения адаптера независимо от $r$. $A$ инициализируется небольшими случайными значениями, а $B$ инициализируется строго нулём, так что $\Delta W = 0$ в самом начале обучения — адаптированная модель численно идентична замороженной предобученной модели до того, как сделан хотя бы один шаг градиента, а обучение затем постепенно раскрывает низкоранговое обновление с нуля.
Градиенты получают только $B$ и $A$; $W$ — никогда. В экспериментах из оригинальной статьи применение этого лишь к проекционным матрицам внимания ($W_q$ и $W_v$) GPT-3 175B при ранге 4 сократило число обучаемых параметров примерно на четыре порядка относительно полного дообучения, при этом соответствуя или превосходя качество полного дообучения на целевых задачах. Именно последнее и есть неожиданная часть: ограничение обновления крошечной долей размерности полного пространства параметров почти ничего не стоит по качеству — на задачах и масштабах, которые измеряла статья.
3. Почему низкорангового обновления достаточно
Эмпирическое обоснование центральной ставки LoRA предшествует самой статье. Работа Агаджаняна (Aghajanyan) с соавторами о внутренней размерности (intrinsic dimensionality) дообучения показала, что обновление параметров, необходимое для адаптации предобученной языковой модели под конкретную целевую задачу, живёт в удивительно низкоразмерном подпространстве — гораздо более низкоразмерном, чем предполагало бы сырое число параметров модели, — и что эта внутренняя размерность дополнительно уменьшается по мере роста базовой модели. Другими словами, более крупные предобученные модели не просто становятся лучше — их становится легче специализировать, поскольку всё, что нужно изменить для их специализации, оказывается заключено во всё более маленькое подпространство полного пространства параметров. Разложение LoRA ранга $r$ — это прямая, структурная ставка именно на этот результат: если полезное обновление действительно живёт вблизи низкоразмерного подпространства, матричное произведение ранга $r$ может представить почти всё это подпространство при небольшом $r$, а параметры, которые LoRA не тратит на улавливание этого подпространства, не являются упущенным потенциалом — они всё равно никогда не сдвинулись бы от нуля в сколько-нибудь полезном направлении.
Это объясняет, почему качество LoRA держится настолько хорошо относительно полного дообучения при удивительно малых рангах (чаще всего $r$ принимает значения от 4 до 16 для широкого диапазона задач и размеров моделей), а не требует, чтобы $r$ рос вместе со скрытой размерностью модели. Это также предсказывает — и предсказание подтверждается, — что эффект становится более выраженным при увеличении масштаба модели: ровно в том направлении, куда указывает результат Агаджаняна (Aghajanyan) с соавторами, и ровно то, что подтверждают собственные абляции LoRA на последовательно увеличивающихся моделях.
4. Куда встраиваются адаптеры и как они сливаются обратно при инференсе
LoRA в принципе можно прикрепить к любому линейному слою — проекциям внимания, матрицам полносвязного слоя или и тем, и другим, — и собственные абляции оригинальной статьи показали, что распределение фиксированного бюджета параметров по большему числу проекций внимания (вместо концентрации его на одной лишь $W_q$ при более высоком ранге) работает лучше, что говорит о том, что полезное низкоранговое обновление распределено по нескольким проекциям, а не сосредоточено в одной. На практике выбор, какие именно матрицы адаптировать и с каким рангом, — одна из немногих гиперпараметрических поверхностей, которые этот метод всё же оставляет вам, и разные целевые задачи могут предпочитать разные выборы.
Деталь, которую стоит знать точно на интервью, — что происходит при развёртывании. Поскольку $\Delta W = BA$ имеет ровно ту же форму, что и $W$, можно один раз, офлайн, вычислить $W' = W + \frac{\alpha}{r}BA$ и обслуживать напрямую $W'$ — развёрнутая модель представляет собой одну обычную плотную матрицу на каждый адаптированный слой, неотличимую по структуре и стоимости инференса от модели, прошедшей полное дообучение. Это настоящее преимущество перед более ранним семейством параметрически эффективных методов — bottleneck-адаптерами (Хоулсби (Houlsby) с соавторами), которые вставляют небольшой дополнительный полносвязный блок последовательно между существующими слоями: такие адаптеры добавляют реальную стоимость прямого прохода при инференсе, на каждый запрос, навсегда, поскольку это отдельное вычисление, которое обязано выполняться последовательно. Обновление LoRA аддитивно к уже существующей матрице, а не является новым последовательным шагом, поэтому слияние полностью убирает адаптер как затраты времени выполнения. Компромисс в том, что слияние привязывает вас к одному адаптеру за раз на одну обслуживаемую копию весов — обслуживание много разных адаптеров под конкретные задачи одновременно поверх одной и той же базовой модели означает либо держать их несведёнными и платить небольшую цену за пакетное матричное умножение на запрос, либо держать несколько сведённых копий полных весов, по одной на адаптер.
5. QLoRA: квантование замороженной базы
LoRA уже резко уменьшает память под состояние оптимизатора и градиенты, делая почти каждый параметр замороженным. QLoRA, предложенная Деттмерсом (Dettmers) с соавторами, задаёт следующий вопрос: если $W$ заморожена и никогда не получает градиент, обязательно ли ей находиться в памяти в 16-битной точности? Ответ QLoRA — квантовать всю замороженную базовую модель до 4 бит, используя специально построенный тип данных под названием NF4 (4-bit NormalFloat), уровни квантования которого выбраны информационно-теоретически оптимальными для весов, которые приблизительно нормально распределены, — конкретно, 16 представимых уровней размещены в квантилях стандартного нормального распределения, так что каждый уровень покрывает равную долю вероятностной массы, а не равный отрезок числового диапазона, — а именно так эмпирически и распределены веса предобученных трансформеров, — вместо использования обобщённой равномерной схемы квантования, которая тратит точность на значения, далёкие от того места, где реально сосредоточена масса распределения весов.
Два дополнительных приёма делают это практичным, а не только теоретически привлекательным. Двойное квантование (double quantization) применяет второй раунд квантования к самим константам квантования (поблочным коэффициентам масштаба, которые любая поблочная схема квантования обязана хранить), отсекая дополнительную память, которая иначе тратилась бы на учётную информацию, а не на сами веса. Оптимизаторы со страничной подкачкой (paged optimizers) используют унифицированную страничную подкачку памяти NVIDIA, чтобы автоматически перемещать состояние оптимизатора между памятью GPU и CPU во время редких, непредсказуемых всплесков, которые может вызвать чекпоинтинг активаций (gradient checkpointing — пересчёт вместо хранения некоторых активаций, обмен вычислений на память; см. главу 4.4), избегая аварийного завершения из-за нехватки памяти вместо того, чтобы требовать постоянно резервировать запас памяти под наихудший случай, который случается на малой доле шагов. Во время прямого и обратного прохода 4-битные веса на лету деквантуются обратно до вычислимой точности, слой за слоем, так что сама арифметика по-прежнему происходит с разумной точностью — 4 бита — это формат хранения, а не формат вычислений.
Результат, о котором сообщает статья про QLoRA, поразителен сам по себе: дообучение модели с 65 миллиардами параметров на одной видеокарте с 48 ГБ памяти, соответствующее качеству полного 16-битного дообучения на измеренных задачах, — в масштабе, который иначе потребовал бы десятков топовых GPU просто для того, чтобы вместить модель. Эта комбинация — замороженная, квантованная база плюс небольшие адаптеры LoRA полной точности поверх неё — сейчас стандартный рецепт дообучения крупных моделей с открытыми весами на оборудовании, значительно меньшем, чем иначе потребовала бы сама базовая модель.
6. Арифметика памяти: что вы реально экономите
Стоит проработать конкретные числа, а не оставлять экономию качественным утверждением. Возьмём модель с 7 миллиардами параметров. Полное дообучение в смешанной точности требует примерно: 2 байта на параметр под fp16-веса, 2 байта на параметр под fp16-градиенты, и — для Adam — два fp32-буфера моментов оптимизатора плюс (обычно) fp32-копию мастер-весов, ещё 12 байт на параметр. Это порядка 16 байт на параметр, или около 112 ГБ для 7 миллиардов параметров, ещё до учёта хотя бы одной активации — далеко за пределами одной видеокарты с 24 ГБ или даже 80 ГБ без шардирования по нескольким устройствам.
LoRA полностью меняет картину, поскольку 7 миллиардов замороженных базовых весов не требуют вообще никаких градиентов и никакого состояния оптимизатора — им нужно лишь находиться в памяти с точностью инференса, примерно 14 ГБ в fp16. Обучаемые параметры LoRA, при ранге, достаточно низком, чтобы прикрепить их к каждой проекции внимания по всем слоям 7-миллиардной модели, обычно измеряются десятками миллионов, у нижней границы этого диапазона, а не миллиардами, — часто заметно меньше 1% от числа параметров базовой модели. Именно эти десятки миллионов параметров — единственные, кому нужны градиенты и состояние Adam, примерно по той же ставке в 16 байт на параметр, добавляя заметно меньше гигабайта. Итог составляет около 15 ГБ вместо 112 ГБ — уверенно помещается в одну потребительскую видеокарту.
QLoRA дополнительно урезает доминирующую оставшуюся статью расходов, замороженные базовые веса, примерно в 4 раза: 4-битное хранение означает, что та же самая 7-миллиардная база занимает около 3,5–4 ГБ вместо 14 ГБ, при этом небольшие адаптеры LoRA вносят тот же незначительный вклад, что и раньше. Масштабируя это до заглавного случая из статьи, модель с 65 миллиардами параметров, которой потребовался бы порядка терабайта памяти для полного 16-битного дообучения, помещается в квантованном виде менее чем в 48 ГБ — именно поэтому дообучение моделей такого размера на одной видеокарте стало рутинной практикой, а не исследовательским курьёзом.
7. Ограничения и когда полное дообучение всё ещё выигрывает
Предположение о низком ранге — это эмпирическая ставка, а не гарантия, и оно может не выполняться так же чисто для задач, которые реально требуют от модели приобрести новое знание или поведение, далёкое от чего-либо в её предобучающем распределении, а не переоценки и рекомбинации способностей, которые у неё уже есть. В таких случаях разрыв между LoRA и полным дообучением может увеличиваться, а обычный ответ — повышение ранга $r$ или адаптация большего числа весовых матриц сети — начинает съедать обратно ту самую параметрическую эффективность, ради которой LoRA изначально и выбирали, без гарантии полностью закрыть разрыв.
Обслуживание множества адаптеров под конкретные задачи одновременно поверх общей базовой модели — настоящая сильная сторона несведённой формы (много маленьких пар $(B, A)$ вместо множества полных копий модели), но это означает, что развёртывание устроено сложнее, чем «просто запустить модель», — требуется инфраструктура, которая выбирает и применяет нужный адаптер на каждый запрос, вопрос системного проектирования, который глава 6.1 разбирает напрямую. А изящный трюк слияния LoRA не переносится на QLoRA столь же гладко: слияние $BA$ с базовой матрицей, хранящейся в 4-битном NF4, — это не простое сложение, как в случае 16-битной базы, поэтому развёрнутая модель QLoRA обычно либо деквантует базу обратно до точности, допускающей слияние (возвращая часть экономии памяти уже на этапе обслуживания), либо держит адаптер несведённым и применяет его вместе с квантованной базой при инференсе, платя небольшую цену времени выполнения — ровно то, чего трюк слияния обычной LoRA был специально придуман избежать.
Вместе с обучением с учителем, оптимизацией предпочтений и техниками выравнивания из глав 4.5 и 4.6 параметрически эффективное дообучение завершает рассказ этой части о том, как предобученная модель превращается в нечто полезное: обученную следовать инструкциям, выровненную так, чтобы приемлемо вести себя под давлением, и теперь ещё и дёшево адаптируемую под любую конкретную задачу или домен, без необходимости каждый раз платить полную цену полного дообучения. Чего всё это не касается — это совсем другая ось: что модель с фиксированным набором весов делает на этапе инференса и можно ли заставить её думать дольше и тщательнее над конкретной задачей, прежде чем остановиться на первом же пришедшем в голову ответе, вместо того чтобы просто выдавать свою лучшую первую догадку. Именно с этого вопроса начинается Часть V — с главы 5.1 «Reasoning and Test-Time Compute» («Рассуждение и вычисления на этапе инференса»).
8. Взгляд с точки зрения интервью
Серьёзное интервью по LLM редко попросит вывести математику LoRA с нуля, но проверит, понимаете ли вы, откуда именно берётся экономия и чем она оплачивается, — обычно через вопросы вроде:
- «Почему заморозка базовых весов экономит память, если очень маленькая скорость обучения на всех параметрах тоже дала бы небольшое обновление?» — сильный ответ указывает, что экономия происходит из полного устранения градиентов и состояния оптимизатора для замороженных параметров, а не из численной малости самого обновления; крошечная скорость обучения, применённая ко всем параметрам, всё равно требует хранить градиент и состояние Adam для каждого из них.
- «Как LoRA избегает добавления задержки на инференсе, если методы дообучения на основе адаптеров в целом славятся именно этим?» — сильный ответ различает аддитивное, сливаемое обновление LoRA ($W' = W + \frac{\alpha}{r}BA$, той же формы, что и $W$) и последовательно вставленные bottleneck-адаптеры (Хоулсби (Houlsby) с соавторами), которые выполняются как дополнительный шаг прямого прохода на каждом вызове инференса и не могут быть слиты и убраны.
- «Что на самом деле предполагается, когда вы выбираете ранг $r$, и почему это обычно работает даже при очень малых значениях?» — сильный ответ связывает это с результатом о внутренней размерности, предшествующим LoRA: полезное обновление дообучения для данной задачи, как считается, живёт в низкоразмерном подпространстве полного пространства параметров, и это подпространство дополнительно уменьшается по мере роста базовой модели, что и объясняет, почему малых, примерно не зависящих от размера модели рангов обычно достаточно.
- «Что QLoRA добавляет поверх LoRA, и какую конкретную проблему решает каждая часть?» — сильный ответ аккуратно разделяет три части: 4-битное квантование замороженной базы в NF4 урезает доминирующую оставшуюся статью расходов памяти; двойное квантование отсекает накладные расходы на сами константы квантования; а оптимизаторы со страничной подкачкой поглощают всплески памяти от чекпоинтинга активаций без необходимости резервировать постоянный запас под наихудший случай.
Сквозная мысль, которую проверяют интервьюеры, — способны ли вы проследить затраты памяти и вычислений до их реального источника (замороженные против обучаемых параметров, слитое против последовательного вычисления, точность хранения против точности вычислений), а не воспринимать «LoRA эффективнее» как непрозрачный факт, который остаётся лишь процитировать.
9. Вопросы для самопроверки
- Почему заморозка почти всех параметров — а не уменьшение обновления каждого параметра — даёт бóльшую часть экономии памяти LoRA?
- В чём состоит результат о внутренней размерности, мотивирующий ограничение $\Delta W$ низким рангом, и как он меняется с масштабом модели?
- Почему адаптер LoRA можно слить с базовой весовой матрицей без какой-либо дополнительной стоимости инференса, а bottleneck-адаптер (в духе Хоулсби, Houlsby) — нельзя?
- Чем тип данных NF4 отличается от обобщённой схемы 4-битного квантования, и почему это важно именно для предобученных весов?
- Что такое оптимизатор со страничной подкачкой, и какой конкретно сбой он предотвращает во время дообучения QLoRA?
- Опишите сценарий дообучения, в котором вы ожидали бы, что LoRA уступит полному дообучению, и объясните почему в терминах предположения о низком ранге.
10. Источники
- Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., Wang, L., & Chen, W. (2021). LoRA: Low-Rank Adaptation of Large Language Models. ICLR 2022. arXiv:2106.09685. https://arxiv.org/abs/2106.09685
- Dettmers, T., Pagnoni, A., Holtzman, A., & Zettlemoyer, L. (2023). QLoRA: Efficient Finetuning of Quantized LLMs. NeurIPS 2023. arXiv:2305.14314. https://arxiv.org/abs/2305.14314
- Aghajanyan, A., Zettlemoyer, L., & Gupta, S. (2020). Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning. arXiv:2012.13255. https://arxiv.org/abs/2012.13255
- Houlsby, N., Giurgiu, A., Jastrzebski, S., Morrone, B., de Laroussilhe, Q., Gesmundo, A., Attariyan, M., & Gelly, S. (2019). Parameter-Efficient Transfer Learning for NLP. ICML 2019. arXiv:1902.00751. https://arxiv.org/abs/1902.00751