You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已设置种子仍结果不同,PyTorch Lightning如何保证模型结果可复现?

确保PyTorch Lightning运行结果完全一致的完整配置

首先说明:pl.seed_everything(1234)已经包含了random、numpy、torch的种子初始化,你当前代码里的重复设置可以删除,避免冗余。以下是需要补充的关键配置:

1. 启用PyTorch确定性模式

CuDNN的自动优化(benchmark模式)会引入随机性,必须手动关闭:

torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

2. 同步DataLoader Worker的种子

当DataLoader使用num_workers > 0时,需确保每个子进程的种子同步,避免进程间随机差异。直接在pl.seed_everything中启用workers=True即可自动处理:

pl.seed_everything(1234, workers=True)

如果需要自定义worker种子逻辑,也可以手动指定worker_init_fn:

def worker_init_fn(worker_id):
    seed = 1234 + worker_id
    torch.manual_seed(seed)
    np.random.seed(seed)
    random.seed(seed)

# 在DataLoader中传入该函数
train_loader = DataLoader(
    train_dataset,
    batch_size=32,
    num_workers=4,
    worker_init_fn=worker_init_fn,
    shuffle=True
)

3. 配置Trainer的确定性参数

Trainer的deterministic=True会自动处理Lightning内部的随机性逻辑(如数据加载顺序、分布式训练同步等):

trainer = pl.Trainer(
    max_epochs=10,
    deterministic=True,
    # 若使用多GPU,建议配合strategy="ddp",确保所有进程种子一致
)

4. 避免额外随机性操作

  • 训练时固定batch size,禁止动态调整
  • 预测/验证阶段必须调用model.eval()和torch.no_grad(),关闭dropout、BatchNorm等层的训练模式随机性
  • 若使用混合精度训练(precision=16),部分GPU的浮点运算可能引入微小差异,如需绝对一致建议使用默认32位精度(precision=32)

完整初始化代码示例

import random
import numpy as np
import torch
import pytorch_lightning as pl
from torch.utils.data import DataLoader, Dataset

if __name__ == '__main__':
    # 基础种子初始化,同步worker种子
    pl.seed_everything(1234, workers=True)
    
    # 启用PyTorch确定性模式
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False
    
    # 初始化数据集与DataLoader
    train_dataset = YourCustomDataset()
    train_loader = DataLoader(
        train_dataset,
        batch_size=32,
        num_workers=4,
        shuffle=True
    )
    
    # 初始化模型与Trainer
    model = YourLightningModule()
    trainer = pl.Trainer(
        max_epochs=10,
        deterministic=True
    )
    
    # 训练与预测
    trainer.fit(model, train_dataloaders=train_loader)
    predictions = trainer.predict(model, dataloaders=val_loader)

内容的提问来源于stack exchange,提问作者A User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:21:25