使用pytorch DistributedDataParallel
时遇到了一些问题。情况是:
我的模型是 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
现在我有一些新数据。我想在多个 GPU上对其进行微调。我需要将 A 包装为多GPU模型 B 。
但是有两个培训阶段。在第1阶段,我要 B 的修复 layer0
和layer1
。在第二阶段,仅修复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()
答案 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
中),并且仅将其部分参数传递给相关的优化器。