MERA (Multimodal Evaluation for Russian-language Architectures) открытый независимый бенчмарк для оценки современных генеративных моделей на русском языке.
MERA — независимый открытый проект Альянса в сфере ИИ на стыке академии и индустрии. Поучаствовать в нём может каждый, ведь для развития и оценки мультимодальных моделей нужны новые сложные тесты. ИИ-сообщество активно изучает многообразие и особенности больших мультимодальных моделей (MLLMs), развивается методологическая основа для оценки таких моделей и выстраивания рейтингов.
Мы предлагаем концепцию бенчмарка для мультимодальных моделей и первые задачи для тестирования. Как и прежде, MERA открыта для сотрудничества с сообществом. Ниже вы найдете описания, как можно контрибьютить в проект. Присоединяйтесь к нам!🤗
Мультимодальный бенчмарк предполагает два режима тестов, аналогично текстовой MERA:
- публичные / открытые тесты — с открытой лицензией, сообщество может пользоваться тестами напрямую и сразу получать результат оценки (результаты не влияют на рейтинг моделей);
- закрытые тесты — с закрытым ответом и уникальными изображениями, которые нельзя найти в интернете (в рейтинге моделей учитываются только результаты закрытых задач; эти результаты можно получить исключительно через сабмит на сайте).
В бенчмаркинге остро стоит проблема утечки данных и data contamination. Поэтому для всех закрытых тестов мы используем созданные с нуля изображения, аудио и видео, которых нет в сети и, как следствие, не может быть в обучении моделей. Из тех же соображений результаты оценки на публичных задачах не включаются в расчет рейтинга моделей.
- разнообразие доменов;
- разнообразие изображений / аудио / видео;
- разнообразие сложности (от школьного уровня до экспертного);
- разнообразие тестируемых способностей MLLMs.
Наша команда разработала Таксономию способностей MLLMs для решения задач с изображениями, аудио и видео. Во-первых, эта таксономия будет "дорожной картой" будущих задач мультимодальной MERA, которая будет определять, какие скиллы моделей покрыты бенчмарком, а для каких — нужно разрабатывать новые задачи. Для каждой задачи будет зафиксировано, какие навыки она тестирует. В перспективе с помощью карты мультимодальных навыков можно будет оценивать их относительную сложность как для MLLMs в целом, так и для отдельных моделей.
Все задачи хранятся в оригинальном формате MERA (см. инструкцию по формату). Оценка моделей в актуальной кодовой базе поддерживается в режиме zero-shot. Система промптинга и количество shots в текущей реализации не фиксированы и могут быть изменены в дальнейшем. Предложения по улучшению, идеи, дискуссии и обратную связь мы приветствуем в issues текущего репозитория.
Датасеты, поддерживаемые актуальной кодовой базой:
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 Датасеты, поддерживаемые актуальной кодовой базой:
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 Датасеты, поддерживаемые актуальной кодовой базой:
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.
-
Рекомендуемая версия Python
>=3.11.9. -
Склонируйте репозиторий MERA-Evaluation/MERA_MULTIMODAL:
git clone --recurse-submodules https://github.com/MERA-Evaluation/MERA_MULTIMODAL.git
Проверьте, что подтянулся подмодуль в папке lm-evaluation-harness. В этой папке должен находится репо с кодом харнесса. Если по каким-то причинам подмодуль не подтянулся, склонируйте его отдельно:
git submodule update --init --recursive
-
Установите 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...
- Можно регулировать формат подачи объектов через переменные окружения
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.-
Режим 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>
-
Флаг
--pass_multimodal_args_to_chat_history. Изначально, харнесс собирает отдельно текстовую часть запроса и мультимодальные данные (они кладутся в список). Однако, можно сделать так, чтобы мультимодальные данные передавались прямо в словаре с ролями:[ { "role": "user", "content": [ {"type": "text", "text": "Some text question..."}, {"type": "image", "image": <Image>} ] } ] -
При вызове
local-chat-completionsилиopenai-chat-completionsизображения конвертируются из PIL.Image в base64 байты. -
Флаг
--replace_videos_with_images_amount N. Он позволяет превратить видео в набор кадров. По сути, из видео равномерно сэмплируется N кадров, которые подаются в модель уже в формате картинок, а не одного видео. Обычно используется в связки с--pass_multimodal_args_to_chat_history. -
Можно делать ресайз картинок, если целиком они не влезают в память. Для этого в
--model_argsнужно после всех параметров через запятую также указать image_width, image_height, image_max_side (скейл картинки, чтобы максимальная сторона не была больше, чем переданное значение пикселей; нельзя совмещать с image_width и image_height). -
При запуске замеров теперь можно использовать кэширование (
--use_cache PATH/TO/CACHE/FILE). Передается путь до файла, который бьдет создан, а в нем будут хранится кэши всех запросов (запрос + ответ модели на него). Для разных замеров используйте разные пути (сохраняйте кэши в разных файлах). Зачем это нужно? Вы запускаете замер модели Х на датасете Y. Замер упал из-за какой-то проблемы, например, ошибка CUDA. Теперь вам нужно перезапустить замер и заново ждать пока запросы, которые у вас уже единожды прошли, пройдут. Кэширование позволяет этого избежать. Вопросы и ответы сохраняются в файле и при перезапуске замера прогоняться будут только новые запросы, которые раньше прогнаны не были.
- Можно регулировать формат подачи объектов через переменные окружения
Ниже приводятся примеры запуска задач с использованием разных модулей. В целом, нет универсального кода для инференса любой мультимодальной 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.
Команды ниже выполняются из корневой папки репозитория.
Через 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 bfloat16OPENAI_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Через 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У аудио моделей нет универсального интерфейса, потому разные модули для разных семейств моделей. Также обратите внимание, что не все модели могут запускать все датасеты. Например, некоторые модели не могут работать с аудио длиннее 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,aquariaQwen/Qwen-Audio-Chat (на некоторых версиях transformers может не работать, сохраняет аудио локально)
pip install matplotlib transformers_stream_generator tensorboard transformers==4.44.2 numpy==1.26HF_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 ruenvaqaopenbmb/MiniCPM-o-2_6 (не работает на последних версиях transformers)
pip install vector_quantize_pytorch vocos transformers==4.44.2 numpy==1.26HF_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 aquariafixie-ai/ultravox-v0_2 (и другие модели ultravox)
pip install numpy==1.26HF_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 bfloat16OPENAI_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 10python scripts/log_to_submission.py --outputs_dir <output_path из скрипта замера> --dst_dir <где сохранить архив> --model_args <строка из флага model_args из скрипта замера>Мы расширяем MERA на новые модальности (видео, аудио, картинки) и приглашаем сообщество участвовать в разработке новых сложных задач и обновлении кодовой базы проекта. В документации подробно описаны шаги и система поощрения, которая позволит участникам cтать частью проекта MERA и соавторами нашей будущей академической публикации (A*/Q1).
Шаги для добавления новой задачи:
- Разработать датасет (на стороне участника, см. требования к задачам)
- Привести датасет в формат MERA (инструкция)
- Проверить датасет с помощью автоматического тестирования (инструкция)
- Загрузить датасет на 🤗HF Hub (инструкция)
- Отправить датасет на ревью организаторам MERA (инструкция)
- Написать код для оценки на основе lm-harness (инструкция)
- Замерить, как справляется с задачей человек (инструкция)
- Замерить актуальные baseline-модели на датасете
- Финальная модерация — и ваш датасет официально добавлен!
Мы подготовили подробные инструкции, best practices, примеры и материалы:
- Баллы для попадания в статью
- Критерии качества датасетов
- Методология кросс-ревью
- Формат датасетов MERA
- Автоматическое тестирование нового датасета (опционально)
- Таксономия навыков MLLMs
- Добавление новых датасетов на HF
- Добавление кодовой базы для новых датасетов
- Как запустить оценку модели
- Как провести Human Baseline
Организаторы предлагают систему оценки вклада в проект MERA:
- для контрибьюторов в кодовую базу (фичи, багфиксы);
- для авторов, разработавших новый датасет для MERA;
- за участие в написании академических статей;
- за проверку новых датасетов и код-ревью;
- за организационную работу.
По набранным баллам за коллаборацию участникам будет предложено соавторство в академической статье уровня A* / Q1 по мультимодальной части проекта MERA.
docs— инструкции по добавлению новых датасетов в мера, по кодовой базе, человеческой оценке (Human Baseline) и др.multimodal_tasks— задачи для оценки мультимодальных моделей.lm-evaluation-harness— фреймворк для оценки генеративных моделей, кодовая база для прогонов.