CoolFace
Modelpublic

Danilius228/llava-saiga-8b-lora-gqa-ru

sourceHugging Facellama3updated 2mo agoView on Hugging Face
0likes5downloads
Model Card

llava-saiga-8b-lora-gqa-ru

LoRA-адаптер к русскоязычной визуально-языковой модели deepvk/llava-saiga-8b, дообученный методом QLoRA на датасете GQA-ru. Адаптер повышает качество ответов на визуальные вопросы на русском языке. Работа выполнена в рамках летней практики VK Education.

Адаптер подключается поверх базовой модели и не содержит её весов.

Результаты

Полный прогон, протокол VK (для честного сравнения с опубликованными числами).

БенчмаркБазовая модельС адаптеромVK опубликовано
GQA-ru (exact-match)51.6153.1551.44
MMBench-ru (circular)55.3756.056.65

По GQA-ru адаптер превосходит опубликованное VK число (+1.71). По MMBench-ru результат в пределах статистического шума относительно базовой модели и опубликованного числа.

Использование

При загрузке обязательны два ручных фикса: у чекпоинтов deepvk стратегия выбора визуальных признаков в конфиге стоит default, хотя модель обучалась с full, а размер патча у процессора не заполняется автоматически. Без них адаптер даёт неверные ответы или падает.

python
import torch
from peft import PeftModel
from transformers import AutoProcessor, BitsAndBytesConfig, LlavaForConditionalGeneration

BASE = "deepvk/llava-saiga-8b"
ADAPTER = "Danilius228/llava-saiga-8b-lora-gqa-ru"

quant = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=True,
)

model = LlavaForConditionalGeneration.from_pretrained(
    BASE, quantization_config=quant, dtype=torch.bfloat16, device_map="cuda:0",
)
model.eval()

processor = AutoProcessor.from_pretrained(BASE)
processor.vision_feature_select_strategy = "full"                 # обязательный фикс
processor.patch_size = model.config.vision_config.patch_size      # обязательный фикс

model = PeftModel.from_pretrained(model, ADAPTER)                  # подключаем LoRA

Требуется transformers==4.57.3. Версия 5.x ломает LLaVA внутри get_placeholder_mask.

Обучение

ПараметрЗначение
МетодQLoRA (база в NF4, обучаются только адаптеры)
Ранг LoRA / alpha / dropout16 / 32 / 0.05
Целевые модулиq, k, v, o, gate, up, down проекции языковой части
Learning rate2e-4, косинусный планировщик, warmup 0.03
Эпохи1
Эффективный размер батча16
Обучающих примеров12 000 (GQA-ru train, seed=42)
ОборудованиеNVIDIA L4 (Colab Pro)

Зрительный энкодер и проектор «зрение → язык» заморожены; адаптеры добавлены только к линейным слоям языковой модели. При подсчёте функции потерь маскируются токены промпта и изображения — градиент идёт только от токенов ответа.

Ограничения

Дообучение на коротких открытых ответах GQA сдвигает модель в сторону краткого формата. Это помогает exact-match на GQA, но вредит логической проверке утверждений: в разборе ошибок 44 % вопросов, которые обучение испортило, — это инверсии да/нет. По MMBench-ru circular адаптер не превосходит опубликованное VK число, оставаясь в пределах шума.

MMBench-ru не использовался при обучении — только для оценки.

Ссылки

  • —Код, отчёт и инструкция запуска: https://github.com/KYBOEB/vk-practice
  • —Базовая модель: deepvk/llava-saiga-8b