Llava
Large Language and Vision Assistant. Обеспечивает визуальную настройку инструкций и диалоги на основе изображений. Объединяет CLIP-кодировщик изображений с языковыми моделями Vicuna/LLaMA. Поддерживает многократный диалог по изображениям, ответы на визуальные вопросы и следование инструкциям. Используется для создания визуально-языковых чат-ботов или задач понимания изображений. Лучше всего подходит для диалогового анализа изображений.
Метаданные навыка
| Источник | Опционально — установка через vibeos skills install official/mlops/llava |
| Путь | optional-skills/mlops/llava |
| Версия | 1.0.0 |
| Автор | Orchestra Research |
| Лицензия | MIT |
| Зависимости | transformers, torch, pillow |
| Платформы | linux, macos, windows |
| Теги | LLaVA, Vision-Language, Multimodal, Visual Question Answering, Image Chat, CLIP, Vicuna, Conversational AI, Instruction Tuning, VQA |
Справочник: полный SKILL.md
Ниже приведено полное описание навыка, которое VibeOS загружает при его активации. Агент видит эти инструкции, когда навык активен.
LLaVA — Large Language and Vision Assistant
Модель «зрение-язык» с открытым исходным кодом для диалогового понимания изображений.
Когда использовать LLaVA
Используйте, когда:
- Создаёте визуально-языковые чат-боты
- Нужны ответы на визуальные вопросы (VQA)
- Требуется описание и подписи к изображениям
- Ведёте многократные диалоги по изображениям
- Нужно следовать визуальным инструкциям
- Анализируете документы с изображениями
Метрики:
- Более 23 000 звёзд на GitHub
- Возможности уровня GPT-4V (целевые)
- Лицензия Apache 2.0
- Несколько размеров модели (7B–34B параметров)
Используйте альтернативы, если:
- GPT-4V: наивысшее качество, API-based
- CLIP: простая zero-shot классификация
- BLIP-2: лучше только для подписей
- Flamingo: исследовательская, не open-source
Быстрый старт
Установка
# Клонирование репозитория
git clone https://github.com/haotian-liu/LLaVA
cd LLaVA
# Установка
pip install -e .
Базовое использование
from llava.model.builder import load_pretrained_model
from llava.mm_utils import get_model_name_from_path, process_images, tokenizer_image_token
from llava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN
from llava.conversation import conv_templates
from PIL import Image
import torch
# Загрузка модели
model_path = "liuhaotian/llava-v1.5-7b"
tokenizer, model, image_processor, context_len = load_pretrained_model(
model_path=model_path,
model_base=None,
model_name=get_model_name_from_path(model_path)
)
# Загрузка изображения
image = Image.open("image.jpg")
image_tensor = process_images([image], image_processor, model.config)
image_tensor = image_tensor.to(model.device, dtype=torch.float16)
# Создание диалога
conv = conv_templates["llava_v1"].copy()
conv.append_message(conv.roles[0], DEFAULT_IMAGE_TOKEN + "\nЧто изображено на этой картинке?")
conv.append_message(conv.roles[1], None)
prompt = conv.get_prompt()
# Генерация ответа
input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).to(model.device)
with torch.inference_mode():
output_ids = model.generate(
input_ids,
images=image_tensor,
do_sample=True,
temperature=0.2,
max_new_tokens=512
)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True).strip()
print(response)
Доступные модели
| Модель | Параметры | VRAM | Качество |
|---|---|---|---|
| LLaVA-v1.5-7B | 7B | ~14 ГБ | Хорошее |
| LLaVA-v1.5-13B | 13B | ~28 ГБ | Лучше |
| LLaVA-v1.6-34B | 34B | ~70 ГБ | Наилучшее |
# Загрузка разных моделей
model_7b = "liuhaotian/llava-v1.5-7b"
model_13b = "liuhaotian/llava-v1.5-13b"
model_34b = "liuhaotian/llava-v1.6-34b"
# 4-битное квантование для меньшего VRAM
load_4bit = True # Уменьшает VRAM примерно в 4 раза
Использование в CLI
# Одиночный запрос к изображению
python -m llava.serve.cli \
--model-path liuhaotian/llava-v1.5-7b \
--image-file image.jpg \
--query "Что изображено на этой картинке?"
# Многократный диалог
python -m llava.serve.cli \
--model-path liuhaotian/llava-v1.5-7b \
--image-file image.jpg
# Затем вводите вопросы интерактивно
Веб-интерфейс (Gradio)
# Запуск интерфейса Gradio
python -m llava.serve.gradio_web_server \
--model-path liuhaotian/llava-v1.5-7b \
--load-4bit # Опционально: уменьшить VRAM
# Доступ по адресу http://localhost:7860
Многократные диалоги
# Инициализация диалога
conv = conv_templates["llava_v1"].copy()
# Шаг 1
conv.append_message(conv.roles[0], DEFAULT_IMAGE_TOKEN + "\nЧто изображено на этой картинке?")
conv.append_message(conv.roles[1], None)
response1 = generate(conv, model, image) # "Собака играет в парке"
# Шаг 2
conv.messages[-1][1] = response1 # Добавление предыдущего ответа
conv.append_message(conv.roles[0], "Какая порода собаки?")
conv.append_message(conv.roles[1], None)
response2 = generate(conv, model, image) # "Золотистый ретривер"
# Шаг 3
conv.messages[-1][1] = response2
conv.append_message(conv.roles[0], "Какое время суток?")
conv.append_message(conv.roles[1], None)
response3 = generate(conv, model, image)
Типовые задачи
Подписи к изображениям
question = "Опиши это изображение подробно."
response = ask(model, image, question)
Ответы на визуальные вопросы
question = "Сколько людей на изображении?"
response = ask(model, image, question)
Обнаружение объектов (текстовое)
question = "Перечисли все объекты, которые ты видишь на этом изображении."
response = ask(model, image, question)
Понимание сцены
question = "Что происходит на этой сцене?"
response = ask(model, image, question)
Понимание документов
question = "Какова основная тема этого документа?"
response = ask(model, document_image, question)
Обучение собственной модели
# Этап 1: Выравнивание признаков (558K пар изображение-подпись)
bash scripts/v1_5/pretrain.sh
# Этап 2: Визуальная настройка инструкций (150K данных инструкций)
bash scripts/v1_5/finetune.sh
Квантование (уменьшение VRAM)
# 4-битное квантование
tokenizer, model, image_processor, context_len = load_pretrained_model(
model_path="liuhaotian/llava-v1.5-13b",
model_base=None,
model_name=get_model_name_from_path("liuhaotian/llava-v1.5-13b"),
load_4bit=True # Уменьшает VRAM примерно в 4 раза
)
# 8-битное квантование
load_8bit=True # Уменьшает VRAM примерно в 2 раза
Лучшие практики
- Начинайте с модели 7B — хорошее качество, управляемый VRAM
- Используйте 4-битное квантование — значительно уменьшает VRAM
- Требуется GPU — инференс на CPU крайне медленный
- Чёткие запросы — конкретные вопросы дают лучшие ответы
- Многократные диалоги — сохраняйте контекст разговора
- Температура 0.2–0.7 — баланс креативности и последовательности
- max_new_tokens 512–1024 — для подробных ответов
- Пакетная обработка — обрабатывайте несколько изображений последовательно
Производительность
| Модель | VRAM (FP16) | VRAM (4-bit) | Скорость (токенов/с) |
|---|---|---|---|
| 7B | ~14 ГБ | ~4 ГБ | ~20 |
| 13B | ~28 ГБ | ~8 ГБ | ~12 |
| 34B | ~70 ГБ | ~18 ГБ | ~5 |
На GPU A100
Бенчмарки
LLaVA достигает конкурентоспособных результатов на:
- VQAv2: 78.5%
- GQA: 62.0%
- MM-Vet: 35.4%
- MMBench: 64.3%
Ограничения
- Галлюцинации — может описывать то, чего нет на изображении
- Пространственное мышление — сложности с точным определением местоположения
- Мелкий текст — трудности с чтением мелкого шрифта
- Подсчёт объектов — неточен для большого количества объектов
- Требования к VRAM — нужен мощный GPU
- Скорость инференса — медленнее, чем CLIP
Интеграция с фреймворками
LangChain
from langchain.llms.base import LLM
class LLaVALLM(LLM):
def _call(self, prompt, stop=None):
# Пользовательский инференс LLaVA
return response
llm = LLaVALLM()
Приложение Gradio
import gradio as gr
def chat(image, text, history):
response = ask_llava(model, image, text)
return response
demo = gr.ChatInterface(
chat,
additional_inputs=[gr.Image(type="pil")],
title="LLaVA Chat"
)
demo.launch()
Ресурсы
- GitHub: https://github.com/haotian-liu/LLaVA ⭐ 23 000+
- Статья: https://arxiv.org/abs/2304.08485
- Демо: https://llava-vl.github.io
- Модели: https://huggingface.co/liuhaotian
- Лицензия: Apache 2.0