首页
/ Transformers 与 Nanotron 集成:将 Hugging Face 模型转换为支持 3D 并行的大规模预训练实现

Transformers 与 Nanotron 集成:将 Hugging Face 模型转换为支持 3D 并行的大规模预训练实现

2026-09-06 13:25:09作者:齐添朝

本文讲解 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 的集成过程,共三步:

  1. 加载 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(此时需显式传入 configstate_dict),还支持 revisionuse_safetensorslocal_files_only 等常用参数;
  2. 配置格式映射。Nanotron 把 LlamaConfig 映射到它自己的配置格式,并据此构造 Nanotron 模型结构(层数、隐藏维度、注意力头数、FFN 中间维度等均来自该配置);
  3. 权重转换与融合。Transformers 权重被转换为 Nanotron 权重,其间由一份**权重映射(weight mapping)**指导 Nanotron 参数名与 Transformers 参数名之间的对应关系,并处理必要的形状变换,最典型的就是 QKV 投影融合gate/up 投影融合

为什么需要 QKV 与 Gate-Up 融合

这一步之所以关键,是因为两套框架对投影层的参数组织方式不同。从 Transformers 的 Llama 源码可以看到,注意力层的 Q/K/V 是三个独立的 nn.LinearLlamaAttention 中,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 投影也是两个独立线性层(LlamaMLPgate_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

参考资料

登录后查看全文
热门项目推荐
相关项目推荐