marin
开源的基础模型训练与研究框架,覆盖数据清洗、tokenization、预训练、后训练到评估的全流程。亮点是开放式开发,所有实验过程和失败记录都公开,并发布了从 3e18 到 1e23 FLOPs 的 scaling suite Delphi,提供 checkpoints 和训练配方,适合想复现前沿 LLM 训练流程的研究者。
README
Marin
"我不惧怕风暴,因为我正在学习如何驾驶我的船。"
—— 路易莎·梅·奥尔科特
Marin 是一个研究项目、软件平台和社区,致力于 foundation models(基础模型) 的研究与开发。
Marin 关注的是训练大型语言模型。这包括数据整理(data curation)、转换、过滤、分词(tokenization)、预训练(pretraining)、后训练(posttraining)和评估。除了这些模型背后的产物、软件和基础设施之外,Marin 还致力于公开分享构建这些模型所需的全部过程知识。
Marin 的核心价值是 open development(开放开发)。我们实时记录流程、实验和决策。从原始数据到最终模型的每一步都被记录下来。失败的实验也是记录的一部分。
Marin 还被用于构建 audio-text models(音频-文本模型)、DNA 和 protein models(蛋白质模型)。我们鼓励通过将 Marin 作为库来开展此类工作,参见 marin/experiments。
当前工作
前沿混合专家模型(Frontier mixture-of-experts)
我们目前的工作重点是:从头开始预训练并后训练一个大型混合专家(mixture-of-experts,MoE)模型(5e24 model-FLOPs,总参数量超过 5000 亿),以胜任对科学家和研究人员重要的任务。
缩放套件(Scaling suite)
Delphi 是 Marin 的开源缩放套件,灵感源自 Pythia,将 LLM 配方从 3e18 FLOPs 扩展到 1e23 FLOPs。它由三部分组成:一个将计算预算映射到模型配置的缩放配方(scaling recipe)、一个基于该配方在 Google TPU Research Cloud 上训练出的缩放套件,以及一个利用较小 Delphi 模型预测较大模型的缩放定律(scaling law)。
我们发布了:
- 检查点(Checkpoints):每次运行的检查点可在 Hugging Face 上获取:marin-community/delphi
- 训练混合流水线(Training mixture pipelines):可在 Marin repo 中确定性复现来自公开 Nemotron-CC、StarCoderData 和 ProofPile 2 的数据混合
- 配方代码(Recipe code):作为可 fork 的
CompletedAdamHParamsclass 位于 Marin repo 中 - 开发方法论(Development methodology):作为
add_scaling_heuristicagent skill 位于 Marin repo 中 - 可直接绘图的 Delphi 数据(Plot-ready data):每张图一个配置,每行都包含
wandb_url,位于 marin-community/delphi-blog-data
进度在 GitHub issue #1337 中跟踪。
其他经验
更多整合后的经验可以在 Open Athena blog(Open Athena 博客) 上找到。以下是一些精选:
- 使用 Iris 进行集群调度 · 在异构集群之间调度作业
- 提升我们的 LLM 预训练效率 · 从预训练中榨取更高吞吐量
- 可外推至拟合点 300 倍之外的缩放定律(Delphi) · 用小模型预测大模型
- 混合专家分位数均衡:在 32B-A5B(1e22 FLOPs)规模下得到验证 · 保持 MoE 专家负载均衡
其他模型
此前,我们使用 Marin 训练了一个 8B 参数的模型,在我们的 base-model benchmark suite(基础模型基准套件) 上超越了 Llama 3.1 8B。你可以查看训练脚本或阅读回顾报告。我们还训练了 Marin 32B。
了解更多 & 使用 Marin
Marin 的文档可在 ReadTheDocs 或 docs/ 文件夹中获取。
要开始使用 Marin:
- 安装 Marin。
- 使用 Marin 训练一个 tiny language model(微型语言模型)。
- 了解如何使用 Marin 运行规模大得多的 DCLM 1B/1x 实验。
- 查看我们已运行实验的摘要。
- 加入 Marin Discord 与社区交流。
示例
Marin 实验被定义为一组可以相互依赖并按拓扑顺序执行的步骤,类似于 Makefile。
作为如何使用 Marin 的简要示例,下面是一个在 TinyStories 上训练微型模型的完整脚本。你可以查看完整脚本了解更多细节。
from fray.cluster import ResourceConfig
from levanter.optim import AdamConfig
from marin.execution.lazy import lower
from marin.execution.step_runner import StepRunner
from marin.experiment.data import tokenized
from marin.experiment.train import train_lm
from experiments.llama import llama_nano
from experiments.marin_tokenizer import marin_tokenizer
# 1. Tokenize the dataset as a lazy handle — nothing downloads yet.
tinystories_tokenized = tokenized(
name="tokenized/tinystories",
source="roneneldan/TinyStories",
tokenizer=marin_tokenizer,
sample_count=1000, # cap at 1 000 samples per shard to keep the tutorial fast
)
# 2. Train the model — depends on the tokenized dataset above.
nano_tinystories_model = train_lm(
name="checkpoints/marin-nano-tinystories",
version="v1",
model=llama_nano,
optimizer=AdamConfig(learning_rate=6e-4, weight_decay=0.1),
# Steps can depend on other steps: nano_tinystories_model depends on tinystories_tokenized
datasets={tinystories_tokenized: 1.0},
batch_size=4,
seq_len=2048,
num_train_steps=100,
z_loss_weight=None,
evals=None, # no point evaluating such a tiny model
resources=ResourceConfig.with_cpu(),
)
if __name__ == "__main__":
StepRunner().run([lower(nano_tinystories_model)])
这里,我们创建了两个步骤:一个用于对数据集进行分词,另一个用于训练模型。训练步骤依赖于已分词的数据集步骤,因此它会在分词步骤完成后执行。
稍作修改,你就可以扩展此示例来训练更大数据集上的更大模型、混合数据集,甚至可以扩展到非常大的 GPU 或 TPU pod(或多切片 TPU!)。
面向贡献者
- 查看
CONTRIBUTING.md了解项目工作流程。 - 查看
.agents/skills/(以及.claude/skills/)了解可加载的 agent 技能。例如,.agents/skills/add-dataset/提供了添加新数据集的分步指南。
核心贡献者
Marin 的核心合作者来自 Stanford CRFM 和 Open Athena。
支持者
Marin