Qwen2.5-Omni-7B SFT (with observations) — OmniGAIA fine-tune
This is a fully fine-tuned version of Qwen/Qwen2.5-Omni-7B on the OmniGAIA training data, trained as a tool-integrated omni-modal agent that natively reasons over video + audio + image and calls external tools (web_search, page_browser, code_executor, read_image/audio/video).
The key differences from the recipe in the OmniGAIA paper are:
- Training data source. We use the raw
with_obstrajectories from the OmniGAIA train split as-is, rather than re-synthesizing trajectories via hindsight-guided tree exploration (the paper's OmniAtlas-SFT recipe). - Long-context handling via sliding window. Long trajectories are split via sliding window (width=8192, overlap=4096) at user/assistant pair boundaries, so all observation context still fits in the model context window during training instead of being truncated.
- Role-level masking equivalent to the paper's masked SFT. Original
role=tool(observation) messages are normalized torole=userto fit the Qwen2.5-Omni chat template. Combined withms-swift's default--loss_scale default(which only computes loss onassistantturns), this means only assistant tokens contribute to the loss; tool / observation content is fully masked, functionally the same as the paper's trajectory-level masked SFT.
The training objective is functionally equivalent to OmniAtlas-SFT (only assistant tokens are supervised; tool / observation tokens are masked). The improvement over the paper's 7B numbers is therefore attributable to the training-data recipe (raw
with_obstrajectories + sliding-window long-context handling), not to a different loss target.
This is checkpoint-150 (epoch ≈ 1.28), which gave the most stable validation performance during training.
Evaluation on OmniGAIA (Pass@1, official protocol)
Evaluated using the official OmniGAIA eval script (run_base_agent_original_paper.py) with DeepSeek-V3.2 as the LLM judge, same tools/active-perception setup as published baselines.
| Seed | Pass@1 (LLM_Equal) | EM | Avg tool calls | Non-empty rate |
|---|---|---|---|---|
| 42 | 16.94 | 8.61 | 12.16 | 100% |
| 1337 | 15.28 | 5.28 | 12.27 | 100% |
| 2024 | 14.44 | 6.11 | 11.91 | 100% |
| 7 | 16.39 | 4.17 | 11.86 | 100% |
| Mean ± std (4 seeds) | 15.76 ± 1.12 | 6.04 ± 1.89 | 12.05 | 100% |
Comparison to OmniGAIA paper baselines (Qwen2.5-Omni-7B family)
| Method | Pass@1 |
|---|---|
| Qwen2.5-Omni-7B (zero-shot) | 3.6 |
| + OmniAtlas-SFT (paper) | 11.4 |
| + OmniDPO (paper) | 13.3 |
| + with_obs SFT (this model) | 15.76 |
The cross-seed variance comes mainly from (i) real-time
web_searchresults drifting between runs, and (ii) DeepSeek-V3.2 judge non-determinism, not from the model itself (vLLM is run in greedy mode).
Per-difficulty breakdown (averaged over 4 seeds)
| Level | Count | Pass@1 |
|---|---|---|
| Easy | 122 | 25.41 |
| Medium | 160 | 12.97 |
| Hard | 78 | 7.05 |
Training
| Item | Value |
|---|---|
| Base model | Qwen/Qwen2.5-Omni-7B |
| Trainer | ms-swift (full-param SFT, bf16) |
| Train data | OmniGAIA train split, kept as with_obs cached dataset (~2,150 trajectories), split via sliding window (width=8192, overlap=4096) → 4,682 windows |
| Epochs | 2 |
| Effective batch | 1 × 8 GPUs × gradient_accumulation_steps=5 |
| Learning rate | 1e-5, warmup ratio 0.03 |
| Max length | 8,192 |
| Precision | bf16 |
| Attention | flash_attention_2 |
| Other | padding_free, use_liger_kernel, gradient & vit_gradient checkpointing, DeepSpeed ZeRO-2 |
This checkpoint corresponds to global step 150 / 234 (epoch ≈ 1.28). Later checkpoints (200, 234) showed slightly higher train loss reduction but no monotonic Pass@1 gain in our evaluation, so we use step 150 for the leaderboard submission.
Data contamination self-check
We verified that no test-set question text from test_metadata.json appears verbatim in any training sample (0 / 2,151 overlap). The training set shares media with the test set (~23%) because the OmniGAIA dataset is constructed from a shared media pool — this is the same condition under which all OmniAtlas / Qwen baselines in the paper were evaluated, so the comparison is apples-to-apples.
How to use
from transformers import Qwen2_5OmniForConditionalGeneration, AutoProcessor
model_path = "ZhangYuchi/modelbest-Qwen-2.5-Omni-7B-SFT-only"
processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)
model = Qwen2_5OmniForConditionalGeneration.from_pretrained(
model_path,
torch_dtype="bfloat16",
device_map="auto",
trust_remote_code=True,
)
For best results with OmniGAIA-style multi-turn tool-use evaluation, serve it with vLLM:
vllm serve <model_path> \
--trust-remote-code \
--tensor-parallel-size 1 \
--max-model-len 32768 \
--max-num-seqs 1 \
--max-num-batched-tokens 32768
and drive it via the OmniGAIA agent loop (run_base_agent_original_paper.py --enable-active-perception ...) with web_search, page_browser, code_executor, and read_image/audio/video tools.
Intended use & limitations
- Designed for omni-modal agentic QA with multi-turn tool use over video + audio + image.
- Inherits all limitations of
Qwen2.5-Omni-7B(audio perception errors on long clips, vision recognition errors on rare entities, etc.). - The training data is heavy on tool-call trajectories — direct one-shot answers without tool use are not what this checkpoint is optimized for.
Caveats and known limitations (read this before comparing to the paper)
-
Functionally equivalent loss masking, different role wrapper.
tool/ observation messages are remapped torole=user(to satisfy the Qwen2.5-Omni chat template), andms-swiftthen masks all non-assistanttokens via--loss_scale default. The end effect — supervising onlyassistanttokens (reasoning +tool_call) — matches the paper's trajectory-level masked SFT, but the on-disk role schema differs. Downstream tooling that special-casesrole=toolmay not recognize the observation segments in this dataset / format. -
Trajectories are not re-synthesized. The paper's OmniAtlas-SFT uses hindsight-guided tree exploration with Gemini-3-Flash to synthesize new tool-integrated trajectories. This model trains directly on the raw
with_obstrajectories shipped in the OmniGAIA train split, without any re-synthesis or trajectory cleanup. -
No DPO / RLHF stage. The paper reports its strongest 7B number with
OmniAtlas-SFT + OmniDPO. This model is SFT-only. -
Shared media pool between train and test. The OmniGAIA train and test sets are constructed from a shared media pool (~23% of train trajectories share at least one media file with a test item, even though no test-set question text appears verbatim in any train sample — see "Data contamination self-check" above). This is a property of the benchmark itself, the same as all baselines in the paper.
What this implies for the reported numbers:
- The 15.76 Pass@1 figure is achieved under the same evaluation protocol and the same effective training objective (masked SFT) as the paper's 7B baselines. The headroom over the paper's
+OmniAtlas-SFT (11.4)and+OmniDPO (13.3)therefore reflects differences in training data recipe (rawwith_obs+ sliding window) rather than a different loss mask. - A clean apples-to-apples ablation (paper-style trajectory synthesis vs raw
with_obs, holding everything else fixed) has not been run in this codebase, so the per-component contribution of "raw with_obs" vs "sliding window" vs "different trajectory pool" is not yet decomposed. - Use this checkpoint as a strong reproducible 7B starting point for OmniGAIA. If you intend to extend this for a publication, please run the corresponding ablations.
License
Apache-2.0, inherited from the base Qwen2.5-Omni-7B.
Citation
If you use this model, please also cite the underlying base model and the OmniGAIA benchmark:
@misc{qwen25omni,
title = {Qwen2.5-Omni Technical Report},
author = {Qwen Team},
year = {2025},
}
@misc{omnigaia,
title = {OmniGAIA: Towards Native Omni-Modal AI Agents},
author = {RUC-NLPIR et al.},
year = {2026},
url = {https://huggingface.co/spaces/RUC-NLPIR/OmniGAIA-Leaderboard},
}