目前,包括开源研究在内的大多数成功的 RL 作品都依赖于相对较大的基础模型,如 32B 模型,尤其是在增强代码推理能力方面。此外,人们普遍认为,在一个小模型中实现数学能力和代码能力的统一和同步提高具有挑战性。尽管如此,我们认为,经过 RL 训练的推理模型的有效性依赖于基础模型固有的推理潜力。要想充分释放语言模型的推理潜力,不仅要注重后期训练,还要注重为推理量身定制的前期训练策略。
在这项工作中,我们提出了 MiMo-7B 模型,这是一系列从零开始训练的模型,专为推理任务而生。我们对 MiMo-7B-Base 进行的 RL 实验表明,我们的模型具有非凡的推理潜力,甚至超过了更大的 32B 模型。此外,我们还对冷启动的 SFT 模型进行了 RL 训练,最终得到了 MiMo-7B-RL 模型,它在数学和代码推理任务中都表现出了卓越的性能,与 OpenAI o1-mini 的性能不相上下。
我们开源了 MiMo-7B 系列,包括基本模型、SFT 模型、从基本模型训练的 RL 模型和从 SFT 模型训练的 RL 模型的检查点。我们相信,这份报告和这些模型将为开发功能强大的推理 LLM 提供有价值的见解,使更多人受益。
🌟 亮点
-
预训练:为推理而生的基础模型
- 我们优化了数据预处理管道,增强了文本提取工具包,并应用多维数据过滤来增加预训练数据中的推理模式密度。我们还采用了多种策略来生成大量多样化的合成推理数据。
- 我们采用三阶段数据混合策略进行预训练。总体而言,MiMo-7B-Base 是在大约 25 万亿个词库上进行预训练的。
- 我们将多语种预测作为额外的训练目标,从而提高了模型性能并加快了推理速度。
-
训练后配方:开创性的推理模型
- 我们收集了 130K 个数学和代码问题作为 RL 训练数据,可由基于规则的验证器进行验证。每个问题都经过仔细的清理和难度评估,以确保质量。
- 为了缓解高难度代码问题的奖励稀疏问题,我们引入了测试难度驱动的代码奖励。通过为不同难度的测试用例分配细粒度的分数,可以通过密集奖励信号更有效地优化策略。
- 我们针对简单问题实施了数据再采样策略,以提高推出采样效率并稳定策略更新,尤其是在 RL 训练的后期阶段。
-
RL 基础设施
-
我们开发了一个无缝推出引擎(Seamless Rollout Engine)来加速 RL 训练和验证。我们的设计集成了连续推出、异步奖励计算和提前终止功能,最大限度地减少了 GPU 的闲置时间,使训练速度提高了 2.29 倍,验证速度提高了 1.96 倍。
-
我们支持 vLLM 中的 MTP,并增强了 RL 系统中推理引擎的鲁棒性。
-
型号详细信息
模型可在https://huggingface.co/XiaomiMiMo
模型 | 描述 | 下载 |
---|---|---|
MiMo-7B-Base | 具有非凡推理潜力的基础模型 | 🤗 XiaomiMiMo/MiMo-7B-Base |
MiMo-7B-RL-Zero | 根据基础模型训练的 RL 模型 | 🤗 XiaomiMiMo/MiMo-7B-RL-Zero |
MiMo-7B-SFT | 根据基础模型训练的 SFT 模型 | 🤗 XiaomiMiMo/MiMo-7B-SFT |
MiMo-7B-RL | RL 模型由 SFT 模型训练而成,性能优于 OpenAI o1-mini | 🤗 XiaomiMiMo/MiMo-7B-RL |
评估结果
Benchmark | GPT-4o-0513 | Claude-3.5-Sonnet-1022 | OpenAI o1-mini | QwQ-32B-Preview | R1-Distill-Qwen-14B | R1-Distill-Qwen-7B | MiMo-7B-RL |
---|---|---|---|---|---|---|---|
General | |||||||
GPQA Diamond (Pass@1) | 49.9 | 65.0 | 60.0 | 54.5 | 59.1 | 49.1 | 54.4 |
SuperGPQA (Pass@1) | 42.4 | 48.2 | 45.2 | 43.6 | 40.6 | 28.9 | 40.5 |
DROP (3-shot F1) | 83.7 | 88.3 | 83.9 | 71.2 | 85.5 | 77.0 | 78.7 |
MMLU-Pro (EM) | 72.6 | 78.0 | 80.3 | 52.0 | 68.8 | 53.5 | 58.6 |
IF-Eval (Prompt Strict) | 84.3 | 86.5 | 84.8 | 40.4 | 78.3 | 60.5 | 61.0 |
Mathematics | |||||||
MATH-500 (Pass@1) | 74.6 | 78.3 | 90.0 | 90.6 | 93.9 | 92.8 | 95.8 |
AIME 2024 (Pass@1) | 9.3 | 16.0 | 63.6 | 50.0 | 69.7 | 55.5 | 68.2 |
AIME 2025 (Pass@1) | 11.6 | 7.4 | 50.7 | 32.4 | 48.2 | 38.8 | 55.4 |
Code | |||||||
LiveCodeBench v5 (Pass@1) | 32.9 | 38.9 | 53.8 | 41.9 | 53.1 | 37.6 | 57.8 |
LiveCodeBench v6 (Pass@1) | 30.9 | 37.2 | 46.8 | 39.1 | 31.9 | 23.9 | 49.3 |
MiMo-7B series
Benchmark | MiMo-7B-Base | MiMo-7B-RL-Zero | MiMo-7B-SFT | MiMo-7B-RL |
---|---|---|---|---|
Mathematics | ||||
MATH500 (Pass@1) | 37.4 | 93.6 | 93.0 | 95.8 |
AIME 2024 (Pass@1) | 32.9 | 56.4 | 58.7 | 68.2 |
AIME 2025 (Pass@1) | 24.3 | 46.3 | 44.3 | 55.4 |
Code | ||||
LiveCodeBench v5 (Pass@1) | 32.9 | 49.1 | 52.3 | 57.8 |
LiveCodeBench v6 (Pass@1) | 29.1 | 42.9 | 45.5 | 49.3 |
[!重要]
评估在temperature=0.6
.AIME24 和 AIME25 的平均得分为 32 次重复。LiveCodeBench v5(20240801-20250201)、LiveCodeBench v6(20250201-20250501)、GPQA-Diamond 和 IF-Eval 的平均得分为 8 次重复。MATH500 和 SuperGPQA 为单次运行。
部署
vLLM 推理
- [推荐] 我们使用 our fork of vLLM.
脚本示例
from vllm import LLM, SamplingParamsmodel_path = "/path/to/MiMo"
llm = LLM(model=model_path,trust_remote_code=True,num_speculative_tokens=1,disable_log_stats=False
)
sampling_params = SamplingParams(temperature=0.6)conversation = [{"role": "system","content": ""},{"role": "user","content": "Write an essay about the importance of higher education.",},
]outputs = llm.chat(conversation,sampling_params=sampling_params,use_tqdm=False)for output in outputs:prompt = output.promptgenerated_text = output.outputs[0].textprint(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")print("=" * 80)
- 或者,您可以为 MiMo 注册一个 vLLM 加载器,而不加载 MTP 参数。
您可以将 registry/register_mimo_in_vllm.py
复制到您的目录,并使用导入它。
import register_mimo_in_vllmfrom vllm import LLM, SamplingParamsmodel_path = "/path/to/MiMo"
llm = LLM(model=model_path,trust_remote_code=True,# num_speculative_tokens=1,disable_log_stats=False
)
sampling_params = SamplingParams(temperature=0.6)
HuggingFace 推理
脚本示例
from transformers import AutoModel, AutoModelForCausalLM, AutoTokenizermodel_path = "/path/to/MiMo"
model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(model_path)
inputs = tokenizer(["Today is"], return_tensors='pt')
output = model.generate(**inputs, max_new_tokens = 100)
print(tokenizer.decode(output.tolist()[0]))