Ошибка RuntimeError: ожидалось, что все тензоры будут на одном устройстве, но найдено как минимум два устройства, cuda: 0 и cpu на transormer

#python #tensorflow #runtime

#python #tensorflow #время выполнения

Вопрос:

 
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 amp; np_mask

    else:
        trg_mask = None
    return src_mask, trg_mask

 

В этом коде есть проблема
в этой строке trg_mask = trg_mask amp; np_mask
Я проверяю два тензора, я уверен, что на разных устройствах
исходный код можно найти здесь
.

Ответ №1:

Похоже, что trg_mask и np_mask — это тензоры, хранящиеся на двух разных устройствах (cpu и cuda: 0). Если вы хотите выполнить с ними операцию, они должны быть либо на одном процессоре, либо оба должны быть на cuda: 0.

Основываясь на предоставленной информации, я не уверен, какая переменная находится на каком устройстве, но если вы хотите переместить переменную из cuda: 0 в cpu, вы можете это сделать.

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

Комментарии:

1. np_mask на Cuda и trg_mask на CPU. если я хочу переместить trg_mask в Cuda, у меня возникла новая проблема: ввод и вывод должны выполняться на одном устройстве. этот код работал в прошлом, но сейчас не работает. может ли проблема в версии PyTorch?

2. Я использовал var = var.detach().cpu().numpy(), но все еще находится в cuda

Ответ №2:

Я исправил эту проблему. Я перемещаю src, trg в cuda перед вызовом функции create_masks в строке файла 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)
 

Ответ №3:

Я столкнулся с аналогичной проблемой из-за одной строки:

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

Это можно решить, используя либо:

 device = torch.device("cpu")
 

или

 device = torch.device("cuda")