Olmo 3:开源训练过程

Allen AI 的 Olmo 3 模型系列不仅仅是“开放权重”,而是完全开源整个训练过程。

Olmo 3:开源训练过程

如果您一直关注开源 AI,您可能已经注意到一个规律:

模型很优秀,但:

  • 训练数据是秘密的
  • 或者训练代码是封闭的
  • 或者强化学习设置含糊不清

Olmo 3 试图打破这种模式。

Allen AI 的 Olmo 3 是一个全新的模型系列——拥有 7B 和 32B 参数——它们不仅仅是“开放权重”,而是完全开放的:

  • 数据配方
  • 训练代码
  • 日志
  • 中间检查点
  • 详细技术报告

简单来说:他们不仅提供了模型,还提供了完整的使用指南。

本文用浅显易懂的语言解释了 Olmo 3,并包含一些简单的 Python 示例。

1、什么是 Olmo 3?

Olmo 3 是一系列语言模型,提供两种主要规模。

  • 70 亿参数(规模较小,运行成本更低)
  • 320 亿参数(规模较大,性能更强,尤其适用于推理)

官方宣称:

“最佳 320 亿基础模型 + 最佳 70 亿西方指令和思维模型。”

但除了模型本身的质量之外,关键在于其开放性:

  • 预训练数据配方公开
  • 训练代码公开
  • 训练日志和训练中期检查点可用
  • 他们发布了详细的技术报告

大多数“开源”模型都做不到这一点。

可以这样理解:

  • Llama / Qwen:“这是最终的蛋糕。”
  • Olmo 3:“这是蛋糕,还有所有配料、步骤、烤箱设置,甚至还有半成品的照片。”

2、Olmo 3 的四种口味

Olmo 3 飞船有四种主要版本。

  • 基础模型 — 原始基础模型(适合预训练/微调)
  • 指导模型 — 聊天和任务模型(简短、快速的回答)
  • 思考模型 — 长篇推理模型(编写详细的思路链)
  • RL Zero — 直接从基础模型通过强化学习微调的模型

你可以像这样在代码中使用它们(伪 Python,使用通用的 call_model 函数):

from my_llm_client import call_model

# 1) Base - good starting point for your own fine-tuning
response_base = call_model(
    model="olmo-3-7b-base",
    prompt="Summarize the plot of 'The Matrix' in one paragraph."
)
# 2) Instruct - snappy chatbot / assistant
response_instruct = call_model(
    model="olmo-3-7b-instruct",
    messages=[
        {"role": "user", "content": "Explain Kubernetes like I'm 12."}
    ]
)
# 3) Think - detailed reasoning, long answers
response_think = call_model(
    model="olmo-3-7b-think",
    messages=[
        {"role": "user", "content": "Prove that the square root of 2 is irrational."}
    ],
    # Let it think more tokens than usual
    max_tokens=1024
)
# 4) RL Zero - exploration and research
response_rlzero = call_model(
    model="olmo-3-7b-rlzero-math",
    messages=[
        {"role": "user", "content": "Solve: 3x + 7 = 22. Show your reasoning."}
    ]
)

这里的名称仅供参考,但其理念是:

  • Base:适用于研究人员和希望在此基础上进行开发的人员。
  • Instruct:适用于应用程序和产品。
  • Think:适用于您可以承受额外词元和延迟以获得更好推理的情况。
  • RL Zero:面向在语言模型上进行强化学习实验的人员。

3、Instruct 模型:你的“主力”助手

Olmo 3 的 Instruct 模型定位为:

  • Tülu 3 的精神继承者
  • “简短、高效、对合成数据友好”
  • (据 Olmo 3 称)明显优于 Llama 3.1 8B
  • 可能是目前最强大的 70 亿级西方/美国公司模型之一

如果您是一家关注以下方面的企业:

  • 数据来源
  • 模型训练方式
  • 法律/治理/审计要求

……这种透明度至关重要。

以下是如何使用 Instruct 模型创建一个小型“问答”助手:

from my_llm_client import call_model

def answer_question(question: str) -> str:
    messages = [
        {"role": "system", "content": "You are a helpful, concise assistant."},
        {"role": "user", "content": question}
    ]
    
    response = call_model(
        model="olmo-3-7b-instruct",
        messages=messages,
        max_tokens=256,
        temperature=0.3
    )
    return response["content"]
print(answer_question("What is vectorization in NumPy?"))

重点:这是 Olmo 3 的“即插即用助手”版本——速度足够快,可以用于生产环境;足够智能,可以处理大多数任务;并且足够开放,可以满足合规性要求高的用户。

4、Think 模型:推理小精灵

Olmo 3 的 Think 版本专为长篇推理而设计。

“长篇推理小精灵:推理能力非常强,可与 Qwen3 8B / 32B 相媲美(总分相差 1-2 分)。”

但与一些“纯粹推理”模型不同,Think 模型强调它仍然具有以下特点:

  • 擅长执行指令
  • 作为聊天机器人运行稳定
  • 略带古怪,趣味十足

4.1 “思维模型”存在的意义

核心理念很简单:

  • 并非每个请求都需要冗长的思考过程。
  • 但一些高风险任务(例如数学、规划、编程)则需要模型进行更多思考。

因此,与其……他们提供两种功能齐全的模型:

  • 指令(Instruct)——针对简短回答进行优化
  • 思考(Think)——针对更长、更深入的推理进行优化

您可以根据自己的“思考预算”(即您能承受的令牌数量和延迟)进行选择。

4.2 示例:在“指导”和“思考”之间切换

你可以用代码构建一个简单的路由:

from my_llm_client import call_model

def smart_call(prompt: str, mode: str = "auto") -> str:
    # Very simple heuristic:
    # - Short questions -> instruct
    # - Math / proof / complex -> think
    prompt_lower = prompt.lower()
    if mode == "auto":
        if any(word in prompt_lower for word in ["prove", "derive", "step by step", "long answer"]) \
           or len(prompt) > 300:
            model = "olmo-3-7b-think"
            max_tokens = 1500
        else:
            model = "olmo-3-7b-instruct"
            max_tokens = 512
    elif mode == "think":
        model = "olmo-3-7b-think"
        max_tokens = 1500
    else:
        model = "olmo-3-7b-instruct"
        max_tokens = 512
    response = call_model(
        model=model,
        messages=[{"role": "user", "content": prompt}],
        max_tokens=max_tokens,
        temperature=0.4
    )
    return response["content"]
print(smart_call("Explain gradient descent in two sentences.", mode="auto"))
print("---")
print(smart_call("Prove that the sum of two even numbers is always even.", mode="auto"))

到 2026 年,我们可能会看到整个模型族都围绕这种“指令-思考”的权衡进行优化。

Olmo 3 本质上是这一理念的早期版本。

5、Think 模型的训练方式:SFT — DPO — RLVR

Think 的训练流程包含三个主要阶段:

  • 大型推理 SFT(监督式微调)
  • DPO(直接偏好优化)
  • RLVR(基于可验证奖励的强化学习)

让我们逐一进行简要说明。

5.1 大型推理 SFT:Dolci-Think-SFT

第一阶段是一个名为 Dolci-Think-SFT 的大型监督式数据集,它基于以下数据集:

  • OpenThoughts3
  • Nemotron 训练后数据集
  • SYNETHIC-2
  • Tülu 3 / OLMo 2 “提示集”
  • 以及其他数据集

您可以这样理解:

“我们精心挑选了大量优秀的推理示例,并让模型模仿它们。”

如果您曾经使用自己的数据对模型进行过微调,那么这个概念对您来说应该并不陌生。

以下是 SFT 的一个简单概念性代码示例(huggingface 风格的伪代码):

from transformers import AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments
from datasets import load_dataset

model_name = "ai2/olmo-3-7b-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# Hypothetical reasoning dataset
dataset = load_dataset("ai2/dolci-think-sft")
def tokenize(example):
    prompt = example["prompt"]
    completion = example["completion"]
    text = prompt + "\n\n" + completion
    tokens = tokenizer(text, truncation=True, max_length=2048)
    tokens["labels"] = tokens["input_ids"].copy()
    return tokens
tokenized = dataset.map(tokenize, batched=True)
args = TrainingArguments(
    output_dir="./olmo3-think-sft",
    per_device_train_batch_size=2,
    learning_rate=1e-5,
    num_train_epochs=1,
)
trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized["train"]
)
trainer.train()

当然,实际的训练规模要大得多,也复杂得多,但从概念上讲,它只是“教模型模仿好的推理”。

他们甚至说,这个数据集的影响力可能与模型本身一样大——因为好的推理数据仍然相对稀缺且宝贵。

5.2 DPO 阶段:从差异中学习,而不仅仅是好的答案

SFT 之后是 DPO(直接偏好优化)。

简单来说:

  • 你向模型展示同一个问题的两个答案:
  • 一个来自一个强模型(例如,Qwen3 32B)
  • 另一个来自一个弱模型(例如,Qwen3 0.6B)
  • 你标注:“A 比 B 好。”
  • 模型不仅学习好的答案,还会学习这个“差值”(即好答案和坏答案之间的差异)。

这种方法借鉴了 SmolLM 3 的训练方式。

DPO(概念)伪代码:

from dpo_trainer import DPOTrainer  # pretend helper

dataset = load_dataset("ai2/dpo-qwen3-32b-vs-0_6b")
def format_example(example):
    return {
        "prompt": example["prompt"],
        "chosen": example["answer_strong"],   # from Qwen3 32B
        "rejected": example["answer_weak"]   # from Qwen3 0.6B
    }
formatted = dataset.map(format_example)
trainer = DPOTrainer(
    model=model,  # e.g. Olmo 3 Think SFT
    beta=0.1,
    train_dataset=formatted["train"],
)
trainer.train()

重要性:

  • DPO 即使在 AIME、GPQA 等高难度基准测试中也能持续提升性能。它支持“增量学习”假说:模型通过显式学习区分好行为和坏行为,性能会显著提升。
  • 许多早期的开放式“思考”模型跳过了这一步骤,导致其潜在性能未能得到充分发挥。

Olmo 3 则不然。

5.3 RLVR 阶段:基于可验证奖励的强化学习

最后,他们使用了 RLVR——一种基于可验证检查的强化学习方法。(不仅仅是人类的偏好)。

灵感来源包括:

  • ServiceNow 的 PipelineRL
  • DAPO
  • GRPO 博士

简单思路:

  • 模型生成答案。
  • 验证者/检查者评估答案(例如,代码的测试用例,数学的答案正确性)。
  • 模型根据答案的正确性和实用性获得奖励。
  • 强化学习更新模型以提高预期奖励。

概念伪代码:

def reward_function(prompt, completion):
    """
    A fake verifiable reward function.
    In practice, this might run unit tests, a math checker, etc.
    """
    if "3x + 7 = 22" in prompt:
        # Check if completion contains 'x = 5'
        return 1.0 if "x = 5" in completion.replace(" ", "") else 0.0
    return 0.0

def rl_step(model, batch_prompts):
    completions = model.generate(batch_prompts)
    rewards = [reward_function(p, c) for p, c in zip(batch_prompts, completions)]
    
    # RL update (very abstract)
    loss = -model.logprob(completions) * rewards
    loss.backward()
    optimizer.step()

据报道,Olmo 3 采用了缩放算法。 RLVR 规模已达 320 亿,并采用了一些基础设施技巧来增强稳定性,包括:

  • “主动填充”(下文详述)
  • 异步基础设施能够很好地应对长时间的迭代

6、主动填充:在强化学习期间保持 GPU 活跃度

大型模型的强化学习之所以困难,是因为:

  • 某些轨迹(迭代)产生的梯度为零(没有学习信号)。
  • 长时间的迭代会导致 GPU 闲置,等待其他迭代完成。

Olmo 3 引入了一种名为“主动填充”的技巧:

“持续生成学习节点,直到生成一个完整的、梯度非零的迭代批次。”

直觉:

  • 不要把时间浪费在无法提供学习信号的迭代上。
  • 持续采样,直到获得一个真正可用于训练的迭代批次。

非常简略的示例:

def collect_useful_batch(env, model, batch_size):
    useful_prompts = []
    useful_completions = []
    useful_rewards = []

while len(useful_prompts) < batch_size:
        prompt = env.sample_prompt()
        completion = model.generate([prompt])[0]
        reward = reward_function(prompt, completion)
        if reward != 0:  # only keep non-zero gradient samples
            useful_prompts.append(prompt)
            useful_completions.append(completion)
            useful_rewards.append(reward)
    return useful_prompts, useful_completions, useful_rewards

这对于在 320 亿规模下运行强化学习来说是一个显著的稳定性提升,尤其是在迭代周期较长且基础设施异步运行的情况下。

7、RL Zero:直接在基础模型上进行强化学习

DeepSeek R1 提出了一个颇具启发性的想法:

“如果直接从基础模型开始进行强化学习会怎样?”(而不是像传统方法那样:基础模型 → 结构化框架 → 强化学习。)

Olmo 3 以完全开放的方式探索了这一想法。

他们:

  • 在开发过程中直接在基础模型上运行强化学习。
  • 有时会在训练过程中加入强化学习反馈。
  • 将“强化学习能力”视为基础模型的内置属性,而不是最后添加的步骤。

而且,他们提供的不仅仅是一个强化学习模型,而是一整套工具包。

  • 4 个 RL Zero 数据集
  • 每个领域 70 亿个检查点,涵盖:数学、代码、指令和混合内容

这意味着您可以真正研究强化学习的动态过程:

  • 强化学习如何随时间改变模型?
  • 它在不同领域(数学、代码、通用)有何不同?
  • 它有哪些优点,又有哪些缺点?

概念示例:加载特定领域的强化学习零模型检查点。

from transformers import AutoModelForCausalLM, AutoTokenizer

# Example domain-specialized RL Zero model (illustrative name)
model_name = "ai2/olmo-3-7b-rlzero-math"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
prompt = "Solve the equation: 2(x - 3) = 10. Show your steps."
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(
    **inputs,
    max_length=256,
    do_sample=True,
    top_p=0.9,
    temperature=0.7
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

对于研究人员来说,这很有价值:您可以探索 RLVR 的异常情况,而不是仅仅依靠单一的“最终”前沿模型进行猜测。

8、用 Olmo 3 研究什么?

由于一切都是开放的,Olmo 3 为您提供了回答以下问题的工具:

  • 数学/推理基准测试中的污染。模型真的在进行推理吗?还是它们在训练过程中就已经看到了答案?
  • 虚假奖励。我们是否在奖励一些技巧,而不是真正的推理?参见:Shao 等人。 (“虚假奖励”)
  • 推理 vs. 记忆。冗长的思维链是真正的逻辑还是记忆的模式?参见:Wu 等人(“推理还是记忆?”)

您可以:

  • 重现他们的强化学习设置
  • 替换奖励函数
  • 探测过拟合或奖励作弊
  • 逐个检查点检查变化

换句话说:您不再需要将强化学习行为视为黑箱。

9、思考预算:延迟 vs. 质量

围绕 Olmo 3 的一个较好的框架理念是“思考预算”。

与其问:

“我们是否需要一个思考模型?”

不如问:

“每个任务我们可以承受多少个标记(以及多少延迟)?”
  • 用于快速完成用户界面或者,如果需要自动补全:请使用 Instruct 并设置较小的 max_tokens 值。
  • 对于深度推理、规划、定理证明和审计:请使用 Think 并设置较大的 max_tokens 值。

基于“思考预算”的示例路由:

def call_with_budget(prompt: str, budget: str = "low") -> str:
    if budget == "low":
        model = "olmo-3-7b-instruct"
        max_tokens = 256
    elif budget == "medium":
        model = "olmo-3-7b-instruct"
        max_tokens = 512
    else:  # "high"
        model = "olmo-3-7b-think"
        max_tokens = 1500

response = call_model(
        model=model,
        messages=[{"role": "user", "content": prompt}],
        max_tokens=max_tokens
    )
    return response["content"]
print(call_with_budget("Give me a short summary of attention mechanism.", "low"))
print("---")
print(call_with_budget("Help me plan a 3-month roadmap to learn full-stack web development.", "high"))

预计未来的模型系列(2026 年及以后)将沿着这个维度进行清晰的组织。

Olmo 3 的实质是:“我们现在正在这样做,您可以查看所有内容。”

10、Olmo 3 之后是什么?

根据路线图提示:

  • 混合专家模型 (MoE)。为了更高效地扩展:以更低的推理成本获得更好的性能。
  • 更好的角色/风格训练。能够更一致地保持角色、风格和语气的模型。
  • 帕累托最优的指令型与思考型模型系列。位于以下各项之间“最佳权衡曲线”上的模型:延迟/成本、推理能力。
  • 更大的规模。更大的基础模型和思考型模型,可能会与前沿模型展开更多竞争。

简而言之:Olmo 3 不仅仅是“又一个模型版本”。它是一个用于研究强化学习、推理、污染以及“思考与速度”权衡的平台——而且它足够开放,你可以从中真正学到东西。

11、如何在你的项目中使用 Olmo 3

一些具体的想法:

构建一个透明的 AI 助手:

  • 使用 7B Instruct 或 7B Think 作为基础架构。
  • 清晰地记录训练数据和代码的来源。

尝试你自己的强化学习流程:

  • 从 RL Zero 的数学或代码检查点开始。
  • 替换你自己的奖励函数和任务。

评估污染或奖励机制优化:

  • 使用他们的数据集和检查点。
  • 复现推理基准测试并检查异常行为。

研究“思考预算”策略:

  • 实现 Instruct 和 Think 之间的路由。
  • 衡量质量、延迟和成本。

即使你从未将 Olmo 3 部署到生产环境中,它仍然是学习LLM训练实践的绝佳学习环境。


原文连接:Olmo 3: The Fully-Open 7B & 32B AI Model Taking On Qwen and DeepSeek

汇智网翻译整理,转载请标明出处