Мне интересно узнать об использовании памяти трансформаторами. Я хотел бы использовать предварительно обученную модель для преобразования текста и сохранения вывода токена [CLS]. Никакого обучения, только умозаключение.
Мой вклад в bert составляет 511 жетонов. При размере пакета 16 моему коду не хватает памяти. Графический процессор имеет 32 ГБ памяти. У меня вопрос, как оценить использование памяти Бертом.
Как ни странно, другая работа с размером пакета 32 успешно завершилась с той же настройкой. Мой код указан ниже.
# Create dataloader
bs = 16
train_comb = ConcatDataset([train_data, valid_data])
train_dl = DataLoader(train_comb, sampler=RandomSampler(train_data), batch_size=bs)
model = BertModel.from_pretrained('/my_dir/bert_base_uncased/',
output_attentions=False,
output_hidden_states=False)
model.cuda()
out_list = []
model.eval()
with torch.no_grad():
for d in train_dl:
d = [i.cuda() for i in d]. # d = [input_ids, attention_mask, token_type_ids, labels]
inputs, labels = d[:3], d[3] # input_ids has shape 16 x 511
output = model(*inputs)[0][:, 0, :]
out_list.append(output)
outputs = torch.cat(out_list)
Позже я изменил цикл for на ниже
with torch.no_grad():
for d in train_dl:
d = [i.cuda() for i in d[:3]] # don't care about the labels
out_list.append(model(*d)[0][:, 0, :]) # remove the intermediary variables
del d
Подводя итог, мои вопросы:
- Как оценить использование памяти Бертом? Я хочу использовать его, чтобы оценить размер партии.
- Моя вторая работа с размером партии 32 завершилась успешно. Это потому, что у него больше набивок?
- Есть ли предложения по повышению эффективности использования памяти в моем коде?