Загрузка урока...
Многие думают, что обучение нейросети — это нажать model.train() и пойти пить кофе. В реальности — это управление хаосом. Ваша модель будет пытаться «сжульничать»: запомнить ответы вместо того, чтобы понять логику. Ваша задача — поймать её за руку, глядя на графики Loss (функции потерь).
Сегодня мы настраиваем SFTTrainer — стандарт индустрии от HuggingFace, который берет на себя всю грязную работу с циклами обучения.
Мы используем библиотеку trl (Transformer Reinforcement Learning), в которой лежит SFTTrainer. Он идеально оптимизирован под Instruction Tuning.
Ключевые гиперпараметры (Ручки управления):
Learning Rate (Скорость обучения): Самый важный параметр.
Для QLoRA стандарт: 2e-4 (0.0002).
Если график скачет как кардиограмма — уменьшайте.
Если Loss не падает — увеличивайте.
Batch Size & Gradient Accumulation:
В GPU влезает мало примеров (например, per_device_train_batch_size = 2).
Но для стабильного обучения батч должен быть большим (например, 16 или 32).
Решение: gradient_accumulation_steps = 8. Мы копим градиенты 8 шагов и только потом обновляем веса (2 * 8 = 16 реальный батч).
Num Epochs: Для SFT обычно достаточно 1 эпохи (один проход по всем данным). Максимум 2-3. Дальше — зубрежка.
Код запуска:
Python
from trl import SFTTrainer
from transformers import TrainingArguments
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset, # Наш jsonl из урока 2
dataset_text_field="text", # Если используете сырой текст
max_seq_length=2048, # Длина контекста
args=TrainingArguments(
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
warmup_steps=5,
max_steps=60, # Или num_train_epochs=1
learning_rate=2e-4,
fp16=not torch.cuda.is_bf16_supported(),
bf16=torch.cuda.is_bf16_supported(),
logging_steps=1,
output_dir="outputs",
optim="paged_adamw_8bit", # Экономит память
),
)
trainer.train()
Вы подключили WandB (из Урока 3). Что вы там видите?
Идеальный сценарий: Линия Train Loss падает, линия Val Loss падает вслед за ней (чуть выше).
Overfitting (Переобучение): Train Loss продолжает падать (модель зубрит), а Val Loss начинает расти (модель глупеет на новых данных).
Действие: Остановить обучение немедленно (Early Stopping). Откатиться к чекпоинту, где Val Loss был минимальным.
Underfitting (Недообучение): Оба графика высокие и не падают.
Действие: Увеличить Learning Rate или проверить данные.
После обучения у вас не будет новой модели на 15 ГБ. У вас будет папка на 100 МБ, где лежат веса адаптера.
Python
model.save_pretrained("my_finetuned_model_lora")
tokenizer.save_pretrained("my_finetuned_model_lora")
Это — ваш интеллектуальный актив. Его можно накладывать на любую базовую Llama 3 той же версии.
Запустите обучение на вашем датасете.
Поставьте ограничение max_steps=50 (для теста, чтобы не ждать часы).
Посмотрите на лог: падает ли Loss? Если он упал с 2.5 до 0.8 — поздравляю, модель научилась. Если упал до 0.01 — вы переобучились (она просто запомнила 5 примеров).
В этом материале нет файлов для просмотра.