跳到正文
原文
Hugging Face:Blog(RSS)·· 2026-04-29精选AI 评分66

IBM 发布 Granite 4.1 系列模型并详解训练过程

Granite 4.1 LLMs: How They’re Built

AI 导读

IBM 发布 Granite 4.1 系列稠密模型(3B、8B、30B),基于约 15T token 五阶段预训练,上下文扩展至 512K,并以约 410 万样本做 SFT 和多阶段 GRPO 强化学习,全部以 Apache 2.0 许可开源。

推荐理由

IBM 团队亲自拆解 Granite 4.1 从数据配比到多阶段 RL 的完整训练细节,读者可对照借鉴小模型的数据工程方法。

正文 · AI 翻译

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

作者:Granite 团队,IBM


TL;DR — Granite 4.1 是一系列稠密、仅解码器的 LLM(3B、8B 和 30B),使用多阶段预训练流程在约 15T token 上训练,包括最长 512K token 的长上下文扩展。这些模型进一步通过约 4.1M 高质量精选样本的监督微调,以及使用 DAPO 损失的 on-policy GRPO 强化学习(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+ 平均 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 平均 82.30 87.06 89.65
ArenaHard 37.80 68.98 71.02
MTBench 平均 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+ 平均 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 安全评估平均 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(RSS) · huggingface.co