在多个固定层的GPU上训练单个pytorch模型?

时间:2019-12-02 08:06:40

标签: python machine-learning parallel-processing gpu pytorch

使用pytorch DistributedDataParallel时遇到了一些问题。情况是:

  1. 我的模型是 A ,并且像往常一样在单个 GPU上进行了训练。假设 A 中有三层:

    class A(nn.module):
        def __init__(self):
            super(A,self).__init__()
            self.layer0 = layer0
            self.layer1 = layer1
            self.layer2 = layer2
    
        def forward(self,x):
            x=self.layer0(x)
            x=self.layer1(x)
            x=self.layer2(x)
            return x
    
  2. 现在我有一些新数据。我想在多个 GPU上对其进行微调。我需要将 A 包装为多GPU模型 B

  3. 但是有两个培训阶段。在第1阶段,我要 B 修复 layer0layer1。在第二阶段,仅修复layer0。然后应在训练期间更改requires_grad中的参数layer1。但是,DistributedDataParallel doc说:

      

    在用DistributedDataParallel包装模型后,您从不尝试更改模型的参数。

实际上,我尝试使用B.module来引用包裹在 B 中的 A 。但是与单GPU模型相比,测试结果是异常的。也许这种方式是不允许的。

我该怎么办?有什么合适的方法可以包装我的模型吗?保存和加载模型时应注意什么?

只需在具有多个GPU的单台计算机上运行它,即可忽略使用多台计算机的分布式情况。非常感谢。

更新2019.12.03

按照@jodag的建议,我尝试了DataParallel,但是没有用。这次,在包装后,我没有在 B 中进行任何更改(除了对其进行了培训)。为简单起见,我的代码是这样的(我指的是this):

class B(nn.DataParallel):
     def __getattr__(self, name):
        try:
            return super().__getattr__(name)
        except AttributeError:
            return getattr(self.module, name)
a = A()
b = B(a,device_ids=[0,1])
b = b.cuda()
trained_param = b.layer2.parameters()
# trained_param = [{'params':b.layer2.parameters()},{'params':b.layer1.parameters()}]
optimizer = optim.Adam(trained_param)
b.train()
...
for x, label in data_loader:
    optimizer.zero_grad()
    x = x.to(0) # This line can be commented.
    y = b(x)
    l = loss(y, label)
    l.backword()
    optimizer.step()


1 个答案:

答案 0 :(得分:1)

如果仅尝试优化部分参数,为什么不尝试通过 optimizer 而不是模型进行控制?
您可以将模型保持原样(包装在library(dplyr) df %>% mutate(Duplicate_Set = group_indices(., id, serial)) %>% group_by(Duplicate_Set, code) %>% mutate(comment = n()) # id serial code Duplicate_Set comment # <fct> <fct> <fct> <int> <int> #1 B19 a IA284 1 1 #2 B19 a IA114 1 2 #3 B19 a IA114 1 2 #4 B20 b IB290 2 2 #5 B20 b IB485 2 1 #6 B20 b IB290 2 2 中),并且仅将其部分参数传递给相关的优化器。