Як QLoRA донавчає великі моделі на малих GPU: основи 4-бітного підходу
Розбираємо QLoRA з нуля: чому повне донавчання дороге, як поєднуються LoRA-адаптери та 4-бітна квантизація і коли цей підхід пасує вашому проєкту.
Донавчання великої мовної моделі звучить як проєкт для лабораторії з щедрим фінансуванням: кілька потужних GPU, сотні гігабайтів відеопам’яті, дорога хмарна інфраструктура й гора навчальних даних. QLoRA (Quantized Low-Rank Adaptation) іде іншим шляхом. Ви стискаєте модель, приєднуєте до неї крихітну навчану частину й донавчаєте, витрачаючи значно менше пам’яті. Метод поєднує дві ідеї — квантизацію та LoRA, — і разом вони роблять параметро-ефективне донавчання доступним для набагато більшої кількості людей.
Що таке донавчання
Почнімо з попередньо навченої моделі. Вона вже багато знає: мову й граматику, програмування, загальні факти.
Language
Grammar
Programming
General knowledge
Reasoning patterns
Часто хочеться, щоб вона спеціалізувалася. Один шлях перетворює універсальну модель після донавчання на експерта одного типу:
General LLM
↓
Fine-tuning
↓
Medical assistant
Інший шлях робить із неї іншого фахівця:
General LLM
↓
Fine-tuning
↓
Legal document assistant
А третій дає ще одного:
General LLM
↓
Fine-tuning
↓
Agricultural assistant
Традиційний спосіб — оновлювати багато або всі параметри моделі, і саме тут починаються проблеми.
Чому повне донавчання коштує дорого
Мовні моделі можуть мати мільярди параметрів.
7 Billion parameters
13 Billion parameters
70 Billion parameters
Стандартному донавчанню потрібна пам’ять одразу під кілька речей: ваги, градієнти й не лише:
Model weights
+
Gradients
+
Optimizer states
+
Activations
Разом виходить величезний обсяг. Тож дослідники запитали себе: чи справді треба змінювати кожен параметр? Часто відповідь — ні.
LoRA
LoRA означає Low-Rank Adaptation (низькорангова адаптація). Вихідні ваги лишаються замороженими, а поряд із ними додаються невеликі навчані матриці.
Original Model
│
│ frozen
▼
┌─────────────┐
│ Base Weights│
└─────────────┘
+
┌─────────────┐
│ LoRA Adapter │ ← Train this
└─────────────┘
Мовою математики матрицю ваг W зазвичай редагують напряму. LoRA її не чіпає й навчає додаткову поправку, тож фактичні ваги стають W' = W + BA, де A і B — значно менші матриці. У підсумку навчається мала частка параметрів, а не мільярди.
Проблема, що лишається
LoRA скорочує набір навчаних параметрів, але базову модель усе одно треба завантажити в пам’ять. Візьмімо модель, ваги якої зберігаються як 16-бітні числа. Кожна вага займає 2 байти, тож моделі на 7B потрібно приблизно 7B x 2, близько 14 ГБ, лише під ваги. Навчання додає згори ще. А що, як зменшити саму модель? Цим і займається квантизація.
Квантизація
Квантизація — це зберігання чисел меншою кількістю бітів. Параметр може спершу зберігатися в 32-бітному форматі з рухомою комою.
FP32
32 bits
Далі його можна переводити у дедалі компактніші формати:
↓FP16
16 bits ↓INT8
8 bits ↓4-bit
4 bits
Якщо замість високоточного подання використати компактніше, витрата пам’яті помітно падає.
16-bit model
↓
4-bit quantized model
↓
Much lower memory requirement
Ціна питання — знижена точність може погіршити якість моделі. Завдання в тому, щоб заощадити пам’ять і не зіпсувати ту продуктивність, яка вам важлива.
Поєднуємо обидві ідеї
Об’єднайте два підходи — і отримаєте QLoRA.
Large LLM
│
▼
┌─────────────────┐
│ 4-bit Quantize │
└────────┬────────┘
│
▼
Frozen Base Model
│
+
┌────────────┐
│ LoRA │
│ Adapters │
└─────┬──────┘
│
▼
Train Only Adapters
Рецепт короткий: квантизувати базову модель, тримати її замороженою й навчати невеликі LoRA-адаптери.
Чому це важливо
Порівняймо два підходи на моделі 7B. Традиційне донавчання має такий вигляд:
Traditional Fine-Tuning
7B Model
↓
Train everything
↓
Huge memory requirement
QLoRA йде іншим шляхом:
7B Model
↓
4-bit quantization
↓
Freeze base model
↓
Add small LoRA adapters
↓
Train adapters
Вимоги до пам’яті можуть упасти в рази. Саме тому QLoRA привернула стільки уваги дослідників і розробників, які не мають доступу до великих GPU-кластерів.
Що відбувається під час навчання
Припустімо, у навчальних даних є репліка користувача з проханням пояснити фотосинтез десятирічній дитині:
User:
Explain photosynthesis to a 10-year-old.
і відповідна відповідь асистента:
Assistant:
Photosynthesis is the process...
Дані проходять через такий конвеєр:
Training Dataset
↓
Tokenization
↓
4-bit Base Model
↓
LoRA Layers
↓
Forward Pass
↓
Loss
↓
Backpropagation
↓
Update LoRA Parameters
Головне тут те, що величезна базова модель повністю не оновлюється. Оновлюються лише навчані параметри LoRA.
Трохи докладніше про математику
Візьмімо шар із вихідними вагами W. LoRA додає поправку delta W = BA, і адаптований шар дорівнює W' = W + delta W, тобто W + BA. Ранг A і B навмисно тримають малим. Ось шар у вихідному вигляді:
Original:
а версія LoRA — лише дві вузькі матриці:
4096 × 4096LoRA:4096 × 8
+
8 × 4096
Різниця велика. Замість 4096 x 4096 параметрів LoRA навчає близько 4096 x 8 + 8 x 4096, тобто набагато менше.
Не лише 4-бітна LoRA
Оригінальна робота про QLoRA додала кілька технік, які працюють разом. Найпомітніші наведено нижче.
4-bit NormalFloat
QLoRA використовує квантизацію NF4 (NormalFloat 4-bit), створену для ваг нейромереж, що мають нормальний розподіл.
Подвійна квантизація
Квантизації потрібна інформація про масштаб. QLoRA квантизує й самі ці константи, що дає додаткову економію пам’яті.
Сторінкові оптимізатори
Сторінкові оптимізатори (paged optimizers) допомагають керувати пам’яттю GPU та згладжують піки споживання, що виникають під час навчання.
Якщо зібрати все докупи, спрощена формула має такий вигляд:
QLoRA
=
4-bit Quantization
+
LoRA
+
Memory-efficient training techniques
Що виходить у підсумку
Важлива перевага донавчання в стилі LoRA — адаптер можна зберегти окремо.
Base Model
+
LoRA Adapter
=
Fine-Tuned Model
Замість іще однієї повної копії величезної базової моделі ви зберігаєте порівняно невеликий адаптер. Це спрощує експерименти. Одна базова модель може обслуговувати кілька завдань, у кожного — свій адаптер:
Base Model
│
├── Medical Adapter
├── Coding Adapter
├── Legal Adapter
└── Agriculture Adapter
QLoRA, LoRA та повне донавчання: порівняння
- Базова модель: під час повного донавчання оновлюється, у LoRA та QLoRA заморожена.
- Точність бази: у повному донавчанні й LoRA зазвичай вища, у QLoRA найчастіше 4 біти.
- Навчані параметри: величезна кількість у повному донавчанні, мало в LoRA та QLoRA.
- Пам’ять GPU: дуже багато в повному донавчанні, менше в LoRA, значно менше в QLoRA.
- Адаптер: у повному донавчанні немає, у LoRA та QLoRA є.
- Складність: висока в повному донавчанні, нижча в LoRA, помірна в QLoRA.
- Для обмежених GPU: повне донавчання — важко, LoRA та QLoRA — помітно краще.
QLoRA не вміє чарівним чином умістити будь-яку велику модель на будь-який GPU. Реальна витрата пам’яті залежить від розміру моделі, довжини послідовності, розміру батча, методу квантизації, оптимізатора, конфігурації LoRA, фреймворку й архітектури GPU. І все ж економія може бути суттєвою.
Типовий набір інструментів для QLoRA
Поширений стек будується на PyTorch:
PyTorch
│
┌───────┴────────┐
│ │
Transformers PEFT
│ │
└───────┬────────┘
│
bitsandbytes
│
▼
QLoRA
Звичні складники:
- PyTorch — фреймворк для глибинного навчання.
- Transformers — джерело попередньо навчених мовних моделей.
- PEFT — для параметро-ефективного донавчання.
- bitsandbytes — для квантизації та ощадних щодо пам’яті операцій.
Приклад
Уявіть, що вам потрібна AgriGPT — модель, яка відповідає на запитання про сільське господарство. Ви берете попередньо навчену LLM і надбудовуєте її так:
Pretrained LLM
↓
4-bit quantization
↓
Add LoRA adapters
↓
Agriculture dataset
↓
QLoRA training
↓
Agriculture adapter
Тепер модель можна спеціалізувати на сільськогосподарській тематиці, не донавчаючи її повністю. Користувач може запитати:
User:
My tomato leaves have yellow spots. What could be the reason?
а модель відповість приблизно так:
Model:
Possible causes include...
Ключовий момент: спеціалізацію здебільшого дають навчені параметри адаптера.
Коли QLoRA пасує
QLoRA добре підходить у таких ситуаціях:
- Модель — відкрита LLM, яку ви хочете донавчити.
- Пам’яті GPU мало.
- Потрібне саме параметро-ефективне навчання.
- Треба кілька адаптерів під різні завдання.
- Ви експериментуєте з предметно-орієнтованими моделями.
- Важливо тримати вартість навчання низькою.
Підхід погано пасує, якщо ваша мета вимагає навчити базову модель заново з нуля або суттєво її змінити.
Це не навчання з нуля
Ця відмінність дуже важлива. Навчання з нуля починається так:
Training from scratch
Random initialization
↓
Huge dataset
↓
Train entire model
QLoRA відштовхується від того, що вже існує:
Pretrained model
↓
Quantize
↓
Freeze
↓
Add LoRA
↓
Fine-tune adapter
QLoRA передбачає, що у вас уже є попередньо навчена модель.
Ширша ідея
QLoRA змінює погляд на розробку AI. Питання вже не в тому, як навчити гігантську модель, а в тому, як ефективно адаптувати наявну модель до свого завдання. Для студентів, дослідників, стартапів і розробників-одинаків це значно практичніше питання.
Скромніше залізо, сміливіші експерименти
Техніки на кшталт QLoRA роблять серйозні експерименти з моделями доступнішими. Майбутнє, можливо, не зведеться до такого:
Bigger Model
+
More GPUs
а дедалі частіше матиме такий вигляд:
Efficient Models
+
Efficient Fine-Tuning
+
Better Data
+
Better Evaluation
+
Specialized Adapters
Цікаво не лише робити моделі більшими, а й навчитися робити їх кориснішими за менших ресурсів.
Змініть трохи — отримайте багато
QLoRA — це квантизація плюс LoRA плюс економія пам’яті. Базова модель стискається до зниженої точності, лишається замороженою й адаптується через невеликі навчані матриці LoRA. Таке поєднання робить донавчання великих мовних моделей значно доступнішим. І, мабуть, головний урок у тому, що не завжди треба змінювати всю модель, щоб змінити її можливості. Іноді досить невеликого, ретельно навченого доповнення.