Обучение больших моделей с помощью QLoRA

QLoRA — это метод, который позволяет дообучать большие языковые модели (LLM) в сжатом 4-битном виде, экономя память и ресурсы. Он позволяет запускать fine-tuning даже на одной видеокарте вроде RTX 3060 или 3090.

В этой статье разберёмся:

  • Что такое QLoRA
  • Как она работает
  • Когда и зачем её использовать
  • Как на практике дообучить свою модель с помощью QLoRA

Что такое QLoRA

QLoRA (Quantized LoRA) сочетает два подхода:

  • Квантование — уменьшает размер модели, переводя её веса в 4-битный формат (вместо 16 или 32 бит)
  • LoRA (Low-Rank Adapters) — позволяет добавлять к модели небольшие обучаемые адаптеры, не изменяя сами веса модели

В результате:

  • Модель запускается в 4-битном формате (экономия VRAM)
  • Обучаются только LoRA-адаптеры (памяти нужно совсем немного)

Когда использовать QLoRA

Используйте QLoRA, если:

  • У вас нет доступа к A100 или H100, но есть обычная GPU (например, RTX 3090 24 ГБ)
  • Нужно быстро дообучить LLM под конкретную задачу (чат-бот, классификация, генерация)
  • Не хочется долго возиться с настройкой сложных фреймворков

Подготовка окружения

pip install transformers datasets peft accelerate bitsandbytes

Пример: дообучение модели на заголовках объявлений

Допустим, у вас есть файл ads.csv с колонками title и category, и вы хотите, чтобы LLM предсказывала категорию по заголовку.

1. Загрузка модели и токенизатора

from transformers import AutoTokenizer, AutoModelForCausalLM

model_name = "TheBloke/Mistral-7B-Instruct-v0.1-GPTQ"
tokenizer = AutoTokenizer.from_pretrained(model_name)

2. Подготовка модели к обучению

from peft import prepare_model_for_kbit_training, get_peft_model, LoraConfig

model = AutoModelForCausalLM.from_pretrained(model_name, load_in_4bit=True, device_map="auto")
model = prepare_model_for_kbit_training(model)

config = LoraConfig(
    r=8,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

model = get_peft_model(model, config)

3. Датасет и токенизация

from datasets import load_dataset

dataset = load_dataset("csv", data_files="ads.csv")

def format(example):
    return {
        "text": f"Заголовок: {example['title']}\nКатегория: {example['category']}"
    }

dataset = dataset.map(format)

def tokenize(example):
    return tokenizer(example["text"], padding=True, truncation=True, max_length=512)

tokenized = dataset.map(tokenize)

4. Обучение

from transformers import TrainingArguments, Trainer

args = TrainingArguments(
    output_dir="qlora-output",
    per_device_train_batch_size=4,
    num_train_epochs=3,
    logging_steps=10,
    learning_rate=2e-4,
    fp16=True
)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized["train"]
)

trainer.train()

5. Сохранение

model.save_pretrained("qlora-adapter")
tokenizer.save_pretrained("qlora-adapter")

Как использовать обученную модель

from peft import PeftModel

base = AutoModelForCausalLM.from_pretrained(model_name, load_in_4bit=True, device_map="auto")
model = PeftModel.from_pretrained(base, "qlora-adapter")

Теперь можно делать инференс как обычно: подавать запрос в модель, получая текст в ответ.


QLoRA — это простой и эффективный способ сделать свои LLM кастомными и обученными под задачу, не тратя тысячи долларов на аренду мощных GPU.