Skip to content

MERA-Evaluation/MERA_MULTIMODAL

Repository files navigation

MERA

MERA (Multimodal Evaluation for Russian-language Architectures) открытый независимый бенчмарк для оценки современных генеративных моделей на русском языке.

🪩 МУЛЬТИМОДАЛЬНОСТЬ 🪩

Проект MERA выходит за рамки текстовой модальности: мы готовим новые тесты для оценки больших мультимодальных моделей (с изображениями, аудио и видео).

MERA — независимый открытый проект Альянса в сфере ИИ на стыке академии и индустрии. Поучаствовать в нём может каждый, ведь для развития и оценки мультимодальных моделей нужны новые сложные тесты. ИИ-сообщество активно изучает многообразие и особенности больших мультимодальных моделей (MLLMs), развивается методологическая основа для оценки таких моделей и выстраивания рейтингов.

Мы предлагаем концепцию бенчмарка для мультимодальных моделей и первые задачи для тестирования. Как и прежде, MERA открыта для сотрудничества с сообществом. Ниже вы найдете описания, как можно контрибьютить в проект. Присоединяйтесь к нам!🤗

Концепция

Мультимодальный бенчмарк предполагает два режима тестов, аналогично текстовой MERA:

  • публичные / открытые тесты — с открытой лицензией, сообщество может пользоваться тестами напрямую и сразу получать результат оценки (результаты не влияют на рейтинг моделей);
  • закрытые тесты — с закрытым ответом и уникальными изображениями, которые нельзя найти в интернете (в рейтинге моделей учитываются только результаты закрытых задач; эти результаты можно получить исключительно через сабмит на сайте).

В бенчмаркинге остро стоит проблема утечки данных и data contamination. Поэтому для всех закрытых тестов мы используем созданные с нуля изображения, аудио и видео, которых нет в сети и, как следствие, не может быть в обучении моделей. Из тех же соображений результаты оценки на публичных задачах не включаются в расчет рейтинга моделей.

На что мы ориентируемся при создании бенчмарка?

  • разнообразие доменов;
  • разнообразие изображений / аудио / видео;
  • разнообразие сложности (от школьного уровня до экспертного);
  • разнообразие тестируемых способностей MLLMs.

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

Все задачи хранятся в оригинальном формате MERA (см. инструкцию по формату). Оценка моделей в актуальной кодовой базе поддерживается в режиме zero-shot. Система промптинга и количество shots в текущей реализации не фиксированы и могут быть изменены в дальнейшем. Предложения по улучшению, идеи, дискуссии и обратную связь мы приветствуем в issues текущего репозитория.

🔥 Image-to-Text тесты 🔥

Датасеты, поддерживаемые актуальной кодовой базой:

Name Task Name Type Metrics Samples
ruCommonVQA rucommonvqa Public EM, JS 3015
ruCLEVR ruclevr Public EM, JS 1148
WEIRD weird Public EM, JS 814
ruNaturalScienceVQA runaturalsciencevqa Public EM, JS 363
LabTabVQA labtabvqa Private EM, JS 339
RealVQA realvqa Private EM, JS 773
ruHHH-Image ruhhh_image Private group_EM, group_JS 595
ruMathVQA rumathvqa Private EM, JS 502
ruTiE-Image rutie_vision_gen Private EM, JS 1500
SchoolScienceVQA schoolsciencevqa Private EM, JS 4227
UniScienceVQA unisciencevqa Private EM, JS 7432

🔥 Audio-to-Text тесты 🔥

Датасеты, поддерживаемые актуальной кодовой базой:

Name Task Name Type Metrics Samples
ruEnvAQA ruenvaqa Public EM, JS 596
RuSLUn ruslun Public EM, F1 741
AQUARIA aquaria Private EM, JS 738
ruTiE-Audio rutie_audio_gen Private EM, JS 1500

🔥 Video-to-Text тесты 🔥

Датасеты, поддерживаемые актуальной кодовой базой:

Name Task Name Type Metrics Samples
CommonVideoQA commonvideoqa Public EM, JS 1200
RealVideoQA realvideoqa Private EM, JS 671
ruHHH-Video ruhhh_video Private group_EM, group_JS 911

Датасеты доступны в коллекции на 🤗HF Hub.

Оценка модели на MERA

Установка

  1. Рекомендуемая версия Python >=3.11.9.

  2. Склонируйте репозиторий MERA-Evaluation/MERA_MULTIMODAL:

    git clone --recurse-submodules https://github.com/MERA-Evaluation/MERA_MULTIMODAL.git

    Проверьте, что подтянулся подмодуль в папке lm-evaluation-harness. В этой папке должен находится репо с кодом харнесса. Если по каким-то причинам подмодуль не подтянулся, склонируйте его отдельно:

    git submodule update --init --recursive
  3. Установите lm-evaluation-harness. Для этого перейдите в папку с lm-evaluation-harness в репозитории и установите зависимости:

    cd MERA_MULTIMODAL/lm-evaluation-harness
    pip install -e .

    Устанавливаем обязательные зависимости для аудио датасетов:

    pip install librosa soundfile

    Устанавливаем обязательные зависимости для видео датасетов:

    pip install torchcodec av decord

    При наличии необходимости, устанавливаем необязательные зависимости:

    vLLM

    pip install -e ".[vllm]"

    API (для vllm serving и закрытых моделей, допступных по API)

    pip install -e ".[api]"
    Наши нововведения и особенности lm-eval...
    1. Можно регулировать формат подачи объектов через переменные окружения LOAD_BYTES, LOAD_BASE64, LOAD_OBJECT и LOAD_FILES. Каждый из них определяет то, в каком виде сэмпл из датасета попадет в харнесс.
    • LOAD_BYTES=1 - объект представляется в виде байт
    • LOAD_BASE64=1 - объект представляется в виде словаря с ключом url и строкой из base64 символов, лежащей по этому ключу
    • LOAD_OBJECT=1 - в зависимости от типа модальности возвращается питоновский объект (например, PIL.Image для картинок)
    • LOAD_FILES=1 - возвращается словарь с ключами type и (audio, image или video) в зависимости от модальности. По ключу audio, image или video лежит путь до локального файла с нужным объектом
    • По умолчанию выбирается режим LOAD_OBJECT

    Например, для замеров, которые проводятся через движок transformers зачастую нужно подавать объекты в формате LOAD_OBJECT. А для замеров с флагом --pass_multimodal_args_to_chat_history (как правило для движков vllm или API) нужен флаг LOAD_BASE=64.

    1. Режим TENSOR PARALLEL запуска для замеров через transformers. Для этого необходимо использовать библиотеку accelerate. Команда для замера будет выглядеть примерно так:

      <SOME_ENV_VARIABLES> HARNESS_TENSOR_PARALLEL=1 \ # тут 1 включает режим, а не количество карт
      accelerate launch --num_processes <YOUR_TP_SIZE> lm-eval
      --model hf-multimodal \  # обязательно hf модуль
      --model_args pretrained=<MODEL_NAME>,tp_plan="auto" \ # обязательно добавить tp_plan="auto"
      <OTHER EVAL ARGUMENTS>
    2. Флаг --pass_multimodal_args_to_chat_history. Изначально, харнесс собирает отдельно текстовую часть запроса и мультимодальные данные (они кладутся в список). Однако, можно сделать так, чтобы мультимодальные данные передавались прямо в словаре с ролями:

      [
          {
              "role": "user",
              "content": [
                  {"type": "text", "text": "Some text question..."},
                  {"type": "image", "image": <Image>}
              ]
          }
      ]
    3. При вызове local-chat-completions или openai-chat-completions изображения конвертируются из PIL.Image в base64 байты.

    4. Флаг --replace_videos_with_images_amount N. Он позволяет превратить видео в набор кадров. По сути, из видео равномерно сэмплируется N кадров, которые подаются в модель уже в формате картинок, а не одного видео. Обычно используется в связки с --pass_multimodal_args_to_chat_history.

    5. Можно делать ресайз картинок, если целиком они не влезают в память. Для этого в --model_args нужно после всех параметров через запятую также указать image_width, image_height, image_max_side (скейл картинки, чтобы максимальная сторона не была больше, чем переданное значение пикселей; нельзя совмещать с image_width и image_height).

    6. При запуске замеров теперь можно использовать кэширование (--use_cache PATH/TO/CACHE/FILE). Передается путь до файла, который бьдет создан, а в нем будут хранится кэши всех запросов (запрос + ответ модели на него). Для разных замеров используйте разные пути (сохраняйте кэши в разных файлах). Зачем это нужно? Вы запускаете замер модели Х на датасете Y. Замер упал из-за какой-то проблемы, например, ошибка CUDA. Теперь вам нужно перезапустить замер и заново ждать пока запросы, которые у вас уже единожды прошли, пройдут. Кэширование позволяет этого избежать. Вопросы и ответы сохраняются в файле и при перезапуске замера прогоняться будут только новые запросы, которые раньше прогнаны не были.

Warning!

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

  • не те версии библиотек. Условно, старая версия vLLM еще не содержит имплементации модуля для какой-то относительно новой модели
  • странный код инференса модели, например, ей обязательна предварительная обработка медиа-файлов сторонним кодом или требуется сохранять файлы на диск и передавать пути
  • ошибки оборудования. Например, некоторое время LLama-3.2-Vision отказывалась подниматься в vLLM, но была там реализована. Выпадала ошибка ООМ на разных видеокартах
Для преодоления проблем, связанных непосредственно с кодом для инференса, мы разработали и протестировали шаблон FastAPI сервиса, который позволит вам минимальными усилиями "добавить" поддержку практически любой модели.

Для запуска некоторых моделей требуется специфичный код, который не описан в общих модулях харнесса. Из-за этого при попытке замерить эти модели через харнесс возникают проблемы. Относительно удобным способом замера таких моделей является поднятие локального vllm-like сервера, у которого есть эндпоинт v1/chat/completions. У нас есть готовая обертка, код можно посмотреть тут.

Для добавления собственной модели необходимо создать py файл с классом, унаследованным от BaseModel. Затем реализовать в этом классе два метода generate и init_model. Например, вот класс для запуска Qwen2.5-Omni.

После добавления нужных моделей необходимо поднять сервер командой

uvicorn main:app --port 1234

Далее можно запускать замер через openai-chat-completions в харнессе, отправляя запросы на http://localhost:1234 (передавать в base_url).

Датасеты ruTiE-Image и ruTiE-Audio также могут потребовать дополнительных деталей.

ruTiE (rutie_audio_gen, rutie_vision_gen) запускаются с pass_multimodal_args_to_chat_history флагом. Иначе, возможны ошибки.

В ruTiE особая система построения датасета. Датасет строится так, что каждый новый вопрос должен включать в себя содержание предыдущих вопросов, а также ответы модели на них (как диалог в tg - старые сообщения видны в чате - история). Однако на данный момент количество вопросов сильно превышает возможности моделей и ГПУ, потому доступен способ ограничить количество вопросв в этой истории, чтобы модель видела не все предыдущие вопросы наряду с текущим, а только N предыдущих вопросов. Число N передается в --num_fewshot N. У всех датасетов кроме ruTiE всегда --num_fewshot 0. У ruTiE этот флаг отвечает за размер истории. Потому, рекомендуется начинать с замера с --num_fewshot 5, а дальше при нужде (если замер упал с ООМ) уменьшать число вплоть до 0. Если rutie_audio_gen, rutie_vision_gen с --num_fewshot 0 все равно падают, допустимо запускать замер на rutie_audio_default, rutie_vision_default с --num_fewshot 0.

Прогон модели

Команды ниже выполняются из корневой папки репозитория.

Image datasets

Через transformers:

HF_DATASETS_CACHE="ds_cache" HF_TOKEN="YOUR_TOKEN" CUDA_VISIBLE_DEVICES=0 lm-eval \
    --model hf-multimodal \
    --model_args pretrained=Qwen/Qwen2-VL-2B-Instruct,dtype=bfloat16 \
    --device cuda \
    --output_path="$PWD/results" \
    --batch_size=1 \
    --predict_only \
    --log_samples \
    --seed 1234 \
    --num_fewshot=0 \
    --trust_remote_code \
    --apply_chat_template \
    --fewshot_as_multiturn \
    --include_path ./multimodal_tasks \
    --tasks weird,labtabvqa

Через vLLM:

LOAD_BASE64=1 HF_DATASETS_CACHE="ds_cache" HF_TOKEN="YOUR_TOKEN" CUDA_VISIBLE_DEVICES=0 lm-eval \
    --model vllm-vlm \
    --model_args pretrained=Qwen/Qwen2-VL-2B-Instruct,dtype=bfloat16 \
    --device cuda \
    --output_path="$PWD/results" \
    --batch_size=1 \
    --predict_only \
    --log_samples \
    --seed 1234 \
    --num_fewshot=0 \
    --trust_remote_code \
    --apply_chat_template \
    --fewshot_as_multiturn \
    --pass_multimodal_args_to_chat_history \
    --include_path ./multimodal_tasks \
    --tasks ruclevr,rumathvqa

Через vLLM serve

CUDA_VISIBLE_DEVICES=0 vllm serve Qwen/Qwen2-VL-2B-Instruct \
    --trust-remote-code \
    --limit-mm-per-prompt '{"image": 20}' \
    --seed 1234 \
    --port 1231 \
    --dtype bfloat16
OPENAI_API_KEY="EMPTY" HF_DATASETS_CACHE="ds_cache" LOAD_BASE64=1 HF_TOKEN="YOUR_TOKEN" lm-eval \
    --model openai-chat-completions \
    --model_args model=Qwen/Qwen2-VL-2B-Instruct,base_url="http://localhost:1231/v1/chat/completions",num_concurrent=2,max_retries=3,timeout=90000 \
    --output_path="$PWD/results" \
    --batch_size=1 \
    --predict_only \
    --log_samples \
    --seed 1234 \
    --num_fewshot=0 \
    --trust_remote_code \
    --apply_chat_template \
    --fewshot_as_multiturn \
    --pass_multimodal_args_to_chat_history \
    --include_path ./multimodal_tasks \
    --tasks uniscienceqa
Video datasets

Через transformers (могут быть проблемы из-за torch - dtype не сходится):

В данный момент точно корректно работают (тестировались) модели типа llava-hf/LLaVA-NeXT-Video-7B-hf (семейство LLaVA-NeXT-Video), Qwen/Qwen2-VL-2B-Instruct (семейство Qwen VL).

HF_DATASETS_CACHE="ds_cache" HF_TOKEN="YOUR_TOKEN" CUDA_VISIBLE_DEVICES=0 lm-eval \
    --model hf_video_llava \
    --model_args pretrained=llava-hf/LLaVA-NeXT-Video-7B-hf,dtype=bfloat16 \
    --device cuda \
    --output_path="$PWD/results" \
    --batch_size=1 \
    --predict_only \
    --log_samples \
    --seed 1234 \
    --num_fewshot=0 \
    --trust_remote_code \
    --apply_chat_template \
    --fewshot_as_multiturn \
    --include_path ./multimodal_tasks \
    --tasks ruhhh_video,commonvideoqa,realvideoqa

Нарезка видео на фреймы (картинки) и использование картиночных моделек:

Нужно использовать флаги pass_multimodal_args_to_chat_history и replace_videos_with_images_amount. В replace_videos_with_images_amount указывается, сколько кадров равномерно взять из видео.

Предупреждение: конвертация в картинки работает довольно долго!

HF_DATASETS_CACHE="ds_cache" HF_TOKEN="YOUR_TOKEN" CUDA_VISIBLE_DEVICES=0 lm-eval \
    --model vllm-vlm \
    --model_args pretrained=Qwen/Qwen2-VL-2B-Instruct,dtype=bfloat16 \
    --device cuda \
    --output_path="$PWD/results" \
    --batch_size=1 \
    --predict_only \
    --log_samples \
    --seed 1234 \
    --num_fewshot=0 \
    --trust_remote_code \
    --apply_chat_template \
    --fewshot_as_multiturn \
    --pass_multimodal_args_to_chat_history \
    --replace_videos_with_images_amount 1 \
    --include_path ./multimodal_tasks \
    --tasks ruhhh_video,commonvideoqa,realvideoqa
Audio datasets

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

Qwen/Qwen2-Audio-7B-Instruct

HF_DATASETS_CACHE="ds_cache" HF_TOKEN="YOUR_TOKEN" CUDA_VISIBLE_DEVICES=0 lm-eval \
    --model hf-audiolm-qwen \
    --model_args pretrained=Qwen/Qwen2-Audio-7B-Instruct,dtype=bfloat16 \
    --device cuda \
    --output_path="$PWD/results" \
    --batch_size=1 \
    --predict_only \
    --log_samples \
    --seed 1234 \
    --num_fewshot=0 \
    --trust_remote_code \
    --apply_chat_template \
    --fewshot_as_multiturn \
    --include_path ./multimodal_tasks \
    --tasks ruenvaqa,aquaria

Qwen/Qwen-Audio-Chat (на некоторых версиях transformers может не работать, сохраняет аудио локально)

pip install matplotlib transformers_stream_generator tensorboard transformers==4.44.2 numpy==1.26
HF_DATASETS_CACHE="ds_cache" HF_TOKEN="YOUR_TOKEN" CUDA_VISIBLE_DEVICES=0 lm-eval \
    --model hf-audiolm-qwen-audio-chat \
    --model_args pretrained=Qwen/Qwen-Audio-Chat,dtype=bfloat16 \
    --device cuda \
    --output_path="$PWD/results" \
    --batch_size=1 \
    --predict_only \
    --log_samples \
    --seed 1234 \
    --num_fewshot=0 \
    --trust_remote_code \
    --apply_chat_template \
    --fewshot_as_multiturn \
    --include_path ./multimodal_tasks \
    --tasks ruenvaqa

openbmb/MiniCPM-o-2_6 (не работает на последних версиях transformers)

pip install vector_quantize_pytorch vocos transformers==4.44.2 numpy==1.26
HF_DATASETS_CACHE="ds_cache" HF_TOKEN="YOUR_TOKEN" CUDA_VISIBLE_DEVICES=0 lm-eval \
    --model hf-audiolm-minicpm \
    --model_args pretrained=openbmb/MiniCPM-o-2_6,dtype=bfloat16 \
    --device cuda \
    --output_path="$PWD/res" \
    --batch_size=1 \
    --predict_only \
    --log_samples \
    -seed 1234 \
    --num_fewshot=0 \
    --trust_remote_code \
    --apply_chat_template \
    --fewshot_as_multiturn \
    --include_path ./multimodal_tasks \
    --tasks aquaria

fixie-ai/ultravox-v0_2 (и другие модели ultravox)

pip install numpy==1.26
HF_DATASETS_CACHE="ds_cache" HF_TOKEN="YOUR_TOKEN" CUDA_VISIBLE_DEVICES=0 lm-eval \
    --model hf-audiolm-ultravox \
    --model_args pretrained=fixie-ai/ultravox-v0_2,dtype=bfloat16 \
    --device cuda \
    --output_path="$PWD/res" \
    --batch_size=1 \
    --predict_only \
    --log_samples \
    --seed 1234 \
    --num_fewshot=0 \
    --trust_remote_code \
    --apply_chat_template \
    --fewshot_as_multiturn \
    --include_path ./multimodal_tasks \
    --tasks aquaria

Аудио модели можно запускать и через vLLM

CUDA_VISIBLE_DEVICES=0 vllm serve fixie-ai/ultravox-v0_5-llama-3_1-8b \
    --trust-remote-code \
    --limit-mm-per-prompt '{"audio": 20}' \
    --seed 1234 \
    --port 1231 \
    --dtype bfloat16
OPENAI_API_KEY="EMPTY" HF_DATASETS_CACHE="ds_cache" HF_TOKEN="YOUR_TOKEN" lm-eval \
    --model openai-chat-completions \
    --model_args model=fixie-ai/ultravox-v0_5-llama-3_1-8b,base_url="http://localhost:1231/v1/chat/completions",num_concurrent=1,max_retries=3,timeout=90000 \
    --output_path="rutie_audio_results" \
    --batch_size=1 \
    --predict_only \
    --log_samples \
    --seed 1234 \
    --num_fewshot=3 \
    --trust_remote_code \
    --apply_chat_template \
    --fewshot_as_multiturn \
    --pass_multimodal_args_to_chat_history \
    --include_path ./multimodal-harness/multimodal_tasks \
    --tasks rutie_audio_gen
    --limit 10

Подготовка архива с логами замера для отправки на сайт

python scripts/log_to_submission.py --outputs_dir <output_path из скрипта замера> --dst_dir <где сохранить архив> --model_args <строка из флага model_args из скрипта замера>

🤝 MERA открыта для коллаборации и добавления новых датасетов! 🤝

Мы расширяем MERA на новые модальности (видео, аудио, картинки) и приглашаем сообщество участвовать в разработке новых сложных задач и обновлении кодовой базы проекта. В документации подробно описаны шаги и система поощрения, которая позволит участникам cтать частью проекта MERA и соавторами нашей будущей академической публикации (A*/Q1).

Шаги для добавления новой задачи:

  1. Разработать датасет (на стороне участника, см. требования к задачам)
  2. Привести датасет в формат MERA (инструкция)
  3. Проверить датасет с помощью автоматического тестирования (инструкция)
  4. Загрузить датасет на 🤗HF Hub (инструкция)
  5. Отправить датасет на ревью организаторам MERA (инструкция)
  6. Написать код для оценки на основе lm-harness (инструкция)
  7. Замерить, как справляется с задачей человек (инструкция)
  8. Замерить актуальные baseline-модели на датасете
  9. Финальная модерация — и ваш датасет официально добавлен!

Мы подготовили подробные инструкции, best practices, примеры и материалы:

Поощрение за коллаборацию

Организаторы предлагают систему оценки вклада в проект MERA:

  • для контрибьюторов в кодовую базу (фичи, багфиксы);
  • для авторов, разработавших новый датасет для MERA;
  • за участие в написании академических статей;
  • за проверку новых датасетов и код-ревью;
  • за организационную работу.

По набранным баллам за коллаборацию участникам будет предложено соавторство в академической статье уровня A* / Q1 по мультимодальной части проекта MERA.

Структура репозитория

  • docs — инструкции по добавлению новых датасетов в мера, по кодовой базе, человеческой оценке (Human Baseline) и др.
  • multimodal_tasks — задачи для оценки мультимодальных моделей.
  • lm-evaluation-harness — фреймворк для оценки генеративных моделей, кодовая база для прогонов.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors