Transformers 与 Nanotron 集成:将 Hugging Face 模型转换为支持 3D 并行的大规模预训练实现
本文讲解 Transformers 与分布式训练框架 Nanotron 的集成方式:如何使用官方转换脚本把一个普通的 Transformers 模型(以 Llama 为例)转换为适合预训练的 Nanotron 模型,以及 Transformers 在其中扮演的角色——从 from_pretrained 加载模型与配置、权重映射与 QKV/Gate-Up 投影融合,到复用 AutoTokenizer 完成文本预处理。读完后你可以独立完成"Transformers 检查点 → Nanotron 预训练模型"的转换,并理解转换过程中每个步骤在 Transformers 侧对应的实现机制。
Nanotron 是什么:面向数百张 GPU 的 3D 并行训练框架
Nanotron 是一个分布式训练框架,支持张量并行(Tensor Parallelism)、流水线并行(Pipeline Parallelism)和数据并行(Data Parallelism),即 3D 并行(3D parallelism),设计目标是支撑跨数百张 GPU 的大规模训练负载。
3D 并行的思路可以从 Transformers 文档中的并行方法指南(并行方法)得到印证:
- 数据并行把 batch 切分到各 GPU,每个 GPU 持有完整模型副本并各自处理部分数据,最后同步梯度。Nanotron 的数据并行通常结合 ZeRO 类优化,把优化器状态、梯度、参数分片存储以降低显存占用;
- 流水线并行把模型层切成若干 stage 分布在不同 GPU 上,并用 micro-batch 流水线化前向/反向传播,减少 GPU 空闲时间;
- 张量并行把单个张量运算沿水平或垂直方向切片到多张 GPU 上并行计算,适合单卡装不下大张量的场景。
单独使用任何一类并行都有明显短板:数据并行通信开销随 GPU 数增长、流水线并行存在气泡(bubble)、张量并行引入高频 AllReduce 通信。Nanotron 的核心价值在于把三者组合使用——文档中的 Ultrascale Playbook 资源链接也正是围绕"如何高效扩展 Nanotron 训练"展开的。因此,当你面对"单卡装不下模型 + 多机扩展预训练"这类问题时,Nanotron 是一个典型的组合策略方案。
转换流程:把 Transformers 检查点转成 Nanotron 模型
Nanotron 提供了一个官方转换脚本 convert_hf_to_nanotron.py(位于 Nanotron 仓库的 examples/llama/ 目录下),可以把任意 Transformers 模型转换为优化的 Nanotron transformer 模型实现,用于预训练。仓库文档中给出的标准用法是:
torchrun --nproc_per_node=1 examples/llama/convert_hf_to_nanotron.py \
--checkpoint_path=meta-llama/Llama-2-7b-hf \
--save_path=./llama-7b-nanotron
参数说明:
torchrun --nproc_per_node=1:使用 PyTorch 弹性启动器以单进程方式运行转换脚本(转换是权重搬运任务,通常不需要多卡);--checkpoint_path:源 Transformers 检查点,可以是 Hub 上的模型 id(如meta-llama/Llama-2-7b-hf),也可以是本地目录;--save_path:转换产出的 Nanotron 模型保存路径。
转换完成后的产物是一个可被 Nanotron 训练入口直接加载的模型,后续预训练即在 Nanotron 侧按其 3D 并行配置进行。
Transformers 集成:转换脚本背后的三步机制
文档明确给出了转换脚本与 Transformers 的集成过程,共三步:
- 加载 Transformers 模型。以
LlamaForCausalLM.from_pretrained加载受支持的 Transformers 模型(如Llama)。这一步会读取检查点目录中的config.json并构建对应的LlamaConfig,同时通过from_pretrained加载权重文件(safetensors/bin)。from_pretrained的参数语义在 PreTrainedModel.from_pretrained 的 docstring 中有完整说明:pretrained_model_name_or_path可以是 Hub 模型 id、本地目录或None(此时需显式传入config与state_dict),还支持revision、use_safetensors、local_files_only等常用参数; - 配置格式映射。Nanotron 把
LlamaConfig映射到它自己的配置格式,并据此构造 Nanotron 模型结构(层数、隐藏维度、注意力头数、FFN 中间维度等均来自该配置); - 权重转换与融合。Transformers 权重被转换为 Nanotron 权重,其间由一份**权重映射(weight mapping)**指导 Nanotron 参数名与 Transformers 参数名之间的对应关系,并处理必要的形状变换,最典型的就是 QKV 投影融合与 gate/up 投影融合。
为什么需要 QKV 与 Gate-Up 融合
这一步之所以关键,是因为两套框架对投影层的参数组织方式不同。从 Transformers 的 Llama 源码可以看到,注意力层的 Q/K/V 是三个独立的 nn.Linear(LlamaAttention 中,q_proj/k_proj/v_proj 分别定义于第 230-239 行):
# src/transformers/models/llama/modeling_llama.py (LlamaAttention)
self.q_proj = nn.Linear(...)
self.k_proj = nn.Linear(...)
self.v_proj = nn.Linear(...)
self.o_proj = nn.Linear(...)
同样,MLP 部分的 gate 与 up 投影也是两个独立线性层(LlamaMLP 中 gate_proj/up_proj/down_proj 定义于第 169-171 行):
# src/transformers/models/llama/modeling_llama.py (LlamaMLP)
self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, ...)
self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, ...)
self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, ...)
而 Nanotron 为了减少张量并行切分时的通信次数、让 GEMM 计算更稠密高效,会把 q_proj + k_proj + v_proj 拼成一个大的 qkv 矩阵,把 gate_proj + up_proj 拼成一个 gate_up 矩阵。转换脚本中的权重映射正是负责在两套命名与形状之间做张量级别的对齐:把分离的小矩阵按正确的维度顺序 cat 成融合矩阵,再把输出投影(o_proj)、下投影(down_proj)、LayerNorm、嵌入层等参数一一对应过去。这也是"weight mapping guides how to map Nanotron parameter names to Transformers parameter names"这一文档表述的具体含义。
Tokenizer 的复用
除模型权重外,Nanotron 还依赖 Transformers 的 AutoTokenizer 在预处理(preprocessing)和生成(generation)阶段把文本转为 token ids。这意味着转换流程只覆盖模型权重与结构,数据管线一侧仍然完全复用 Transformers 生态:检查点目录里的 tokenizer 文件(tokenizer.json/vocab.json 等)可直接沿用,无需为 Nanotron 单独准备词表。
适用场景与使用建议
结合文档定位(Nanotron 位于 Transformers 文档的社区集成章节,见 文档目录),可以明确它的使用前提:
- 适用:以 Hub 上已有 Transformers 检查点(Llama 系列等文本生成模型)为起点,做大规模(多机多卡)继续预训练或全参数预训练的场景;
- 不适用/需自行评估:纯单机推理、小模型微调等场景直接走 Transformers 自带方案(
Trainer+ Accelerate 分布式)即可,无需引入 Nanotron; - 工作流:
torchrun执行转换脚本得到 Nanotron 检查点 → 在 Nanotron 侧按其 3D 并行配置(张量并行度、流水线 stage 数、数据并行规模)启动训练 → 数据预处理与 tokenize 继续用AutoTokenizer。
参考资料
- Nanotron 仓库:
huggingface/nanotron(转换脚本位于该仓库examples/llama/convert_hf_to_nanotron.py); - Ultrascale Playbook:系统介绍如何用 Nanotron 高效扩展训练规模,在 Transformers 文档的 并行方法 与 多卡推理/并行 章节中均被作为大模型扩展的参考资源提及;
- 仓库内相关源码:PreTrainedModel.from_pretrained 入口、Llama 模型实现(投影层定义)。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00