【问题标题】:Pytorch incorrect value of member variable when using Multi-gpuPytorch使用Multi-gpu时成员变量的值不正确
【发布时间】:2019-04-03 07:47:20
【问题描述】:

这是一个在多GPU环境中运行的简单类。第一次迭代后成员变量self.firstIter应该是False

Class TestNetwork(nn.Module):

    def __init__(self):
        super(TestNetwork, self).__init__()
        self.firstIter = True #indicates whether it's the first iteration

    def forward(self, input):
        print 'is firstIter: ', self.firstIter #always True!!
        if self.firstIter is True:
            self.firstIter = False
        # do otherthings

仅使用一个 gpu 时,代码可以正常工作。

但是,当使用多 GPU(即nn.DataParallel)时,self.firstIter 的值始终打印为True

为什么会这样?代码有什么问题?

使用 PyTorch 0.3.1 版。

【问题讨论】:

    标签: variables pytorch multi-gpu


    【解决方案1】:

    基本上,DataParallel 对模型副本进行操作,如果设备数量大于 1,则对副本所做的更改(在转发期间)在向前/向后调用之外不可见。

    详情请咨询https://discuss.pytorch.org/t/nonetype-attribute-when-using-dataparallel/11566

    【讨论】:

    • 欢迎来到 Stackoverflow!请发布答案以帮助用户,而不是参考任何网站。 :) 谢谢!
    • 感谢您的回答!我已经检查了您提供的链接,但仍然无法理解。您能否解释一下“对副本所做的更改(在转发期间)在转发/向后调用之外不可见”的更多细节?据我了解,self.firstIter 的值的打印和更改都发生在 INSIDE 前向调用中,那么为什么问题是由模型副本引起的?
    • 在您的情况下,“firstIter”被创建为类属性。当您实例化测试网络并使用两个不同的 gpu 进行前向调用时,它的工作原理如下:在迭代 1 中,每个 gpu 复制在主进程中创建的实例并进行前向调用。打印'True'后,'firstIter'在每个gpu上按预期设置为false,但是,它只发生在每个gpu上存在的副本上,并且不会记录主进程中创建的实例的编辑属性(火炬机制)。因此,在 iter 2 中,每个 gpu 将再次从 'firstIter=True' 开始。希望对您有所帮助。
    • @HarryChow,非常感谢您的解释!所以我明白我在原始代码中犯的错误是打印firstIter 的方式。如果我可以访问“每个 GPU 上的副本”并在其中打印 firstIter,它应该可以按预期工作,对吗?然后是另一个问题:如何访问每个 GPU 上的副本?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多