深度学习可复现相关设置
确定性设置
随机种子设置
随机函数是最大的不确定性来源,包含了模型参数的随机初始化,样本的shuffle。
- PyTorch 随机种子
- python 随机种子
- numpy 随机种子
# PyTorch |
CPU版本下,上述随机种子设置完成之后,基本就可实现实验的可复现了。
对于GPU版本,存在大量算法实现为不确定结果的算法,这种算法实现效率很高,但是每次返回的值会不完全一样。主要是由于浮点精度舍弃,不同浮点数以不同顺序相加,值可能会有很小的差异(小数点最末位)。
GPU算法确定性实现
GPU算法的不确定来源有两个
- CUDA convolution benchmarking
- nondeterministic algorithms
CUDA convolution benchmarking 是为了提升运行效率,对模型参数试运行后,选取最优实现。不同硬件以及benchmarking本身存在噪音,导致不确定性
nondeterministic algorithms:GPU最大优势就是并行计算,如果能够忽略顺序,就避免了同步要求,能够大大提升运行效率,所以很多算法都有非确定性结果的算法实现。通过设置use_deterministic_algorithms,就可以使得pytorch选择确定性算法。
# 不需要benchmarking |
RUNTIME ERROR
对于一个PyTorch 的函数接口,没有确定性算法实现,只有非确定性算法实现,同时设置了use_deterministic_algorithms(),那么会导致运行时错误。比如:
import torch |
错误原因:
index_add没有确定性的实现,出现这种错误,一般都是因为调用了torch.index_select 这个api接口,或者直接调用tensor.index_add_。
解决方案:
自己定义一个确定性的实现,替换调用的接口。对于torch.index_select 这个接口,可以有如下的实现。
def deterministic_index_select(input_tensor, dim, indices): |
样本读取随机
- 多线程情况下,设置每个线程读取的随机种子
- 设置样本generator
# 设置每个读取线程的随机种子 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JrunDing!
评论