【pytorch】pytorch模型可复现设置

序言
  • 为了让模型在同一设备每次训练的结果可复现,需进行可复现设置
1. 可复现设置代码
def set_seed(seed):
    random.seed(seed)
    np.random.seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed)

    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
 
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False
    torch.backends.cudnn.enabled = False
 
    os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':16:8'

    torch.use_deterministic_algorithms(True)
 
set_seed(21)
2. 可复现设置代码解析
2.1 消除python与numpy的随机性
import random
import numpy as np

# 消除numpy和random的随机性
random.seed(SEED)
np.random.seed(SEED)

# 固定python环境变量中的PYTHONHASHSEED,禁止hash随机化
os.environ['PYTHONHASHSEED'] = str(seed)
2.2 消除torch的随机性
import torch
import torch
torch.manual_seed(SEED)
torch.cuda.manual_seed(SEED) 		# 适用于显卡训练
torch.cuda.manual_seed_all(SEED) 	# 适用于多显卡训练
2.3 消除DataLoader的随机性
  • 使用torch时,一般都会使用DataLoader加载数据集,这个类使用了多线程的处理方式,因此会造成一定随机性
def seed_worker(worker_id):
    random.seed(SEED + worker_id)
 
g = torch.Generator()
g.manual_seed(SEED)

DataLoader(
    train_dataset,
    batch_size=batch_size,
    num_workers=num_workers,
    worker_init_fn=seed_worker
    generator=g,
)
  • 设置shuffle=True并设置随机种子
# 可复现设置代码,可按上述来设置
def setup_seed(seed):
   torch.manual_seed(seed)
   torch.cuda.manual_seed_all(seed)
   np.random.seed(seed)
   random.seed(seed)
   torch.backends.cudnn.deterministic = True

# 设置随机数种子
setup_seed(21)

# shufle=True,不同训练之间一样的乱序
train_loader2 = DataLoader(dataset=dealDataset, batch_size=32, shuffle=True)
2.4 消除cuda的随机性
  • 适用于GPU训练
# 确保每次返回的卷积算法等是固定的
torch.backends.cudnn.deterministic = True

# 禁止cudnn使用非确定性算法
torch.backends.cudnn.enabled = False

# 配合enabled命令使用
# True:自动寻找最适合当前配置的高效算法来优化运行效率
# False:保证实验结果可复现
torch.backends.cudnn.benchmark = False
  • 不设置torch.backends.cudnn.enabled = False的话,无法保证训练结果可复现性。但添加这行后会导致训练速度很慢

  • 如果cuda是10.2及以上版本,少数cuda操作是不确定的,需要做如下设置

os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':16:8'

或

os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'
2.5 避免pytorch使用不确定性算法
  • 配置pytorch在可用的情况下,使用确定性算法而不是非确定性算法。如果已知某个操作是不确定的,并且没有确定的替代办法,则抛出RuntimeError错误
torch.use_deterministic_algorithms(True)
2.6 使用pytorch-lightning
2.7 特殊情况
  • 在某些版本的CUDA中,RNN和LSTM网络可能具有不确定性行为,如LSTM中的dropout,需要注意这一特性。需要关注如何消除不确定性

 


【参考文章】
[1]. pytorch模型可复现性设置
[2]. DataLoader类设置打乱的随机数种子
[3]. pytorch消除模型训练的随机性
[4]. pytorch模型训练可复现方案

created by shuaixio, 2024.02.24

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于经典的 PyTorch 模型,你可以按照以下步骤进行操作: 1. 确定要的经典模型:选择你想要的经典模型,可以是在计算机视觉、自然语言处理或其他领域中广泛应用的模型,例如 AlexNet、VGG、ResNet 等。 2. 收集模型的相关论文和代码:查找并阅读原始论文,以了解模型的具体结构和训练方法。同时,搜索已经实的代码库或者 GitHub 上的开源项目,以获取相关的参考代码。 3. 创建 PyTorch 模型:根据论文中描述的模型结构,使用 PyTorch 创建一个对应的模型类。这包括定义模型的网络层、初始化权重等操作。 4. 实模型训练:根据论文中描述的训练方法,实相应的训练步骤。这可能包括数据预处理、损失函数定义、优化器选择以及训练循环等。 5. 数据准备:准备用于训练和测试模型的数据集。这可能涉及数据下载、数据预处理、数据划分等。 6. 训练模型:使用准备好的数据集对模型进行训练。根据需要,可以设置训练超参数、学习率调度器等。 7. 模型评估:使用测试集或交叉验证集对训练好的模型进行评估。可以计算准确率、损失值等指标。 8. 模型优化(可选):根据需要,尝试改进模型的性能。这可能包括调整超参数、尝试不同的优化器、增加正则化等。 9. 结果分析:分析模型的性能和训练过程,比较实模型与原论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值