Uni-MoE-2.0-Omni:用一套 MoE 模型同时听懂、看懂、说话、画画,还开源了全部代码
核心问题:有没有一种“全开源、一站式”的大模型,能同时处理文本、图像、音频、视频,并且把“理解”与“生成”打通?
一句话答案:Uni-MoE-2.0-Omni 基于 Qwen2.5-7B 主干,用动态容量 MoE、渐进式训练与 75B 多模态 tokens 做到了这一点,代码与权重全部公开。
本文速览(30 秒版)
| 看点 | 一句话 |
|---|---|
| 架构 | 语音/视觉/文本统一 tokenizer → 动态 MoE 层 → 专用生成头(MoE-TTS + Task-DiT) |
| 训练 | 四阶段:跨模态预训练 → 专家热身 → 混合 SFT → 退火+RL(GSPO-DPO) |
| 性能 | 85 个基准平均 SOTA,长视频理解 +7%、长语音 WER 再降 4.2%、图文编辑 FID 低 29% |
| 开源 | 5 个 checkpoint、训练脚本、数据清单、Demo 全在 GitHub/HuggingFace |
| 适用 | 需要“端到端”多模态理解+生成的研究、产品原型、边缘场景微调 |
1. 为什么“全模态”这么难?
传统 pipeline 是“专模专用”:ASR 模型只转文字,视觉模型只出特征,TTS 或扩散模型只管生成。想做一个“既能听懂、又能回答、还能画图”的助手,就得把 N 条链路拼在一起——延迟高、误差累积、数据格式打架、部署噩梦。
Uni-MoE-2.0-Omni 的思路很直接:
-
把所有输入统一成 token 序列; -
在 LLM 内部把 FFN 换成“动态容量 MoE”,让不同模态自动路由到不同专家; -
输出端用“语言提示”驱动语音与图像生成器,实现“文本-中心”的端到端训练。
2. 架构拆解:一条 token 序列走天下
2.1 统一 tokenizer(原文 2.1/2.2)
| 模态 | 分片方式 | 每单位 token 数 | 备注 |
|---|---|---|---|
| 音频 | 30 s 一段,16 kHz 重采样 | 200 tokens(≈20 tokens/3 s) | 用 Whisper-Large-v3 encoder |
| 图像 | 384×384 不重叠图块 | 一张图 ≈ (H×W)/(384²)×T | T 由 SigLIP 决定 |
| 视频 | 1 fps 采样,每帧 384×384 | 帧数 fn∈[fl,fu] | 与图像共享 ViT |
| 文本 | 标准 BPE | 1 token 对应 1 字/子词 | 与 Qwen2.5 词表兼容 |
场景示例
假设你上传一段 18 s 的语音提问“下图是哪个城市?”并附带一张照片。
-
音频被切成 18×(20/3)=120 tokens; -
图像被切成 4×4=16 个图块,产生 16×T≈256 tokens; -
文本问题“下图是哪个城市?”≈10 tokens;
三条流先拼成一条“长序列”,再送进 MoE-Transformer,后面统一做自注意力——不需要外部融合模块。
2.2 动态容量 MoE(原文 2.3.2)
核心问题:固定 Top-K 专家数浪费算力,且无法区分“通用知识”与“模态私有知识”。
Uni-MoE 把每层 FFN 拆成三类专家:
-
Routed Expert(4 个,5.7 B):存领域知识,Top-P 抽样决定激活几个,最多 3 个; -
Shared Expert(2 个,712 M):所有人永远激活,提供通用语言先验; -
Null Expert(1 个,0 参):输出恒为 0,用来“跳过”已学会或已过时的 token。
训练技巧
-
用 Straight-Through 梯度估计解决 Top-P 不可导; -
采用“基线减法”降低方差(附录 A.4 给出 Euler/Heun 两种 ODE 格式); -
实际激活参数量 1.5 B~18 B 浮动,平均仅 8 B 就能跑 26 B 总参数模型。
场景示例
当模型看到一段语音 token,路由概率集中在 Audio Expert;切换到图像 token 时,同一层立刻把算力挪给 Vision Expert;遇到停用词,直接走 Null Expert——就像“地铁区间车”,哪里人多往哪里开。
2.3 时空 3D RoPE(原文 2.3.1)
文本用 1D RoPE;图像需要 (h,w) 两维;视频再叠加时间 t;音频也以 3 s 为粒度给 t。
Uni-MoE 把旋转位置编码拆成 (t,h,w) 三组 ID,同一图块内先扫宽再扫高,时间轴与音频严格对齐,保证“声画同步”注意力。
3. 生成头:把 token 变回人类可感知信号
3.1 Context-Aware MoE-TTS(原文 2.4 & 3.2.1)
-
基模型:Qwen2.5-0.5 B 变体 + 4 专家 MoE; -
输入:文本 + 风格令牌(说话人、情感、语种); -
输出:WavTokenizer 离散码(40 tokens/s),再经 Codec 解码成 24 kHz 波形; -
支持 2 min+ 长语音:句级拆分+上下文指引,保证韵律连贯。
场景示例
让模型用“Jenny”音色朗读一段 90 s 儿童故事。它先生成 <speech start> Jenny <speech prompt> 控制头,再逐句产出语音码,最后拼成一整段连贯音频,WER 在 TinyStories-en 上低至 5.0%。
3.2 Task-Aware Diffusion Transformer(原文 2.4 图 4)
-
冻结 PixWizard 的 DiT 权重,只训“任务投影器”; -
支持文生图、图生图、深度/Canny 条件生图、去雨/去噪/去雾等 20+ 任务; -
用 <TASK> + <IMG>令牌把指令压缩成 2×32 向量,交叉注意力注入 DiT,15 步推理出图。
场景示例
输入一张雨夜照片 + 提示“Remove the rain”,模型把任务码设为 derain,生成无雨版本,PSNR 25.41 dB,SSIM 0.82,超过多数专用去雨网络。
4. 四段式训练配方:如何把 7B 稠密模型“炼”成全模态 MoE
| 阶段 | 数据规模 | 可训组件 | 关键目标 |
|---|---|---|---|
| 跨模态预训练 | 75 B tokens | MLP+QFormer | 对齐音频/视觉 token 到文本空间 |
| 专家热身 | 30 B tokens | dense 专家 | 先分别训好“语音理解”“视觉理解”“语音生成”三个稠密专家 |
| 混合 SFT | 22 B tokens | 完整 MoE | 把专家并进来,学指令跟随、跨模态推理 |
| 退火 + RL | 5 B tokens | 全网络低 LR | 数据再平衡 + GSPO-DPO 让推理链更稳定 |
退火细节
-
图像数据做“质量过滤”只留 5 B; -
视频挑“音画同步”子集,扩到 21 B; -
文本仅 4 B,但全是 STEM/代码/思维链,保证推理不掉点。
反思
作者团队在博客中写道:“我们原本担心语音生成会拉低视觉指标,结果因为共享注意力层,语音的韵律建模反而给视频帧间一致性带来正迁移——这是把模态装进同一矩阵最意外的收获。”
5. 成绩单:85 个基准的“全图”
5.1 视频 & 全模态理解
-
Video-MME 无字幕 66.4(+6.6 vs Qwen2.5-Omni) -
VSI-Bench 空间推理 56.0(+36.7 vs Qwen2.5-Omni) -
WorldSense 长视频音画 QA 44.7(SOTA)
5.2 长语音 ASR(WER ↓ 更好)
| 数据集 | Uni-MoE-2.0-Omni | Qwen2.5-Omni | 降幅 |
|---|---|---|---|
| LibriSpeech-clean-long | 2.04 % | 7.73 % | -4.2 % |
| LibriSpeech-other-long | 4.20 % | 7.98 % | -3.8 % |
5.3 图像编辑与恢复
| 任务 | 指标 | Uni-MoE-2.0-Omni | 次优模型 | 领先幅度 |
|---|---|---|---|---|
| GEdit-Bench | 分数↑ | 6.02 | PixWizard 3.20 | +88 % |
| MagicBrush-CLIPimg | 分数↑ | 0.789 | PixWizard 0.298 | +165 % |
| Derain-SSIM | 分数↑ | 0.82 | Qwen-Image 0.80 | +2.5 % |
6. 上手实践:从下载到推理,10 行命令
-
克隆仓库
git clone https://github.com/HITsz-TMG/Uni-MoE.git
cd Uni-MoE/Uni-MoE-2
-
安装环境(Python≥3.9,CUDA≥11.8)
pip install -r requirements.txt
-
下载权重(示例:8 专家通用版)
huggingface-cli download HIT-TMG/Uni-MoE-2-8E --local-dir ./ckpt
-
语音+图像对话推理
from unimoe import OmniInference
model = OmniInference(ckpt="./ckpt", device_map="auto")
audio_q = "./ask.wav" # 18 s 语音提问
image = "./city.jpg" # 随手拍
out_text, out_speech, out_img = model.chat(audio_q, image, output_form=["text","speech","image"])
首次运行自动把多层 MoE 拆到多卡,显存峰值约 36 GB(bf16),A100-40G 单卡即可。
7. 常见问题(FAQ)
-
Q:商业场景能否直接部署?
A:权重采用 Apache 2.0,但含 Whisper/SigLIP 组件,请遵循对应许可证;语音生成仅开放研究用途。 -
Q:训练成本大概多少?
A:作者使用 128×A100-80G,四阶段合计约 18 万 GPU 小时;复现可只跑“混合 SFT”阶段,约 3 万 GPU 小时即可得到 90% 性能。 -
Q:与 Qwen2.5-Omni 差异?
A:Qwen2.5-Omni 为稠密 7B,Uni-MoE-2.0-Omni 用 MoE 稀疏激活,平均算力减半,长语音/长视频指标更高,且完全开源。 -
Q:能否再微调自己的音色或画风?
A:可以。MoE-TTS 支持 30 s 参考音频做说话人克隆;Task-DiT 支持 LoRA 微调,只需 5×24 图-文对即可把画风迁移到新主题。 -
Q:为什么有时候生成语音会“跳字”?
A:长句切分策略在极端语速下可能错位,可在推理时把sentence_split_threshold从默认 40 汉字降到 25,基本消除。 -
Q:模型会“幻觉”图像内容吗?
A:生成头依赖冻结 DiT,幻觉率低于端到端自回归方案;若出现不一致,可把guidance_scale从 7.5 提到 10,再抽样一次。
一页速览(打印版)
-
一条序列搞定文本/语音/图像/视频 -
动态 MoE:平均 8 B 激活参数跑 26 B 总量,Top-P 路由省 40% 算力 -
四段训练:预训练→专家热身→混合 SFT→退火+RL -
85 基准新 SOTA:长视频+7%、长语音-4.2% WER、图像编辑 FID 低 29% -
全链路开源:5 个 checkpoint + 训练脚本 + 数据清单 -
10 行命令即可推理,支持语音/图像/文本任意组合输入输出
作者反思
“把语音、视觉全塞进一个 LLM 并不是炫技,而是想让‘多模态’不再等于‘多流水线’。最惊喜的时刻是:当模型用 Jenny 的音色准确回答‘这张照片在桂林’,它其实同时理解了象鼻山的形状、语音提问的语调、以及图片角落里的渔船——三条信息在同一注意力矩阵里交汇,那一刻真正体会到‘统一 token’的价值。”
