Перейти к основному содержимому

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-7B7B~14 ГБХорошее
LLaVA-v1.5-13B13B~28 ГБЛучше
LLaVA-v1.6-34B34B~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 раза

Лучшие практики​

  1. Начинайте с модели 7B — хорошее качество, управляемый VRAM
  2. Используйте 4-битное квантование — значительно уменьшает VRAM
  3. Требуется GPU — инференс на CPU крайне медленный
  4. Чёткие запросы — конкретные вопросы дают лучшие ответы
  5. Многократные диалоги — сохраняйте контекст разговора
  6. Температура 0.2–0.7 — баланс креативности и последовательности
  7. max_new_tokens 512–1024 — для подробных ответов
  8. Пакетная обработка — обрабатывайте несколько изображений последовательно

Производительность​

Модель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%

Ограничения​

  1. Галлюцинации — может описывать то, чего нет на изображении
  2. Пространственное мышление — сложности с точным определением местоположения
  3. Мелкий текст — трудности с чтением мелкого шрифта
  4. Подсчёт объектов — неточен для большого количества объектов
  5. Требования к VRAM — нужен мощный GPU
  6. Скорость инференса — медленнее, чем 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()

Ресурсы​