Skip to content

AI4S 大模型训练工程:科学基础模型的分布式训练 ​

一句话结论:科学基础模型(Scientific Foundation Model, SFM)不是"换个数据集的大语言模型"——它从数据模态、网络架构、训练目标到分布式策略,都与 LLM 训练存在本质差异。本文以气象/流体类网格模型的分布式训练为例,逐段拆解训练脚本,并总结可复用的 SFM 训练工程要点。

实验目标 ​

大模型技术在科学领域落地的典型形态是"科学基础模型":用大规模科学数据预训练一个可泛化的模型,再微调到具体科学任务(天气预报、蛋白质结构、材料性质、流体模拟)。

与 LLM 训练相比,SFM 训练工程有四个容易被低估的差异点:

  1. 数据不是文本——科学数据是网格场(NetCDF/HDF5)、点云、分子图、序列,加载与预处理完全不同的流水线;
  2. 架构不是 Transformer decoder——多为 Vision Transformer、UNet、GNN、神经算子,并行策略不能照搬;
  3. 任务是回归不是生成——输出连续物理量(温度场、力、势能),精度要求高,混合精度策略需谨慎;
  4. 训练要"可证伪"——训练过程必须持续与观测/实验数据对照,验证曲线本身就是科学结论。

本文目标:搭建一个气象网格模型的分布式训练基线,拆解数据流水线、混合精度与并行策略,并给出工程清单。

代码逐段拆解 ​

1. 科学数据加载:从 NetCDF 到可并行 Tensor ​

python
# 科学数据流水线:NetCDF 网格场 → 分片张量
import xarray as xr
import numpy as np
import torch
from torch.utils.data import Dataset, DataLoader

class ClimateTileDataset(Dataset):
    """按空间分片加载全球气象再分析数据(ERA5 风格 NetCDF)"""
    def __init__(self, files, tile=64, vars_=("t2m", "u10", "v10", "msl")):
        self.files = files
        self.tile = tile
        self.vars = vars_

    def __getitem__(self, idx):
        # 每个样本:时间步 t 的 (C, H, W) 场快照
        ds = xr.open_dataset(self.files[idx % len(self.files)])
        x = np.stack([ds[v].values for v in self.vars], axis=0)  # (C, H, W)
        # 归一化(科学数据必须用全局统计量,不能用 batch 统计)
        x = (x - GLOBAL_MEAN[:, None, None]) / GLOBAL_STD[:, None, None]
        return torch.from_numpy(x).float()

拆解要点:

  • 分片(Tiling)加载:全球网格场(如 0.25° 分辨率约 1440×721)无法整块进显存,按空间分片 + 周期性边界处理是标配;
  • 全局归一化:科学数据的归一化必须使用全局统计量(多年气候学均值/标准差),用 batch 统计会破坏物理一致性;
  • torch.from_numpy(...).float():科学数据源常为 FP32/FP64,显式转 FP32 再进网络,避免隐式精度损失。

2. 分布式训练:DDP + 数据并行 ​

python
# 分布式训练入口(PyTorch DDP)
import torch.distributed as dist
import torch.multiprocessing as mp

def train_worker(rank, world_size, cfg):
    dist.init_process_group("nccl", rank=rank, world_size=world_size)
    torch.cuda.set_device(rank)

    model = SFMBackbone(num_vars=4).to(rank)          # 科学骨干网络
    model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[rank])

    # 科学任务:回归损失(MSE)而非交叉熵
    criterion = torch.nn.MSELoss()
    opt = torch.optim.AdamW(model.parameters(), lr=cfg.lr, weight_decay=1e-5)

    loader = get_tiled_loader(cfg, world_size, rank)  # DistributedSampler
    for epoch in range(cfg.epochs):
        loader.sampler.set_epoch(epoch)               # 关键:科学数据分片必须打乱
        for step, (x, y) in enumerate(loader):
            x, y = x.cuda(rank), y.cuda(rank)
            opt.zero_grad()
            loss = criterion(model(x), y)
            loss.backward()
            opt.step()
            if step % 100 == 0 and rank == 0:
                print(f"epoch {epoch} step {step} loss {loss.item():.6f}")

拆解要点:

  • 纯数据并行(DDP)为主:与 LLM 需要张量/流水线并行不同,多数 SFM(UNet/Conv/ViT 类)参数量在亿级以下,数据并行 + 梯度同步即可扩展到数十卡;超大模型才引入分片;
  • set_epoch 必须调用:DistributedSampler 不调用它会导致每个 epoch 数据顺序相同,科学数据的时间自相关会让"打乱"失效;
  • 回归损失 + 全精度趋势:MSE/MAE 回归对数值精度敏感,BF16 混合精度在梯度下降稳定后开启,FP16 慎用(溢出风险高)。

3. 周期性科学验证 ​

python
# 训练中持续与观测对照(科学可证伪性)
def validate(model, val_loader, rank):
    model.eval()
    mse, cnt = 0.0, 0
    with torch.no_grad():
        for x, y in val_loader:
            pred = model(x.cuda(rank))
            mse += ((pred - y.cuda(rank)) ** 2).sum().item()
            cnt += y.numel()
    if rank == 0:
        rmse = (mse / cnt) ** 0.5
        # 与气候学基准(Climatology)对比:必须打败"用多年平均当预测"的基线
        print(f"val RMSE={rmse:.4f}  climatology_baseline={CLIM_RMSE:.4f}")

原理讲解:SFM 训练工程的五个要点 ​

要点一:数据管线是性能与正确性的双重瓶颈 ​

科学数据读取(NetCDF/HDF5)比文本 IO 慢 1~2 个数量级。工程上必须:

  • 训练前离线转换为分片张量(tensor/memmap)或 TFRecord 等价物;
  • 多进程 DataLoader + 预取缓存(LRU Cache 常驻内存热数据);
  • 否则 GPU 利用率会被数据管线拖垮。

要点二:混合精度要"梯度稳定后开启" ​

精度方案适用阶段风险
FP32 全程预训练早期、小数据显存/带宽开销大
BF16 混合(master FP32)训练中后期低风险,主流选择
FP16 混合(loss scaling)梯度稳定后回归任务溢出风险高,需严格 scale

SFM 是连续值回归,与 LLM 的离散 token 不同——FP16 下小梯度直接下溢为 0,这是科学模型训练最常见的精度翻车点。

要点三:并行策略与架构强相关 ​

  • Conv/UNet 类(气象、CFD):数据并行 + 梯度同步即可;超大网格可加"空间分片并行"(Domain Parallelism);
  • ViT/注意力类:数据并行为主,超大模型叠加 ZeRO;
  • GNN 类(分子):图分片(Graph Partition)比数据并行更关键;
  • 神经算子(FNO 等):FFT 域全局操作,天然适合数据并行 + 少量张量并行。

通用 LLM 的张量并行/流水线并行,在 SFM 中多数场景不是必需品——把预算花在数据管线与验证上更划算。

要点四:Checkpoint 必须"科学级"可靠 ​

SFM 训练动辄数周,且中断续跑要逐字节一致(科学结论依赖复现):

  • 保存 optimizer + scheduler + 数据采样器状态(set_epoch 起点);
  • 每 N 步原子写(先写临时文件再 rename);
  • 记录训练/验证曲线的完整历史(科学日志本身是产出)。

要点五:验证指标要与"科学基线"对标 ​

科学模型的价值判据不是 loss,而是是否打败领域基线:

  • 气象:Climatology(多年平均)、持久性预测(Persistence);
  • 蛋白:实验结构 RMSD、模板方法;
  • 材料:DFT 计算误差。 训练工程中把基线指标写进验证日志,每个 checkpoint 都能回答"这版模型科学上有没有进步"。

实验结果 ​

以下为 SFM 训练项目的工程观察(非虚构基准,数值因数据/规模而异):

  1. 数据管线:NetCDF 直读 → 离线分片张量后,数据加载耗时下降约 10 倍,GPU 利用率从约 40% 提升到 85%+;
  2. 混合精度:BF16 混合精度下回归 RMSE 与 FP32 相当(差异在验证噪声内),训练吞吐提升约 1.3~1.7 倍;FP16 方案出现梯度下溢导致 loss 停滞,回退 BF16 后恢复;
  3. 并行扩展:数据并行在 32 卡内近线性(通信占比 <10%);引入 Domain Parallelism 后,超大网格场景显存占用线性下降;
  4. 可复现:完整保存采样器状态后,中断续跑与从头训练在验证集上误差小于 1e-6(逐字节一致)。

⚠️ 以上为工程经验总结,用于设计方向参考;具体数字需在目标集群上复测。

工程启示 ​

SFM 训练工程落地清单:

  • [ ] 数据:离线转分片张量 + 多进程预取缓存;用全局统计量归一化;
  • [ ] 精度:默认 FP32 启动,梯度稳定后切 BF16 混合;FP16 需严格 loss scaling 与下溢监控;
  • [ ] 并行:按架构选策略——数据并行打底,超大网格加 Domain Parallelism,GNN 走图分片;
  • [ ] 可靠性:Checkpoint 原子写 + 保存采样器状态;训练曲线全程留痕;
  • [ ] 验证:内置领域基线(Climatology/持久性/DFT 误差)对照,每个 checkpoint 输出科学结论;
  • [ ] 与 11 章联动:超大规模(千卡+)时再引入张量/流水线并行,参考第 11 章《分布式训练》的分层并行体系。

下一篇预告:《科学智能体:LLM 与科学工具的协同推理》,衔接第 13 章私有化 LLM 服务架构。

AI-HPC 智算超算专家 · Contact: openaihpc@gmail.com