PyTorch可复现/重复实验的相关设置

2022 年 11 月 16 日 极市平台
↑ 点击 蓝字  关注极市平台

作者丨Alxander@知乎(已授权)
来源丨https://zhuanlan.zhihu.com/p/448284000
编辑丨极市平台

极市导读

 

深度学习在训练过程中,由于随机初始化,样本读取的随机性,导致重复的实验结果会有差别,个别情况甚至波动较大。一般论文为了严谨,实验结论能够复现/可重复,通常采取固定随机种子使得结果确定。本文总结了一些去定型设置的方法,附详细代码。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

确定性设置

1 随机种子设置

随机函数是最大的不确定性来源,包含了模型参数的随机初始化,样本的shuffle。

  • PyTorch 随机种子
  • python 随机种子
  • numpy 随机种子
# PyTorch
import torch
torch.manual_seed(0)

# python
import random
random.seed(0)

# Third part libraries
import numpy as np
np.random.seed(0)

CPU版本下,上述随机种子设置完成之后,基本就可实现实验的可复现了。

对于GPU版本,存在大量算法实现为不确定结果的算法,这种算法实现效率很高,但是每次返回的值会不完全一样。主要是由于浮点精度舍弃,不同浮点数以不同顺序相加,值可能会有很小的差异(小数点最末位)。

2 GPU算法确定性实现

GPU算法的不确定来源有两个

  • CUDA convolution benchmarking
  • nondeterministic algorithms

CUDA convolution benchmarking 是为了提升运行效率,对模型参数试运行后,选取最优实现。不同硬件以及benchmarking本身存在噪音,导致不确定性

nondeterministic algorithms:GPU最大优势就是并行计算,如果能够忽略顺序,就避免了同步要求,能够大大提升运行效率,所以很多算法都有非确定性结果的算法实现。通过设置use_deterministic_algorithms,就可以使得pytorch选择确定性算法。

# 不需要benchmarking
torch.backends.cudnn.benchmark=False

# 选择确定性算法
torch.use_deterministic_algorithms()

RUNTIME ERROR

对于一个PyTorch 的函数接口,没有确定性算法实现,只有非确定性算法实现,同时设置了use_deterministic_algorithms(),那么会导致运行时错误。比如:

>>> import torch
>>> torch.use_deterministic_algorithms(True)
>>> torch.randn(2, 2).cuda().index_add_(0, torch.tensor([0, 1]), torch.randn(2, 2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: index_add_cuda_ does not have a deterministic implementation, but you set
'torch.use_deterministic_algorithms(True)'. ...

错误原因:

index_add没有确定性的实现,出现这种错误,一般都是因为调用了torch.index_select 这个api接口,或者直接调用tensor.index_add_。

解决方案:

自己定义一个确定性的实现,替换调用的接口。对于torch.index_select 这个接口,可以有如下的实现。

def deterministic_index_select(input_tensor, dim, indices):
"""
input_tensor: Tensor
dim: dim
indices: 1D tensor
"""
tensor_transpose = torch.transpose(x, 0, dim)
return tensor_transpose[indices].transpose(dim, 0)

样本读取随机

  1. 多线程情况下,设置每个线程读取的随机种子
  2. 设置样本generator
# 设置每个读取线程的随机种子
def seed_worker(worker_id):
worker_seed = torch.initial_seed() % 2**32
numpy.random.seed(worker_seed)
random.seed(worker_seed)

g = torch.Generator()
# 设置样本shuffle随机种子,作为DataLoader的参数
g.manual_seed(0)

DataLoader(
train_dataset,
batch_size=batch_size,
num_workers=num_workers,
worker_init_fn=seed_worker,
generator=g,
)

参考文献

Reproducibility - PyTorch 1.10.1 documentation

torch.index_select - PyTorch 1.10.1 documentation

公众号后台回复“速查表”获取

21张速查表(神经网络、线性代数、可视化等)打包下载~

△点击卡片关注极市平台,获取 最新CV干货
极市干货

算法竞赛:算法offer直通车、50万总奖池!高通人工智能创新应用大赛等你来战!

技术干货超简单正则表达式入门教程22 款神经网络设计和可视化的工具大汇总

极视角动态:芜湖市湾沚区联手极视角打造核酸检测便民服务系统上线!青岛市委常委、组织部部长于玉一行莅临极视角调研


点击阅读原文进入CV社区

收获更多技术干货

登录查看更多
1

相关内容

高精度从头设计透膜环肽分子
专知会员服务
2+阅读 · 2022年9月6日
【ICLR2022】序列生成的目标侧数据增强
专知会员服务
22+阅读 · 2022年2月14日
[SIGIR2021]可复现推荐系统评估的全面和严谨的框架
专知会员服务
21+阅读 · 2021年4月30日
【KDD2020】最小方差采样用于图神经网络的快速训练
专知会员服务
27+阅读 · 2020年7月13日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
实践教程|PyTorch 并行训练极简 Demo
极市平台
0+阅读 · 2022年11月12日
可能95%的人还在犯的PyTorch错误
PaperWeekly
0+阅读 · 2022年8月8日
浅谈混合精度训练imagenet
极市平台
1+阅读 · 2022年5月3日
实操教程|Pytorch转ONNX详解
极市平台
3+阅读 · 2022年4月4日
PyTorch 51.BatchNorm和Dropout层的不协调现象
极市平台
0+阅读 · 2022年2月19日
pytorch优化器与学习率设置详解
极市平台
1+阅读 · 2022年1月3日
PyTorch | 优化神经网络训练的17种方法
极市平台
3+阅读 · 2021年12月30日
PyTorch 深度剖析:如何保存和加载PyTorch模型?
极市平台
0+阅读 · 2021年11月28日
实践教程|PyTorch训练加速技巧
极市平台
0+阅读 · 2021年11月15日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
4+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
2+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
Arxiv
1+阅读 · 2023年1月18日
Arxiv
12+阅读 · 2022年4月12日
Arxiv
11+阅读 · 2020年12月2日
VIP会员
相关VIP内容
高精度从头设计透膜环肽分子
专知会员服务
2+阅读 · 2022年9月6日
【ICLR2022】序列生成的目标侧数据增强
专知会员服务
22+阅读 · 2022年2月14日
[SIGIR2021]可复现推荐系统评估的全面和严谨的框架
专知会员服务
21+阅读 · 2021年4月30日
【KDD2020】最小方差采样用于图神经网络的快速训练
专知会员服务
27+阅读 · 2020年7月13日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
相关资讯
实践教程|PyTorch 并行训练极简 Demo
极市平台
0+阅读 · 2022年11月12日
可能95%的人还在犯的PyTorch错误
PaperWeekly
0+阅读 · 2022年8月8日
浅谈混合精度训练imagenet
极市平台
1+阅读 · 2022年5月3日
实操教程|Pytorch转ONNX详解
极市平台
3+阅读 · 2022年4月4日
PyTorch 51.BatchNorm和Dropout层的不协调现象
极市平台
0+阅读 · 2022年2月19日
pytorch优化器与学习率设置详解
极市平台
1+阅读 · 2022年1月3日
PyTorch | 优化神经网络训练的17种方法
极市平台
3+阅读 · 2021年12月30日
PyTorch 深度剖析:如何保存和加载PyTorch模型?
极市平台
0+阅读 · 2021年11月28日
实践教程|PyTorch训练加速技巧
极市平台
0+阅读 · 2021年11月15日
相关基金
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
4+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
2+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
Top
微信扫码咨询专知VIP会员