RuntimeError:期望所有张量都在同一设备上,但发现至少有两个设备,cuda:0和cpu在变压器上



def nopeak_mask(size, opt):
np_mask = np.triu(np.ones((1, size, size)),k=1).astype('uint8')
np_mask =Variable(torch.from_numpy(np_mask) == 0)
if opt.device == 0:
np_mask = np_mask.cuda()
return np_mask
def create_masks(src, trg, opt):
src_mask = (src != opt.src_pad).unsqueeze(-2)
if trg is not None:
trg_mask = (trg != opt.trg_pad).unsqueeze(-2)
size = trg.size(1) # get seq_len for matrix
np_mask = nopeak_mask(size, opt)
#if trg.is_cuda:
#    np_mask.cuda()
print(np_mask)
print(trg_mask)
trg_mask = trg_mask & np_mask
else:
trg_mask = None
return src_mask, trg_mask

这段代码有问题在这一行trg_mask = trg_mask & np_mask我检查两个张量,我确定在不同的装置中源代码可以在这里找到。

听起来trg_mask和np_mask是存储在两个不同设备上的张量(cpu和cuda:0)。如果你想对它们执行操作,它们需要同时位于cpu上或者同时位于cuda:0.

根据给出的信息,我不确定哪个变量在哪个设备上,但如果你想将一个变量从cuda:0移动到cpu,你可以这样做。

var = var.detach().cpu().numpy()

我解决了这个问题我移动src,在调用create_mask函数之前尝试cuda在训练文件第30行我修改:

src = batch.src.transpose(0,1).cuda()
trg = batch.trg.transpose(0,1).cuda()
trg_input = trg[:, :-1]
src_mask, trg_mask = create_masks(src, trg_input, opt)

我也遇到过类似的问题,因为有一行:

device = torch.device("cuda" if args.cuda else "cpu")

这可以通过以下方式解决:

device = torch.device("cpu")

device = torch.device("cuda")

最新更新