Загрузка урока...
Представьте, что вам нужно отредактировать учебник по квантовой физике.
Full Fine-tuning: Вы переписываете весь учебник от руки, меняя пару параграфов. Долго, дорого.
LoRA (Low-Rank Adaptation): Вы берете стикеры (post-it notes), пишете на них правки и вклеиваете на нужные страницы. Учебник остается нетронутым, меняются только стикеры.
Сегодня мы учимся клеить эти «стикеры» на нейросеть.
Вместо того чтобы менять все 7 миллиардов весов модели, мы внедряем маленькие матрицы (A и B) в каждый слой. Мы обучаем только их. Вес итогового файла модели — 15 ГБ. Вес LoRA-адаптера — 100 МБ. Результат: Качество почти как у полной модели, а тренировать в 100 раз легче.
Буква Q означает Quantized. Мы сжимаем основную модель (учебник) до 4 бит (NF4 format) перед тем, как клеить стикеры. Это позволяет загрузить Llama-70B на одной карте, которая раньше тянула только 7B.
Вот конфиг, который вы будете писать в коде. Разберем, что значат эти цифры.
Python
from peft import LoraConfig
peft_config = LoraConfig(
r=16, # Rank: "Вместимость" адаптера.
# 8-16 — для простых задач (стиль).
# 64-128 — для сложных (новые знания/логика).
lora_alpha=32, # Scaling factor. Обычно ставят alpha = 2 * r.
# Влияет на то, как сильно адаптер меняет веса.
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
# Какие слои учим.
# СОВЕТ: Для Llama 3 учите ВСЕ линейные слои (как в списке).
# Это дает лучший результат, чем только q_proj и v_proj.
lora_dropout=0.05, # Защита от переобучения.
bias="none",
task_type="CAUSAL_LM",
)
Вот как мы загружаем модель с QLoRA (используя библиотеку unsloth для скорости, или классический transformers).
Python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
# Конфиг квантования (сжатия)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True, # Включаем 4 бита
bnb_4bit_use_double_quant=True, # Экономит еще немного памяти
bnb_4bit_quant_type="nf4", # Normal Float 4 (оптимально для весов)
bnb_4bit_compute_dtype=torch.float16
)
# Загрузка модели
model_id = "meta-llama/Meta-Llama-3-8B"
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config, # Применяем сжатие
device_map="auto"
)
# Подготовка к обучению
from peft import prepare_model_for_kbit_training
model = prepare_model_for_kbit_training(model)
model.add_adapter(peft_config) # Вставляем наши LoRA-адаптеры
Напишите Python-скрипт (или ячейку ноутбука), который загружает модель unsloth/llama-3-8b-bnb-4bit.
Создайте конфиг LoRA с rank=16 и таргетом на все линейные модули.
Выведите в консоль команду model.print_trainable_parameters().
Ожидаемый результат: Вы должны увидеть, что обучаемых параметров всего около 1-2% (например, 40 млн из 8 млрд). Это и есть магия LoRA.
VRAM — это бутылочное горлышко. Используйте QLoRA (4-бит), чтобы запускать обучение на доступном железе.
Rank (r) — главный рычаг. Не ставьте 256, если учите модель шутить. Ставьте 8 или 16.
Target Modules: Учите все линейные слои (q,k,v,o,gate,up,down), если хотите, чтобы модель действительно поумнела, а не просто запомнила пару фраз.
В этом материале нет файлов для просмотра.