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.