郑州做网站公司排,.net作业做网站,网站设计与制作教程,山东网站建设培训文章目录 序言1. 可复现设置代码2. 可复现设置代码解析2.1 消除python与numpy的随机性2.2 消除torch的随机性2.3 消除DataLoader的随机性2.4 消除cuda的随机性2.5 避免pytorch使用不确定性算法2.6 使用pytorch-lightning2.7 特殊情况 序言
为了让模型在同一设备每次训练的结果… 文章目录 序言1. 可复现设置代码2. 可复现设置代码解析2.1 消除python与numpy的随机性2.2 消除torch的随机性2.3 消除DataLoader的随机性2.4 消除cuda的随机性2.5 避免pytorch使用不确定性算法2.6 使用pytorch-lightning2.7 特殊情况 序言
为了让模型在同一设备每次训练的结果可复现需进行可复现设置
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 Truetorch.backends.cudnn.benchmark Falsetorch.backends.cudnn.enabled Falseos.environ[CUBLAS_WORKSPACE_CONFIG] :16:8torch.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_sizebatch_size,num_workersnum_workers,worker_init_fnseed_workergeneratorg,
)设置shuffleTrue并设置随机种子
# 可复现设置代码可按上述来设置
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)# shufleTrue,不同训练之间一样的乱序
train_loader2 DataLoader(datasetdealDataset, batch_size32, shuffleTrue)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:82.5 避免pytorch使用不确定性算法
配置pytorch在可用的情况下使用确定性算法而不是非确定性算法。如果已知某个操作是不确定的并且没有确定的替代办法则抛出RuntimeError错误
torch.use_deterministic_algorithms(True)2.6 使用pytorch-lightning 详见 pytorch-lightning设置 该方法保证了可复现的同时没有牺牲任何训练速度
2.7 特殊情况
在某些版本的CUDA中RNN和LSTM网络可能具有不确定性行为如LSTM中的dropout需要注意这一特性。需要关注如何消除不确定性 【参考文章】 [1]. pytorch模型可复现性设置 [2]. DataLoader类设置打乱的随机数种子 [3]. pytorch消除模型训练的随机性 [4]. pytorch模型训练可复现方案
created by shuaixio, 2024.02.24