【问题标题】:Non-reproducible results in pytorch after saving and loading the model保存和加载模型后在 pytorch 中出现不可重现的结果
【发布时间】:2019-12-03 08:37:03
【问题描述】:

保存和加载模型后,我无法在 PyTorch 中重现我的结果,而内存中的模型按预期工作。只是为了上下文,我正在为我的库播种,使用 model.eval 关闭辍学,但结果仍然不可重现。如果我遗漏了什么,有什么建议。提前致谢。

我正在使用的库:-

import matplotlib.pyplot as plt
import torch
from torch import nn
from torch import optim
import torch.nn.functional as F
from torchvision import datasets, transforms
import numpy as np
import random

我正在播种的库

manualSeed = 1
np.random.seed(manualSeed)
random.seed(manualSeed)
torch.manual_seed(manualSeed)
random.seed(manualSeed)

以下是内存和加载模型的结果。

In Memory model Loss : 1.596395881312668, In Memory model Accuracy : tensor(0.3989)
Loaded model Loss : 1.597083057567572, Loaded model Accuracy : tensor(0.3983)

【问题讨论】:

  • 请发布更多上下文或代码示例,模型的详细信息以及与内存模型的区别。
  • @amdex 我添加了小代码和我的结果。请让我知道我是否应该提供更多信息。谢谢。
  • 如果您可以添加模型定义以及是否在 GPU 上运行它会很棒。这也有助于帮助您

标签: deep-learning pytorch


【解决方案1】:

自 Szymon Maszke 在上面发布他的回复之日(2019 年)以来,已经添加了一个新 API,torch.use_deterministic_algorithms()

这个新函数完成了 torch.backends.cudnn.deterministic 所做的一切(即,使 CuDNN 卷积运算具有确定性),以及更多(使每个已知的正常非确定性函数成为确定性的,或者如果确定性实现不可用则抛出错误)。 CuDNN 卷积只是 PyTorch 中众多可能的不确定性来源之一,因此现在应该使用 torch.use_deterministic_algorithms() 而不是旧的 torch.backends.cudnn.deterministic

reproducibility documentation 的链接仍然有效。但请注意,自 2019 年以来,此页面已发生了相当大的变化。

【讨论】:

    【解决方案2】:

    关于不可重复性

    值非常接近,所以它们不是不可重现的,误差范围非常大。

    来自documentation on reproducibility

    有一些 PyTorch 函数使用 CUDA 函数 不确定性的来源。一类这样的 CUDA 函数是原子的 操作,特别是 atomicAdd,其中并行顺序 相同值的加法是不确定的,对于浮点数 变量,结果差异的来源。

    模型越复杂,基于使用 atomicAdd 的函数的随机方差的可能性就越大,这纯属巧合,本质上存在一些你无法战胜的固有变化。

    提高 CUDA 的重现性

    我想你是在 GPU 上运行推理,你也应该使用这两个函数:

    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False
    

    记住在推理之前以相同的方式播种,您应该会看到结果彼此更接近。

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2019-09-26
      • 2021-10-10
      • 1970-01-01
      • 2022-09-28
      • 2020-09-05
      • 1970-01-01
      • 2022-11-22
      • 2020-10-21
      相关资源
      最近更新 更多