Как инициализировать пустой тензор с определенным измерением и добавить к нему через al oop без CUDA из памяти? - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь добавить тензоры (t), сгенерированные в for-l oop, в список [T], который накапливает все эти тензоры. Затем список [T] необходимо преобразовать в тензор и загрузить в графический процессор.

        b_output = []

        for eachInputId, eachMask in zip(b_input_ids, b_input_mask):
            # unrolled into each individual document
            # print(eachInputId.size()) # individual document here

            outputs = model(eachInputId, 
                    token_type_ids=None, 
                    attention_mask=eachMask)


            # combine the [CLS] output layer to form the document
            doc_output = torch.mean(outputs[1], dim=0) # size = [1, ncol]

            b_output.append( doc_output )

        t_b_output = torch.tensor( b_output )

Еще один метод, который я попробовал, - инициализация тензора {T} с фиксированными размерами и добавление к нему тензоров (t) из for-l oop.

        b_output = torch.zeros(batch_size, hidden_units)
        b_output.to(device) # cuda device

        for index, (eachInputId, eachMask) in enumerate(zip(b_input_ids, b_input_mask)):
            # unrolled into each individual document
            # print(eachInputId.size()) # individual document here

            outputs = model(eachInputId, 
                    token_type_ids=None, 
                    attention_mask=eachMask)


            # combine the [CLS] output layer to form the document
            doc_output = torch.mean(outputs[1], dim=0) # size = [1, ncol]

            b_output[index] = doc_output
* 1006. * Выполнение любого из этих действий приводит к этой ошибке:
RuntimeError: CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 11.17 GiB total capacity; 10.65 GiB already allocated; 2.81 MiB free; 10.86 GiB reserved in total by PyTorch)

Я предполагаю, что это происходит из-за добавления тензоров (которые на GPU) в список (конечно, не на GPU), а затем пытается преобразовать список в тензор (это не на GPU).

Что можно сделать, чтобы добавить эти тензоры к другому тензору и затем загрузить тензор в графический процессор для дальнейшей обработки?

Буду благодарен за любые подсказки или информацию.

1 Ответ

0 голосов
/ 25 апреля 2020

Попробуйте использовать torch.cat вместо torch.tensor. В настоящее время вы пытаетесь выделить память для нового тензора, в то время как все остальные тензоры все еще хранятся, что может быть причиной ошибки нехватки памяти. Изменение:

t_b_output = torch.tensor( b_output )

с:

t_b_output = torch.cat( b_output )

Надеюсь, что эта помощь

...