Как стать автором
Обновить

OmniFusion 1.1: мультимодальность теперь и на русском

Уровень сложностиСложный
Время на прочтение7 мин
Количество просмотров7.8K
Всего голосов 19: ↑19 и ↓0+20
Комментарии33

Комментарии 33

Latex формула на последней картинке сбилась

Вроде это не баг а фича, т.к. мы хотели показать как именно она распозналась

Именно так! Черипики идеальные любой может показать

Спасибо за работу. Её можно сконвертировать в GGUF?

Думаю, что это отличная задача для комьюнити:)

Тут проблема в том, что вероятно ggml/llama.cpp не поддерживает проджектор от OmniFusion

К чёрту подробности - может ли она по ссылке или по загруженной пдфке прочесть содержимое и использовать эту информацию в ответах?

OCR опция будет чуть позже, сейчас как раз активно доучиваем в сегменте анализа документов/сканов/графиков и тд

Тут не столько про оцр, сколько про возможность хорошо использовать предоставленную информацию в ответах на вопросы. Например, дать ей пусть даже в виде родного текстового сообщения инструкцию по пылесосу - и чтобы она потом могла ответить, как часто менять мешок, что означает большая круглая крутилка сверху и т.п.

Понял теперь! Отличный кейс, добавил в лог

Так разве не для этого обучают модель? RAG именно для этого и используют. Дают промт, дают текст (инструкцию), генерируется ответ. Если модель не сможет разобраться в инструкции от пылесоса это будет эпично)))

Первично учим картинки понимать и уметь оперировать максимально подробно ими. RAG - это бонус

Я не очень разбираюсь в этих терминологиях. Понимать картинки и оперировать ими максимально подробно - это включает в себя оперирование информацией с той же картинки или не включает? Про оцр понял, текст пока не возьмёт с картинки. Но если передать инструкцию к ПО в виде скриншотов, где красными квадратиками и стрелочками обозначено, куда тыкать и что получится, оно пока тоже не сможет по ним подсказать, что и куда тыкать пользователю, который спросит - что мне и куда тыкать, чтобы вот это?

Имел в виду, что определять все объекты на изображении, понимать их взаимное расположение, количество и тд, делать подробный image captioning. Но здесь пока речь только об одной картинке. Если их будет несколько, то тут нужно специальным образом настроить следующий этап файнтюнинга, чтобы модель научилась понимать не только картинку, а и то, что их может быть несколько и в разной последовательности с текстом (так называемые interleaved данные). Задача максимально полезная для конечного пользователя, поддерживаю полностью идею

Так попробуй. Она ж в доступе. Но я бы сконвертировал в картинку

Миллионы лет мои предки учились активно использовать чужой опыт и побеждали из-за этого в эволюционной схватке не для того, чтобы я потом, как слабак и нытик сам разворачивал нейросеть, чтобы ответить на свои вопросы!

Так и они отдали в открытый доступ, чтоб под каждого не настраивать сервер. Я думаю в миллионах лет опыта можно найти полчасика на освоение colab от гугл. Но в целом да, было-бы удобнее если был хотя бы ТГ бот

Увы, на бесплатном тарифе не хватает памяти:
OutOfMemoryError: CUDA out of memory. Tried to allocate 20.00 MiB. GPU 0 has a total capacity of 14.75 GiB of which 17.06 MiB is free. Process 5303 has 14.73 GiB memory in use. Of the allocated memory 14.47 GiB is allocated by PyTorch, and 164.91 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)

Сейчас делаем версию на базе LLM Phi 1.5, которая должна влезать и в бесплатные аккаунты

2-3 A100, по 1-2 дня на каждую фазу обучения. Ну и в параллели несколько экспериментов обычно ставится под разные архитектурные особенности.

В какое же прекрасное время бы живём, выходят прекрасные бесплатные модели - эта, Command r+, Llama 3 уже на следующей неделе будет, говорят... и ведь технология становится все лучше и лучше! Это как жить в эпоху промышленной революции, когда придумали станки, но круче)

Отличная сеть. Надеемся на продолжение. Но есть вопрос. Можно ли при запросе о наличии объекта на картинке, получить квадрат с позицией объекта на изображении?

Спасибо! Вот как раз сейчас учим модель в режиме grounding объектов, чтобы могла позиционирование выдавать. Будем делиться обновлениями по мере поступления)

Отлично! Спасибо за работу!

Картинку надо заэнкодить, прогнать через адаптер, собрать эмбеддинг с img_start_emb и img_end_emb, потом на вход модели подать. В test.py есть пример вызова, но положим отдельный скрипт в корне для быстрого запуска модели

Хорошо, спасибо!

в общем, вот так все это будет выглядеть:

from llama_cpp import Llama
import base64
from llama_cpp.llama_chat_format import Llava15ChatHandler
chat_handler = Llava15ChatHandler(clip_model_path="mmproj-model-f16.gguf")

llm = Llama(
  model_path="OmniFusion-1.1-Q5_K_M.gguf",
  chat_format = "llava-1-5",
  chat_handler=chat_handler,
  n_ctx=2048, # n_ctx should be increased to accomodate the image embedding
  n_gpu_layers = 1,
  logits_all=True,# needed to make llava work
  verbose=True
)


def image_to_base64_data_uri(file_path):
    with open(file_path, "rb") as img_file:
        base64_data = base64.b64encode(img_file.read()).decode('ascii')
        return f"data:image/png;base64,{base64_data}"

# Replace 'file_path.png' with the actual path to your PNG file
file_path = 'test.png'
data_uri = image_to_base64_data_uri(file_path)



##llm.create_chat_completion(
##messages = [
##    {"role": "system", "content": "You are an assistant who perfectly describes images."},
##    {
##        "role": "user",
##        "content": [
##            {"type": "image_url", "image_url": {"url": "https://llava-vl.github.io/static/images/view.jpg" }},
##            #{"type": "image_url", "image_url": {"url": data_uri }},
##            {"type" : "text", "text": "Describe this image in detail please."}
##        ]
##    }
##]
##)

llm.create_chat_completion(
messages = [
    {"role": "system", "content": "You are an assistant who perfectly describes images."},
    {
        "role": "user",
        "content": [
            {"type": "image_url", "image_url": {"url": data_uri }},
            {"type" : "text", "text": "Что изображено на снимке?"}
        ]
    }
]
)

mmproj-model-f16.gguf - пришлось позаимствовать у llama - https://huggingface.co/mys/ggml_llava-v1.5-7b/tree/main

на выводе:

{'id': 'chatcmpl-82b38207-b93b-4d48-931b-118ad2363af4', 'object': 'chat.completion', 'created': 1714044543, 'model': 'OmniFusion-1.1-Q5_K_M.gguf', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': ' a man with long hair and a beard, wearing a black suit and tie\n\nassistant'}, 'logprobs': None, 'finish_reason': 'stop'}], 'usage': {'prompt_tokens': 608, 'completion_tokens': 19, 'total_tokens': 627}}

ну и сам снимок -

ответ не совсем верный (длина волос) и не на русском. уточнять промт ?

ps. пример с картинкой на github проекта не смог запустить - cuda out of memory. (8 гб недостаточно оказалось).

Зарегистрируйтесь на Хабре, чтобы оставить комментарий