跳到正文
原文
Hugging Face Blog·· 2026-04-29精选AI 评分62

Granite 4.1 LLM 是如何构建的:IBM 披露五阶段预训练与多阶段 RL 细节

Granite 4.1 LLMs: How They’re Built

AI 摘要

IBM Granite 团队发布 Granite 4.1 系列稠密解码器 LLM(3B、8B、30B),基于约 15T token 的五阶段预训练流程,上下文窗口最长扩展至 512K token,并以 Apache 2.0 许可开源。

正文 · AI 翻译

深入解析 Granite 4.1 LLM 背后的数据工程、预训练、监督微调与强化学习的技术细节。

作者:Granite 团队,IBM


TL;DR — Granite 4.1 是一系列稠密、仅解码器 LLM(3B、8B 和 30B),使用多阶段预训练流程在约 15T token 上训练,包括长达 512K token 的长上下文扩展。这些模型进一步通过约 4.1M 高质量精选样本的监督微调和基于 on-policy GRPO 与 DAPO 损失的强化学习(Yu et al., 2025)进行优化。值得注意的是,8B instruct 模型尽管使用更简单的稠密架构和更少参数,却匹配或超越了之前的 Granite 4.0-H-Small(32B-A9B MoE)。所有 Granite 4.1 模型均在 Apache 2.0 许可下发布。

链接:


概述

构建高质量的小型语言模型不仅仅是扩展计算——它需要在训练全程进行严格的数据管理。对于 Granite 4.1,我们优先考虑数据质量而非数量,在五个预训练阶段逐步优化数据混合。我们进一步使用 LLM-as-Judge 框架精选监督微调数据,并应用多阶段强化学习流程,系统性地增强数学、编码、指令遵循和通用聊天方面的性能。


模型架构

Granite 4.1 模型使用仅解码器稠密 transformer 架构。核心设计选择包括 分组查询注意力(GQA)、旋转位置嵌入(RoPE)、SwiGLU 激活、RMSNorm 和 共享输入/输出嵌入。

组件 3B 稠密 8B 稠密 30B 稠密
嵌入大小 2560 4096 4096
层数 40 40 64
注意力头大小 64 128 128
注意力头数 40 32 32
KV 头数 8 8 8
MLP 隐藏大小 8192 12800 32768
MLP 激活 SwiGLU SwiGLU SwiGLU
位置嵌入 RoPE RoPE RoPE

所有三种模型大小共享相同的训练流程和数据策略,仅在架构维度上有所不同。


预训练

Granite 4.1 使用五阶段训练策略,从零开始在约 15 万亿 token 上训练。阶段 1–2 专注于基础预训练,阶段 3–4 执行中期训练,逐步使用更高质量的数据退火,阶段 5 引入长上下文训练,将上下文窗口扩展到 512K token。每个阶段采用不同的数据混合和学习率计划,逐渐从广泛的网络规模数据转向更精选的领域特定内容。

Five-phase pre-training pipeline

图 2:五阶段预训练流程。阶段 1–2 是预训练,阶段 3–4 是中期训练(高质量数据退火),阶段 5 是长上下文训练(LCE)。

阶段 1:通用预训练(10T token)

第一阶段使用通用训练数据混合,采用幂律学习率计划和预热,建立广泛的语言理解。

数据组成:

  • CommonCrawl 约 59% — 通用网络数据
  • 代码 约 20% — 编程语言和代码仓库
  • 数学 约 7% — 数学推理数据
  • 技术 约 10.5% — 科学论文、技术文档和手册
  • 多语言 约 2% — 非英语语言数据
  • 特定领域 ~1.5% — 特定领域内容

阶段 2:数学/代码预训练(2T tokens)

阶段 2 大幅提高了代码和数学数据的比例,转向更强的推理能力,同时仍保持通用语言覆盖。

数据构成:

  • 数学 ~35% — 比阶段 1 增加 5 倍
  • 代码 ~30% — 增加 1.5 倍
  • CommonCrawl-HQ ~12% — 高质量 Common Crawl 子集
  • 合成数据 ~9% — 合成高质量数据
  • 技术 ~10%
  • 多语言 ~3%
  • 特定领域 ~1%

阶段 3:高质量数据退火(2T tokens)

阶段 3 过渡到中期训练,采用更均衡、高质量的混合数据以及指数衰减学习率调度。在这里,我们开始混入思维链和合成指令数据。

数据构成:

  • CommonCrawl-HQ ~16.67%
  • 数学 ~16.67%
  • 代码 ~16.67%
  • 合成数据 ~8.5%
  • 技术 ~12.5%
  • 多语言 ~4.5%
  • 长思维链 ~12.5% — 推理轨迹
  • 语言指令 ~7.5% — 指令微调数据
  • 代码指令 ~4.5% — 指令微调数据

阶段 4:高质量数据退火 — 精炼(0.5T tokens)

第四阶段继续中期训练,采用线性学习率衰减至零,使模型专注于可用的最高质量数据。

数据构成:

  • CommonCrawl-HQ ~40%
  • 代码 ~20%
  • 数学 ~20%
  • 长思维链 ~6%
  • 代码指令 ~5%
  • 语言指令 ~9%

Data mix evolution across pre-training phases

图 3:数据混合在预训练各阶段中如何演变。注意从以网络数据为主(阶段 1)到以高质量数据、指令和推理数据为主(阶段 3–4)的逐步转变。

阶段 5:长上下文训练(LCE)

第五阶段也是最后一个阶段,同样属于中期训练,通过分阶段的长上下文扩展过程将上下文窗口从 4K 扩展到 512K:

  1. 32K 扩展 — 使用与阶段 4 相同的数据混合
  2. 128K 扩展 — 与阶段 4 相同的数据混合
  3. 512K 扩展 — 80% 书籍 + 20% 代码仓库数据(仅 8b 和 30b)

LCE 阶段使用指数学习率调度,从 1e-4 开始并衰减至 0。为确保模型原生处理长序列而不降低短上下文性能,我们在每个 LCE 阶段后进行模型合并。基础模型的 RULER 基准测试:

模型名称 32K 64K 128K
granite-4.1-3b-base 75.0 66.6 58.0
granite-4.1-8b-base 83.6 79.1 73.0
granite-4.1-30b-base 85.2 84.6 76.7

SFT:数据准备与质量控制

监督微调(SFT)是将基础模型转变为可靠的指令遵循助手的关键步骤,因此数据质量至关重要——因为即使少量错误或幻觉样本也可能灌输不良行为。为解决这一问题,我们采用严格的 LLM-as-Judge 框架,并结合基于规则的过滤来筛选高质量样本。该流程会自动根据结构、语义和行为标准评估每个样本,尽可能修复问题,并过滤掉不符合质量标准的样本。

SFT Data Quality Pipeline

图 4:SFT 数据质量流程。原始对话数据经过带有多维评分标准的 LLM-as-Judge,产生接受/边缘/拒绝的判定。硬拒绝缺陷(幻觉、虚假前提、错误计算)无论得分如何都会触发自动拒绝。

我们严格的 LLM-as-Judge 框架仅评估助手回复,将系统提示、用户输入、检索文档和工具输出严格视为上下文信息。这确保评判者评估的是模型说了什么,而不是它被要求做什么。在 RAG 设置中,未基于检索上下文的回复会被标记为幻觉,而工具使用输出则根据允许的工具集及其参数模式进行验证。

我们采用针对不同 SFT 数据类型定制的专用评判提示,包括多轮对话、RAG 增强回复、工具调用交互和多语言对话。每个回复在六个加权维度上评分——指令遵循、正确性、完整性、简洁性、自然度和校准(可选批判性思维检查)。样本根据确定性分数阈值被接受、标记为边缘或拒绝,硬拒绝规则会针对幻觉、虚假前提或错误计算等严重缺陷覆盖分数。

为补充语义评估,我们应用确定性的基于规则的流程,通过文本规范化、截断和长度过滤、模式验证以及泄漏检测来强制结构完整性。最后的全局去重步骤确保数据集范围内的唯一性。所有过滤和纠正操作均可完全审计。

SFT 训练细节

经过 LLM-as-Judge、基于规则的过滤和全局去重流程后,我们在约 410 万 个高质量样本上微调基础模型。以下细节适用于所有三个模型变体:

训练配置:

参数 值
计算 16 个节点,每节点 4x GB200
轮数 3
学习率 5e-6(线性预热 3%,在约 25K 步内线性衰减)
序列长度 16,384 个 token
总样本数 约 410 万
有效批量大小 256 样本/迭代(约 420 万 token/迭代)

强化学习:多阶段 RL 流程

在 SFT 之后,我们应用多阶段强化学习流程,以进一步提升模型在特定领域的能力。我们不是进行单次 RL 训练,而是运行 多个有针对性的 RL 阶段,每个阶段针对不同能力进行优化。

训练方法

我们使用 On-policy GRPO(Group Relative Policy Optimization)(Shao et al., 2024)以及 DAPO(Decoupled Clip and Dynamic sAmpling Policy Optimization)损失(Yu et al., 2025),与标准 GRPO 相比,它能提供更稳定的训练信号。然而,由于动态采样在计算上非常密集,我们在训练过程中将其关闭。

RL 训练配置

参数 值
算法 带 DAPO 损失的 On-policy GRPO
训练栈 SkyRL(NovaSky-AI, 2025)
每个提示的样本数 16
训练批次大小 1024
上下文长度 8,192

RL 流程

图 10 展示了我们用于训练 Granite 4.1 模型的强化学习流程。通过对多种强化学习方案进行大量实验,我们发现这一系列步骤能够在最大化多个领域性能的同时,将灾难性遗忘降至最低。

Granite 4.1 Reinforcement Learning Pipeline

图 10:Granite 4.1 强化学习流程,由四个连续阶段组成:多领域 RL、RLHF、身份与知识校准 RL,以及数学 RL。

多领域 RL

在此阶段,模型在来自多个领域的统一数据混合上进行联合训练。因此,每次梯度更新都反映了任务的完整多样性,从而防止灾难性遗忘、提升整体基准性能,并最大限度地减少任何单个任务上的性能回退。

此阶段涵盖的不同领域包括:

领域 描述
数学 数学推理与计算
科学 科学知识与推理
逻辑推理 演绎与归纳逻辑
指令遵循(IF) 遵循复杂指令
结构化输出 结构化数据输出
Text2SQL 数据库查询生成
时间推理 基于时间的逻辑与排序
通用聊天 通用对话质量
上下文学习 从上下文示例中学习

在此阶段,我们在 45,504 个独特提示上训练模型(对所有 Granite 4.1 模型取平均),并发现学习率为 5e‑7、KL 损失系数($\beta$)为 0.05 时,在多领域强化学习中表现最佳。

RLHF

为了进一步提升模型的有用性和聊天能力,我们使用多语言标量奖励模型在通用聊天提示上训练模型。在此阶段,我们观察到与 SFT 检查点相比,Alpaca-Eval 平均提升了 约 18.9 分(对三个 Granite 4.1 模型取平均)。

为缓解策略偏离其先前学到的知识,我们在此阶段使用保守的学习率 3e-7 和更高的 KL 损失系数 $\beta$ 0.09。在此 RLHF 阶段,我们平均使用 17,920 个独特提示。

身份与知识校准 RL

在此阶段,我们在身份与知识校准提示上对模型进行少量步骤的训练(约 40 个训练步骤)。我们观察到,这个小型训练阶段显著提升了模型的自我识别能力。

与 RLHF 阶段类似,我们使用学习率 3e-7 和 KL 损失系数 $\beta$ 0.09,并且在此阶段使用 1728 个独特提示。

数学 RL

在我们的 RL 训练过程中,我们发现 RLHF 阶段会导致数学基准测试分数下降(例如在 GSM8K、DeepMind-Math 中)。Math RL 阶段使模型能够从这一下降中恢复,并在数学基准测试上超越原始 SFT 性能:GSM8K 平均提升 ~3.8 分,DeepMind-Math 平均提升 ~23.48 分。我们在该阶段平均使用 13,504 个唯一提示,与多领域 RL 阶段类似,我们使用的学习率为 5e-7,KL 损失系数 $\beta$ 为 0.05。


结果

基础模型基准测试

基准测试 指标 3B 8B 30B
通用任务
MMLU 5-shot 66.47 73.60 78.44
MMLU-Pro 5-shot, CoT 37.16 44.58 49.51
BBH 3-shot, CoT 63.84 73.83 80.66
AGI EVAL 3-shot 54.32 61.68 69.20
DROP 5-shot 66.04 72.36 78.57
数学任务
GSM8K 8-shot 72.93 73.54 83.78
Minerva Math 4-shot 38.00 43.42 45.66
代码任务
HumanEval pass@1 (StarCoder) 76.19 79.24 81.52
HumanEval pass@1 59.76 68.29 69.50
HumanEval+ pass@1 54.27 62.20 61.60
Eval+ Avg 65.94 62.05 63.90
多语言任务
MMMLU 5-shot 56.59 64.73 73.36
INCLUDE 5-shot 51.77 57.60 67.07
MGSM 8-shot 58.48 63.68 74.40

指令模型基准测试

基准测试 指标 3B 8B 30B
通用任务
MMLU 5-shot 67.02 73.84 80.16
MMLU-Pro 5-shot, CoT 49.83 55.99 64.09
BBH 3-shot, CoT 75.83 80.51 83.74
AGI EVAL 0-shot, CoT 65.16 72.43 77.80
GPQA 0-shot, CoT 31.70 41.96 45.76
SimpleQA 3.68 4.82 6.81
对齐任务
AlpacaEval 2.0 38.57 50.08 56.16
IFEval Avg 82.30 87.06 89.65
ArenaHard 37.80 68.98 71.02
MTBench Avg 7.53 8.50 8.53
数学任务
GSM8K 8-shot 86.88 92.49 94.16
GSM Symbolic 8-shot 81.32 83.70 75.70
Minerva Math 0-shot, CoT 67.94 80.10 81.32
DeepMind Math 0-shot, CoT 64.64 80.07 81.93
代码任务
HumanEval pass@1 79.27 87.20 89.63
HumanEval+ pass@1 74.39 80.49 85.98
MBPP pass@1 61.64 82.54 83.33
MBPP+ pass@1 52.91 70.64 71.69
CRUXEval-O pass@1 40.75 47.63 55.75
BigCodeBench pass@1 32.19 35.00 38.77
MULTIPLE pass@1 52.54 60.26 62.31
Eval+ Avg pass@1 67.05 80.21 82.66
工具调用
BFCL v3 60.80 68.27 73.68
多语言任务
MMMLU 5-shot 57.61 64.84 73.71
INCLUDE 5-shot 52.05 58.89 67.26
MGSM 8-shot 70.00 82.32 71.12
安全性
SALAD-Bench 93.95 95.80 96.41
AttaQ 81.88 81.19 85.76
Tulu3 Safety Eval Avg 66.84 75.57 78.19

支持的语言:英语、德语、西班牙语、法语、日语、葡萄牙语、阿拉伯语、捷克语、意大利语、韩语、荷兰语和中文。


Granite 4.1 与领先开源模型的比较

Granite 4.1 在不依赖长思维链的情况下,提供了具有竞争力的指令遵循和工具调用能力。通过避免扩展推理轨迹,它提供了可预测的延迟、稳定的 token 使用量和更低的运营成本。这使 Granite 4.1 成为生产就绪的开源选择,适用于效率、可靠性和成本控制至关重要的企业工作负载。

BFCL V3

IFEval

Granite 4.1-8B 与 Granite 4.0-H-Small (32B-A9B) 对比

一个引人注目的结果:Granite 4.1-8B 稠密模型持续匹配或超越上一代 Granite 4.0-H-Small,后者是一个拥有 320 亿参数、90 亿激活参数的混合专家模型。

Granite 4.1-8B vs Granite 4.0-H-Small comparison

图 13:Granite 4.1-8B(深蓝色)与 Granite 4.0-H-Small 32B-A9B(浅蓝色)在各基准测试上的对比。8B 稠密模型在 IFEval、AlpacaEval、MMLU-Pro、BBH、GSM8K、DeepMind-Math、Evalplus、ArenaHard、BFCL V3 和 MBPP(+) 上匹配或超过了更大的 MoE 模型。

Granite 4.1 模型家族对比

Granite 4.1 model family comparison

图 14:Granite 4.1 家族——30B、8B 和 3B 模型的对比。分数随模型规模可预测地扩展,30B 模型在所有基准测试中领先。

FP8 量化

我们还发布了 Granite 4.1 模型的 fp8 量化变体,针对使用 vLLM 进行推理进行了优化。精度从 16 位降低到 8 位,使磁盘占用和 GPU 内存使用量均减少约 50%。量化仅使用 LLM Compressor 应用于 transformer 块内线性算子的权重和激活,而所有其他层均保持其原始精度。

基础设施

我们在 CoreWeave 托管的 NVIDIA GB200 NVL72 集群上训练了 Granite 4.1 语言模型:

  • 机架内通信:72-GPU NVLink 域
  • 机架间通信:无阻塞、全 Fat-Tree NDR 400 Gb/s InfiniBand 网络
  • 规模:集群中数千个 GPU

该基础设施提供了可扩展的高带宽互连,满足所需 token 量(仅预训练就超过 15T token)下高效分布式训练的需求。


快速开始

Granite 4.1 模型在 Apache 2.0 许可证下提供。以下是如何开始使用 30B instruct 模型及工具调用示例:

pip install torch torchvision torchaudio
pip install accelerate
pip install transformers
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

device = "cuda"
model_path = "ibm-granite/granite-4.1-30b"
tokenizer = AutoTokenizer.from_pretrained(model_path)
# drop device_map if running on CPU
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device)
model.eval()

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "Get the current weather for a specified city.",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "Name of the city"
                    }
                },
                "required": ["city"]
            }
        }
    }
]

# change input text as desired
chat = [
    { "role": "user", "content": "What's the weather like in London right now?" },
]
chat = tokenizer.apply_chat_template(chat, \
                                     tokenize=False, \
                                     tools=tools, \
                                     add_generation_prompt=True)
# tokenize the text
input_tokens = tokenizer(chat, return_tensors="pt").to(device)
# generate output tokens
output = model.generate(**input_tokens, 
                        max_new_tokens=100)
# decode output tokens into text
output = tokenizer.batch_decode(output)
# print output
print(output[0])

预期输出:

<|start_of_role|>system<|end_of_role|>You are a helpful assistant with access to the following tools. You may call one or more tools to assist with the user query.

You are provided with function signatures within <tools></tools> XML tags:
<tools>
{"type": "function", "function": {"name": "get_current_weather", "description": "Get the current weather for a specified city.", "parameters": {"type": "object", "properties": {"city": {"type": "string", "description": "Name of the city"}}, "required": ["city"]}}}
</tools>

For each tool call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call>. If a tool does not exist in the provided list of tools, notify the user that you do not have the ability to fulfill the request.<|end_of_text|>
<|start_of_role|>user<|end_of_role|>What's the weather like in London right now?<|end_of_text|>
<|start_of_role|>assistant<|end_of_role|><tool_call>
{"name": "get_current_weather", "arguments": {"city": "London"}}
</tool_call><|end_of_text|>

资源:


Granite 4.1 标志着高质量开源语言模型向前迈出的重要一步。通过在每个阶段——从预训练数据整理到监督微调和多阶段强化学习——优先考虑数据质量和严谨性,我们交付了显著改进的后训练流程。其结果是更强的指令遵循、工具使用和对话性能,表明经过精心训练的密集 8B 模型可以与更大的 MoE 架构相媲美。我们很期待看到社区如何采用并基于这些模型进行构建。

来源:Hugging Face Blog · huggingface.co

00