Головна / Статті / LoRA і QLoRA простими словами: донавчання 7B-моделі без 100 ГБ відеопам'яті

LoRA і QLoRA простими словами: донавчання 7B-моделі без 100 ГБ відеопам'яті

Чому повне донавчання потребує 80–100 ГБ, як низькорангові адаптери скорочують ваги, що навчаються, до 1,6%, як обрати ранг і цільові шари та що додає QLoRA.

1064 слів

LoRA стає зрозумілою лише тоді, коли видно, де вона розташована між попереднім навчанням і донавчанням, тож почнімо з цього.

Попереднє навчання й донавчання

Попереднє навчання відбувається, коли модель створюють уперше. Вона сама вчиться на послідовностях тексту, без жодної розмітки: навчальний текст сам дає і входи, і цілі, а в результаті виходить універсальна базова модель.

Знань у такої базової моделі багато, але певному формату, шаблону чи інструкції вона не слідує. Досить часто вона просто продовжує те, що ви набрали, і дописує в кінець ще слів. Це виправляє донавчання. Ви навчаєте модель на розмічених прикладах з інструкції, вхідних даних і бажаної відповіді, і вона дізнається, який вигляд мають хороші відповіді.

Припустімо, вам потрібна модель для юридичних запитів. Навчати з нуля нема чого, якщо вже є попередньо навчена модель із великим запасом знань про предметну галузь. Ви донавчаєте її, щоб вона відповідала по суті.

Чому повне донавчання таке важке

Оновлення всіх параметрів з'їдає пам'ять. Візьмімо 7B-модель Llama з такою конфігурацією:

Model size: 7 billion parameters
Training dtype: BF16 / FP16
Optimizer: AdamW
Sequence length: 2048

Саме лише завантаження базової моделі займає 14 ГБ. Під час повного донавчання навчається кожен параметр, отже, кожному потрібен градієнт, і якщо зберігати градієнти в BF16 чи FP16, це ще 14 ГБ. Оптимізатор AdamW просить згори приблизно 56 ГБ і може тримати копію параметрів у FP32, а це ще близько 28 ГБ. Частина йде й на активації. Загалом виходить 80–100 ГБ — забагато для вузької прикладної задачі, яка до того ж не така вже складна.

Що робить LoRA

LoRA розшифровується як Low-Rank Adaptation, низькорангова адаптація. Вона донавчає модель, не оновлюючи кожну вагу окремо. Усі вихідні ваги заморожені, а вчиться пара невеликих матриць.

Як маленькі матриці можуть керувати великою моделлю? Подумайте, що попередньо навчена модель уже знає: англійську, граматику, шаблони міркувань, програмування, факти. Якщо тепер треба, щоб вона відповідала на юридичні запитання в певному стилі, заново вчити мову їй не потрібно. Досить спрямувати те, що вже є. LoRA робить ставку на те, що така зміна зазвичай вкладається у структуру меншої розмірності:

ΔW = AB

Мільярди вивчених моделлю ваг лишаються недоторканими. LoRA не чіпає W і додає поправку згори:

W_new = W + ΔW

Розбираємо на числах

Уявіть трансформер з одним лінійним шаром:

X -> W -> Output

Нехай W має розмір 1000 на 1000. Тоді в ній:

1000 x 1000 = 1,000,000 parameters

Повне донавчання навчає всі ці параметри, а у справжніх LLM такі матриці всюди, тому в 7B-моделі навчати треба близько 7 млрд параметрів.

З LoRA ви створюєте дві вузькі матриці, A і B, та обираєте ранг, наприклад r = 8:

A = [1000 x 8]
b = [8 x 1000]

Їхній добуток має ту саму форму, що й W, тому сума коректна:

W_new = W + AB

[1000×1000] + [1000×1000]

Економія виникає з того, як мало параметрів у двох вузьких матрицях:

A: 1000 × 8 = 8,000
B: 8 × 1000 = 8,000

Total = 16,000 parameters

Порівняймо два підходи:

Full fine-tuning:
1,000,000 parameters

LoRA:
16,000 parameters

Для цього шару параметрів, що навчаються, лише 1,6% від початкової кількості.

Що означає ранг

Ранг — один із головних гіперпараметрів LoRA, і він задає місткість адаптера. Низький ранг, наприклад 4 чи 8, дає менший адаптер: він витрачає менше пам'яті, але менш гнучкий. Складним задачам може знадобитися 32, 64 або 128. Вищий ранг коштує більше пам'яті й не означає автоматично кращу якість, адже може додавати шум. Спробуйте кілька рангів і залиште той, що працює найкраще.

Куди ставити адаптери

LoRA прикріплює невеликі матриці, що навчаються, до замороженого трансформера, але матриць у трансформері багато. У спрощеному блоці decoder-only їх кілька, а модель може повторювати цей блок 32, 40, 80 і більше разів. Питання LoRA в тому, яким із цих матриць W потрібна поправка BA, що навчається. Три поширені стратегії:

Стратегія 1: лише q_proj і v_proj. Адаптер на q_proj може змінювати те, як представлення формують запити до релевантного контексту, а адаптер на v_proj змінює інформацію, яку передають токени, на які спрямовано увагу.

Стратегія 2: усі проєкції уваги. Додайте адаптери на q_proj, k_proj, v_proj і o_proj, і LoRA зможе змінювати всі основні навчені лінійні перетворення в увазі. Гнучкості більше, але й параметрів, що навчаються, теж.

Стратегія 3: проєкції уваги плюс шари MLP. Це більша й сильна універсальна конфігурація:

ATTENTION

q_proj       ✅
k_proj       ✅
v_proj       ✅
o_proj       ✅


MLP

gate_proj    ✅
up_proj      ✅
down_proj    ✅

Трансформер — це не лише увага. MLP виконує величезну частину навчених перетворень ознак, тож, охопивши і його, ви помітно розширюєте свободу донавчання.

Чи розв'язала LoRA проблему з пам'яттю?

Ні, не повністю. Вона скорочує кількість параметрів, що навчаються, приблизно на 99%, але відеопам'ять на 99% не зменшується: базову модель однаково треба завантажити, прямий прохід однаково виконується, ще й з невеликими додатковими обчисленнями. Справжній виграш — у градієнтах і станах оптимізатора. Зберігати градієнти для 7 млрд параметрів більше не потрібно.

QLoRA

QLoRA, квантована низькорангова адаптація, розвиває ідею ще на крок. Оскільки базові ваги й так заморожені, їх можна квантувати до 4 біт. 7B-модель, якій у BF16 потрібно 14 ГБ, стискається приблизно до 3,5–5 ГБ. Тому 7B-модель можна донавчити через QLoRA на одній ігровій відеокарті, тоді як звичайне повне донавчання потребувало б кількох GPU з великим обсягом пам'яті.