README.md

May 19, 2026 Β· View on GitHub

XModBench

Benchmarking Cross-Modal Capabilities and Consistency in Omni-Language Models

ICLR 2026 Paper Website Dataset GitHub Repo License: MIT

XModBench teaser

πŸŽ‰ Accepted at ICLR 2026

XModBench is a comprehensive benchmark designed to evaluate the cross-modal capabilities and consistency of omni-language models. It systematically assesses model performance across multiple modalities (text, vision, audio) and various cognitive tasks, revealing critical gaps in current state-of-the-art models.

Key Features

  • 🎯 Multi-Modal Evaluation: Comprehensive testing across text, vision, and audio modalities
  • 🧩 5 Task Dimensions: Perception, Spatial, Temporal, Linguistic, and External Knowledge tasks
  • πŸ“Š 13 SOTA Models Evaluated: Including Gemini 2.5 Pro, Qwen2.5-Omni, EchoInk-R1, and more
  • πŸ”„ Consistency Analysis: Measures performance stability across different modal configurations
  • πŸ‘₯ Human Performance Baseline: Establishes human-level benchmarks for comparison

πŸ“‚ Dataset

The dataset is available on Hugging Face: RyanWW/XModBench

Task Groups and Subtasks

Counts below reflect the actual released dataset (HF RyanWW/XModBench), summed over the 6 modality configurations.

FamilySubtaskSamples
Perceptionfinegrained6,000
Perceptiongeneral_activities6,000
Perceptioninstruments6,000
Perceptioninstruments_comp3,000
Perceptionnatures3,000
Perception total24,000
Spatial3D_movements2,646
Spatialarrangements2,790
Spatialpanaroma2,340
Spatial total7,776
Linguisticrecognition4,032
Linguistictranslation4,212
Linguistic total8,244
Temporalcalculation3,000
Temporalcount3,000
Temporalorder3,000
Temporal total9,000
Knowledgeemotion_classification4,200
Knowledgemovie_matching1,200
Knowledgemusic_genre_classification6,000
Knowledgesinger_identification900
Knowledge total12,300
Grand total17 subtasks61,320

Modality Combinations

The benchmark covers all six configurations of Audio, Vision (image or video), and Text as condition β†’ answer options. Each configuration has the same 10,220 items (same semantics, permuted modality):

Condition β†’ OptionsSamples
Audio β†’ Text10,220
Audio β†’ Vision10,220
Text β†’ Audio10,220
Text β†’ Vision10,220
Vision β†’ Audio10,220
Vision β†’ Text10,220
Total61,320

XModBench-Lite: a balanced 6,000-sample subset (5 families Γ— 6 configs Γ— 200) for fast evaluation.

Repository Structure

XModBench/
β”œβ”€β”€ benchmark/
β”‚   β”œβ”€β”€ Data/                        # Raw media files (audio, image, video)
β”‚   β”‚   β”œβ”€β”€ vggss_audio_bench/       #   VGGSound audio clips
β”‚   β”‚   β”œβ”€β”€ landscape_audiobench/    #   Landscape images
β”‚   β”‚   β”œβ”€β”€ emotions/                #   Emotion classification media
β”‚   β”‚   └── ...
β”‚   β”œβ”€β”€ tasks/                       # Source QA JSON files, organised by subtask
β”‚   β”‚   β”œβ”€β”€ 01_perception/
β”‚   β”‚   β”‚   β”œβ”€β”€ finegrained/         #   6 modality-combo JSON files, 1000 instances each
β”‚   β”‚   β”‚   β”œβ”€β”€ general_activities/
β”‚   β”‚   β”‚   β”œβ”€β”€ instruments/
β”‚   β”‚   β”‚   β”œβ”€β”€ instruments_comp/
β”‚   β”‚   β”‚   └── natures/
β”‚   β”‚   β”œβ”€β”€ 02_spatial/
β”‚   β”‚   β”œβ”€β”€ 03_speech/
β”‚   β”‚   β”œβ”€β”€ 04_temporal/
β”‚   β”‚   └── 05_Exteral/
β”‚   └── results/                     # Model evaluation results
β”œβ”€β”€ models/                          # β˜… per-model eval scripts (run.py …)
β”‚   β”œβ”€β”€ Qwen2.5-Omni/  Qwen3-Omni/  Qwen2.5-VL/  OmniVinci/  VITA/  …
β”‚   └── ...                          # upstream weights/impl install separately
└── scripts/                         # data-processing helpers (process/, download/)

Per-model evaluation code lives in models/ β€” each models/<Model>/run.py loads the benchmark, builds prompts, calls the model and scores. Only the XModBench-side scripts are tracked here; the upstream model weights/implementations are installed separately (see each model's upstream repo). For a turnkey reproducible path use the lmms-eval port.

πŸš€ Quick Start

Basic Usage (legacy evaluation sctipt)



#!/bin/bash
#SBATCH --job-name=VLM_eval        
#SBATCH --output=log/job_%j.out
#SBATCH --error=log/job_%j.log                        
#SBATCH --ntasks-per-node=1
#SBATCH --gpus-per-node=4

echo "Running on host: $(hostname)"
echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES"

module load conda
# conda activate vlm
conda activate omni

export audioBench='/home/xwang378/scratch/2025/AudioBench'

# python $audioBench/scripts/run.py \
#     --model gemini \
#     --task_name perception/vggss_audio_vision \
#     --sample 1000


# python $audioBench/scripts/run.py \
#     --model gemini \
#     --task_name perception/vggss_vision_audio \
#     --sample 1000

# python $audioBench/scripts/run.py \
#     --model gemini \
#     --task_name perception/vggss_vision_text \
#     --sample 1000

# python $audioBench/scripts/run.py \
#     --model gemini \
#     --task_name perception/vggss_audio_text \
#     --sample 1000

# Qwen2.5-Omni

# python $audioBench/scripts/run.py \
#         --model qwen2.5_omni \
#         --task_name perception/vggss_audio_text \
#         --sample 1000

python $audioBench/scripts/run.py \
        --model qwen2.5_omni \
        --task_name perception/vggss_vision_text \
        --sample 1000


πŸ” Reproduce with lmms-eval

We provide a fully reproducible evaluation path through lmms-eval (fork with XModBench tasks pre-integrated). The dataset is auto-downloaded from the HF Hub β€” no manual data prep.

Why dedicated model wrappers? Each XModBench item places media in both the question stem and every answer option (up to 5 media per item). lmms-eval's simple model interface only attaches one media object per request, so omni models would silently see just the first media. We therefore add chat-style *_interleave wrappers that feed the full interleaved prompt to the model. No upstream model file is modified.

1. Install

git clone https://github.com/XingruiWang/lmms-eval.git
cd lmms-eval
pip install -e ".[all]"

2. Quick test (single config, 8 samples)

python -m lmms_eval \
    --model qwen2_5_omni_interleave \
    --model_args pretrained=Qwen/Qwen2.5-Omni-7B,device_map=auto,attn_implementation=flash_attention_2 \
    --tasks xmod_bench_lite_a2t \
    --batch_size 1 --limit 8 --log_samples \
    --output_path logs/debug

3. XModBench-Lite β€” 6,000 samples (5 families Γ— 6 configs Γ— 200)

submit_lite.sh launches all 6 modality configs with a resource-aware GPU profile (no-video configs on 1 GPU, video configs on 4) so the full sweep fits one QoS allocation:

# Qwen2.5-Omni-7B
./submit_lite.sh qwen2_5_omni_interleave Qwen/Qwen2.5-Omni-7B qwenomni3

# Qwen3-Omni-30B-A3B (MoE; all configs need 4 GPU)
LIGHT_GRES=gpu:a5000:4 HEAVY_GRES=gpu:a5000:4 \
  ./submit_lite.sh qwen3_omni_interleave Qwen/Qwen3-Omni-30B-A3B-Instruct qwenomni3 \
  device_map=auto,attn_implementation=flash_attention_2

# Level-2 metrics (by-config / by-family / disparity / imbalance)
python lmms_eval/tasks/xmod_bench/summarize.py \
    --logs logs/xmod_bench_lite/results_qwen2_5_omni_interleave/

4. Full benchmark β€” 61,320 samples

TASKS=(xmod_bench_audio_text xmod_bench_text_audio \
       xmod_bench_audio_image xmod_bench_image_audio \
       xmod_bench_image_text xmod_bench_text_image \
       xmod_bench_audio_video xmod_bench_text_video \
       xmod_bench_video_audio xmod_bench_video_text)

python -m lmms_eval \
    --model qwen2_5_omni_interleave \
    --model_args pretrained=Qwen/Qwen2.5-Omni-7B,device_map=auto,attn_implementation=flash_attention_2 \
    --tasks "${TASKS[$SLURM_ARRAY_TASK_ID]}" \
    --batch_size 1 --log_samples \
    --output_path logs/xmod_bench_full/results

Reproduction results (Qwen series)

By-config accuracy on XModBench-Lite via lmms-eval, vs. the paper's full-set numbers (Table 2). Ξ” = Lite βˆ’ paper.

ConfigQwen2.5-Omni (Lite)paper (full)Ξ”Qwen3-Omni (Lite)
Audio β†’ Text63.162.0+1.171.6
Audio β†’ Vision49.848.0+1.852.0
Text β†’ Audio59.255.4+3.862.5
Text β†’ Vision62.559.6+2.967.0
Vision β†’ Audio50.350.5βˆ’0.255.6
Vision β†’ Text76.476.3+0.183.1
  • Qwen2.5-Omni reproduces the paper within |Ξ”| < 5 on all 6 configurations on the lightweight 6k Lite split β€” confirming the lmms-eval port is faithful.
  • Qwen3-Omni (released after the paper) is reported here for the first time, using the identical wrapper/code path.
  • Full-set (61,320-sample) lmms-eval runs use the same wrappers via the Section 4 command; numbers are updated in lmms_eval/tasks/xmod_bench/RESULTS.md as runs complete.

Per-run logs include overall accuracy plus per-config / per-family / per-subtask breakdowns; summarize.py emits the 17 Level-2 numbers (6 by-config, 5 by-family, 3 modality-disparity, 3 directional-imbalance).

πŸ“ˆ Benchmark Results

Full Benchmark (61,320 samples) β€” all models from the paper

By-configuration accuracy (%) over the six modality directions; Avg. is the mean over the six (Table 2 of the paper).

ModelA→TA→VT→AT→VV→AV→TAvg.
Gemini 2.5 Pro71.058.964.479.860.888.670.6
Gemini 2.5 Flash62.651.255.175.751.986.063.7
Gemini 2.0 Flash63.749.052.271.547.685.261.2
EchoInk-R164.645.956.460.949.977.659.2
Qwen2.5-Omni62.048.055.459.650.576.358.6
Gemini 1.5 Pro52.438.248.670.440.779.955.0
Baichuan-Omni-1.547.835.840.556.238.673.048.7
VideoLLaMA 248.626.025.726.525.266.836.5
VITA40.226.029.826.829.959.335.4
Unified-IO 2 XXL37.425.031.237.826.739.933.0
Unified-IO 2 XL33.327.027.132.926.537.430.7
Unified-IO 228.924.025.432.025.732.728.1
PandaGPT24.525.023.825.224.525.124.7
No Context (random)25.124.325.424.825.325.725.1
Human92.491.591.191.886.495.691.5

Vision-only models are evaluated only on text↔vision configs: Qwen2.5-VL 67.4 Avg., InternVL-3.5 61.7 Avg. (omitted from the six-way table).

XModBench-Lite (6,000 samples) β€” reproduced via lmms-eval

Balanced split (5 families Γ— 6 configs Γ— 200), evaluated through the lmms-eval port with interleaved-multimedia wrappers.

ModelA→TA→VT→AT→VV→AV→TAvg.
Qwen3-Omni-30B71.652.062.567.055.683.165.3
Qwen2.5-Omni-7B63.149.859.262.550.376.460.2
Baichuan-Omni-1.552.532.047.656.647.077.752.2
OmniVinci62.2β€”β€”β€”β€”78.8β€”

Qwen2.5-Omni matches its full-set paper numbers within 5 points on every configuration, confirming the port is faithful. Qwen3-Omni post-dates the paper (first reported here). OmniVinci runs on its single-media-condition configs; its 4-option configs hit VILA-internal limits (see RESULTS.md β€” note: that file lives in the lmms-eval repo). New runs update as they complete.

Key Findings

1️⃣ Task Competence Gaps

  • Strong Performance: Perception and linguistic tasks (~75% for best models)
  • Weak Performance: Spatial (50.1%) and temporal reasoning (60.8%)
  • Performance Drop: 15-25 points decrease in spatial/temporal vs. perception tasks

2️⃣ Modality Disparity

  • Audio vs. Text: 20-49 point performance drop
  • Audio vs. Vision: 33-point average gap
  • Vision vs. Text: ~15-point disparity
  • Consistency: Best models show 10-12 point standard deviation

3️⃣ Directional Imbalance

  • Vision↔Text: 9-17 point gaps between directions
  • Audio↔Text: 6-8 point asymmetries
  • Root Cause: Training data imbalance favoring image-to-text over inverse directions

πŸ“ Citation

If you use XModBench in your research, please cite our paper:

@article{wang2025xmodbench,
  title={XModBench: Benchmarking Cross-Modal Capabilities and Consistency in Omni-Language Models},
  author={Wang, Xingrui and others},
  journal={arXiv preprint arXiv:2510.15148},
  year={2025}
}

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

πŸ™ Acknowledgments

We thank all contributors and the research community for their valuable feedback and suggestions.

πŸ“§ Contact

Todo

  • Release Huggingface data
  • Release data processing code
  • Release data evaluation code

Note: XModBench is actively maintained and regularly updated with new models and evaluation metrics. For the latest updates, please check our releases page.