【问题标题】:Reproducibility and performance in PyTorchPyTorch 中的可重复性和性能
【发布时间】:2019-05-29 06:38:06
【问题描述】:
documentation 声明:
确定性模式可能会对性能产生影响,具体取决于您的模型。
我的问题是,这里的性能是什么意思。处理速度或模型质量(即最小损失)?换句话说,当设置手动种子并使模型以确定性方式执行时,这是否会导致更长的训练时间,直到找到最小损失,或者最小损失比模型非确定性时更糟?
为了完整起见,我通过设置所有这些属性手动使模型具有确定性:
def set_seed(seed):
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
np.random.seed(seed)
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
【问题讨论】:
标签:
python
performance
deep-learning
pytorch
deterministic
【解决方案1】:
性能是指运行时间; CuDNN 有多种实现方式,当 cudnn.deterministic 设置为 true 时,您是在告诉 CuDNN 您只需要确定性实现(或我们认为的实现)。简而言之,当您执行此操作时,您应该期望在提供 相同的输入时,相同的系统上的 CPU 或 GPU 上的相同的结果时间>。为什么会影响性能? CuDNN 使用启发式方法来选择实现。因此,它实际上取决于您的模型 CuDNN 的行为方式;选择它是确定性的可能会影响运行时,因为它们可能是,比方说,在同一运行点选择它们的更快方式。
关于你的 sn-p,我做了精确的播种,它在 100 多个 DL 实验中运行良好(在可重复性方面)。
【解决方案2】:
【讨论】:
-
-
在不同训练课程之间启用随机变化时,您显然不会得到完全相同的权重,因此不会完全获得相同的损失/准确度。然而,这些差异是微小的(参见例如this)。另一方面,要求完全相同的数值结果需要以完全相同的方式进行训练过程。这需要 时间:固定并行计算的顺序不允许您享受负载平衡等。因此,就准确性/损失而言,您处于大致相同的位置,但时间更长。@Bra
-
有趣的是,有人声称随机种子会产生巨大的影响。在这里,您会看到具有不同种子的相同模型具有 10% 的准确度差异。 linkedin.com/posts/…