#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")