首页 > 解决方案 > RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu on transormer

问题描述


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 我检查了两个张量我确信在不同的设备中可以找到源代码here

标签: pythontensorflowruntime

解决方案


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

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

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

推荐阅读