昇思大模型预训练:月级别训练的核心内容
月级别预训练是千亿 / 百亿参数大模型(如 Llama 3-70B、Qwen3-8B、盘古系列)获得通用能力的核心阶段,依托昇思 MindSpore Transformers(Mcore)与昇腾 NPU 集群,通过万亿级 token 数据、3D 并行分布式架构、长稳训练优化,耗时通常在1-3 个月(依模型规模、算力集群与数据量而定)。该阶段决定模型的语言理解、知识储备与推理上限,需解决海量数据处理、超大规模分布式训练稳定性、算力极致利用三大核心难题,是国产大模型自主化的关键环节。
一、月级别预训练核心内容
(一)训练规模与时间基准
月级别预训练针对 **≥7B 参数的大模型,核心特征是数据量≥万亿 token、训练轮次≥1000 亿 step、集群规模≥32 卡 **,时间分布如下:
- 7B-13B 模型:8-32 卡昇腾 910,1-1.5 个月,数据量 1-2T token;
- 34B-70B 模型:64-128 卡昇腾 910,1.5-2.5 个月,数据量 5-8T token;
- 100B + 模型:256 卡以上集群,2-3 个月,数据量 10-13T token(如盘古 Ultra 135B,13.2T token,近万卡集群训练数月)。
时间消耗主要来自三部分:数据预处理(10%-15%)、核心训练(70%-80%)、断点续训 / 稳定性维护(5%-10%),昇思通过动态 packing、重计算通信掩盖等技术可缩短约 40% 训练周期。
(二)三阶段预训练策略(月级长稳核心)
昇思采用分阶段渐进式训练,保障月级训练的稳定性与能力递进,参考盘古 Ultra 与 Llama 系列实践:
- 通用能力阶段(第 1 个月,占比 70%):12T 通用语料(中 / 英文书籍、网页、百科),学习语言语法、基础常识与表达能力,重点优化收敛速度与基础损失,启用基础 3D 并行(数据 + 张量 + 流水线);
- 推理强化阶段(第 2 个月,占比 20%):0.8T 高质量数据(数学、代码、逻辑推理),强化思维链(CoT)与复杂问题解决能力,调整学习率(衰减至 1/10),启用专家并行(MoE)与重计算优化;
- 退火稳定阶段(第 3 个月,占比 10%):0.4T 指令数据,巩固知识应用能力,学习率降至 1/100,启用全链路稳定性优化(梯度裁剪、loss 监控、断点自动保存),防止长训练后期性能崩塌。
(三)核心技术支撑(月级训练的关键保障)
- 昇思 Mcore 训推一体架构:原生支持3D 混合并行(数据 DP + 张量 TP + 流水线 PP + 专家 EP),可将 70B 模型切分至 64 卡,单卡显存占用降至 15GB;集成ZeroBubbleV 流水线并行,降低跨卡通信气泡耗时,长序列训练效率提升 30%;
- 海量数据处理流水线:支持 TB 级原始数据清洗→去重→分词→格式转换→分片存储全自动化,输出 MindRecord 二进制格式(读取速度提升 5 倍);采用动态 packing 技术,将短样本拼接为长序列,减少无效 padding,训练吞吐提升 40%;
- 长稳训练优化体系:内置断点续训(每 1 小时自动保存)、异常检测(loss 突刺 / 梯度爆炸自动回退)、集群容错(单卡故障自动剔除);通过TinyInit 初始化、DSSN 动态缩放,确保月级训练无中断、无性能崩塌;
- 算力极致利用:深度适配昇腾 910/310 的Cube 单元与 NEON 指令集,算子全下沉至 Native 层;启用算子融合、KV 缓存优化、混合精度(FP16/BF16),单卡算力利用率达 90%+。
(四)核心配置要点(月级训练的参数基准)
| 配置项7B 模型(8 卡)70B 模型(64 卡)说明 | |||
| 序列长度 | 2048/4096 | 8192 | 越长上下文能力越强,显存消耗越高 |
| 微批次大小 | 4 | 2 | 单卡批次,受显存限制 |
| 学习率 | 5e-4(衰减) | 1e-4(衰减) | 通用阶段高,退火阶段极低 |
| 并行策略 | DP=8, TP=1, PP=1 | DP=8, TP=4, PP=2 | 70B 需张量 + 流水线并行切分 |
| 优化器 | AdamW(β1=0.9, β2=0.999) | AdamW(权重衰减 0.01) | 长训练权重衰减防止过拟合 |
| 损失函数 | 交叉熵(Label Smoothing=0.1) | 交叉熵(动态损失缩放) | 提升长序列训练稳定性 |
二、月级别预训练核心代码实现
(一)环境准备与依赖安装(昇腾 910 集群)
# 1. 克隆昇思MindFormers(Mcore核心仓库)
git clone https://gitee.com/mindspore/mindformers.git
cd mindformers
# 2. 安装依赖(适配昇腾2.2/CANN 7.0)
pip install mindspore==2.7.0 mindformers==1.6.0
pip install numpy pandas pyarrow sentencepiece
# 3. 编译安装昇腾通信库(多机并行必需)
bash scripts/build_ascend.sh
(二)海量数据预处理脚本(月级数据准备核心)
# tools/dataset/llm_pretrain_data_process.py
import os
import argparse
from mindformers.dataset import build_dataset
from mindformers.tools import logger
def preprocess_pretrain_data(
raw_data_dir: str,
output_dir: str,
tokenizer_path: str,
seq_length: int = 4096,
num_shards: int = 32 # 分片数=集群卡数,适配多卡读取
):
"""
月级预训练数据预处理:原始文本→MindRecord分片
处理1T数据约12小时,输出32个分片,每个32GB
"""
os.makedirs(output_dir, exist_ok=True)
logger.info(f"开始预处理数据,序列长度:{seq_length},分片数:{num_shards}")
# 构建数据集(清洗、去重、分词、格式化)
dataset = build_dataset({
"type": "LLMPretrainDataset",
"data_dir": raw_data_dir,
"tokenizer": {
"type": "LlamaTokenizer",
"vocab_file": tokenizer_path
},
"seq_length": seq_length,
"shuffle": True,
"num_workers": 8
})
# 导出为MindRecord分片(二进制格式,读取加速5倍)
dataset.export(
output_path=os.path.join(output_dir, "pretrain_data"),
file_format="mindrecord",
num_shards=num_shards
)
logger.info(f"数据预处理完成,输出目录:{output_dir}")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--raw_data_dir", required=True, help="原始文本数据目录")
parser.add_argument("--output_dir", required=True, help="处理后数据输出目录")
parser.add_argument("--tokenizer_path", required=True, help="分词器路径")
parser.add_argument("--seq_length", type=int, default=4096)
parser.add_argument("--num_shards", type=int, default=32)
args = parser.parse_args()
preprocess_pretrain_data(**vars(args))
(三)月级预训练配置文件(70B 模型 64 卡,2 个月周期)
# configs/llama3/pretrain_llama3_70b_64card.yaml
# 1. 基础配置
run_mode: "train"
model_type: "llama3"
model_size: "70b"
seq_length: 8192
batch_size: 64 # 全局批次=微批次×卡数=2×64
micro_batch_size: 2
num_train_epochs: 1 # 按step训练,epoch设为1
max_train_steps: 1200000 # 总step,约2个月(64卡,每秒50步)
# 2. 模型架构配置(Llama3-70B)
model_config:
hidden_size: 8192
num_layers: 80
num_heads: 64
intermediate_size: 28672
rms_norm_eps: 1e-5
use_rope: True
rope_scaling: 1.0
# 3. 分布式并行配置(64卡:DP=8, TP=4, PP=2)
parallel_config:
data_parallel: 8
tensor_parallel: 4
pipeline_parallel: 2
expert_parallel: 1
enable_alltoall: True
zero_stage: 2 # ZeRO优化,节省显存
# 4. 优化器与学习率(月级长稳核心)
optimizer:
type: "AdamW"
learning_rate: 1e-4
weight_decay: 0.01
beta1: 0.9
beta2: 0.999
lr_scheduler:
type: "CosineAnnealingLR"
T_max: 1200000
eta_min: 1e-6 # 退火阶段最低学习率
# 5. 稳定性配置(月级训练必需)
train_config:
save_steps: 1000 # 每1000step保存断点(1小时/次)
log_steps: 100
eval_steps: 5000
keep_checkpoint_max: 20 # 保留最新20个断点
gradient_accumulation_steps: 4
clip_grad_norm: 1.0 # 梯度裁剪,防止爆炸
dynamic_loss_scale: True # 动态损失缩放
# 6. 数据路径
train_dataset_dir: "/mnt/pretrain_data/llama3_70b_8192"
(四)月级预训练启动脚本(多机 64 卡,长稳训练)
# scripts/msrun_pretrain_70b.sh
#!/bin/bash
# 多机多卡启动(8节点×8卡=64卡)
export RANK_SIZE=64
export MASTER_ADDR="192.168.1.100" # 主节点IP
export MASTER_PORT=29500
export CANN_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
export HCCL_CONNECT_TIMEOUT=1200 # 长训练通信超时延长
# 启动msrun分布式训练(月级长稳,后台运行)
nohup bash scripts/msrun_launcher.sh "python run_mindformer.py \
--config configs/llama3/pretrain_llama3_70b_64card.yaml \
--use_parallel True \
--run_mode train \
--auto_resume True" 64 > pretrain_70b.log 2>&1 &
echo "月级预训练已启动,日志:pretrain_70b.log"
echo "训练周期:约2个月,总step:1200000"
(五)核心训练逻辑代码(Mcore 底层,长稳训练核心)
# mindformers/core/llm_trainer.py(简化版,月级训练核心)
import time
import mindspore as ms
from mindspore import nn
from mindformers import Trainer
from mindformers.tools.logger import logger
class LLMPretrainTrainer(Trainer):
def __init__(self, config):
super().__init__(config)
self.model = self.build_model()
self.optimizer = self.build_optimizer()
self.dataset = self.build_dataset()
self.loss_fn = nn.CrossEntropyLoss(label_smoothing=0.1)
# 月级训练:加载最新断点(自动续训)
self.load_checkpoint(auto_resume=True)
def train_step(self, batch_data):
"""单步训练(混合精度+重计算,节省显存)"""
input_ids, labels = batch_data
with ms.amp.autocast():
logits = self.model(input_ids)
loss = self.loss_fn(logits.view(-1, self.config.vocab_size), labels.view(-1))
# 反向传播+梯度裁剪
grads = ms.grad(self.model)(loss)
grads = ms.clip_by_norm(grads, self.config.clip_grad_norm)
self.optimizer(grads)
return loss
def run(self):
"""月级长稳训练主循环(支持断点续训+异常回退)"""
logger.info(f"开始月级预训练,总step:{self.config.max_train_steps}")
self.model.set_train(True)
start_time = time.time()
total_loss = 0.0
for step, batch_data in enumerate(self.dataset):
if step >= self.config.max_train_steps:
break
# 单步训练
loss = self.train_step(batch_data)
total_loss += loss.asnumpy()
# 日志打印(每100步)
if step % self.config.log_steps == 0:
avg_loss = total_loss / (step + 1)
elapsed = (time.time() - start_time) / 3600
logger.info(f"Step: {step}, Loss: {avg_loss:.4f}, 耗时: {elapsed:.2f}h")
# 保存断点(每1000步,月级训练关键)
if step % self.config.save_steps == 0:
self.save_checkpoint()
logger.info(f"断点已保存,Step: {step}")
logger.info("月级预训练完成!")
三、训练监控与稳定性保障(月级训练必备)
- 实时监控体系:通过MindInsight可视化训练过程,监控 loss 曲线(防止后期突刺)、显存利用率(≥85% 为优)、通信耗时(占比≤10% 为正常);
- 异常自动处理:内置loss 阈值监控(连续 10 步 loss 飙升 2 倍自动回退至最近断点)、卡故障检测(单卡无响应自动剔除,训练不中断);
- 断点管理策略:每小时自动保存断点,保留最新 20 个,支持跨节点续训,即使集群重启也可无缝恢复,避免月级训练功亏一篑。
四、价值与意义
昇思大模型月级别预训练,依托国产算力 + 自研框架,打破国外技术垄断,实现千亿级大模型训练的自主可控。对产业而言,月级稳定训练能力是大模型商业化落地的基础,可支撑政务、金融、工业等领域的专属大模型开发;对技术而言,通过 3D 并行、长稳优化、动态 packing 等核心技术,将训练周期从 3 个月缩短至 1.5 个月,大幅降低训练成本。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)