Я использую простой метод для извлечения дескрипторов из изображений и сохранения их на диск в файл .csv
.У меня есть около 1M изображений, и моя сеть возвращает 512 объектов на изображение (float32
).
Поэтому, по моим оценкам, в конце цикла у меня будет 1e6 * 512 * 32/4 / 1e9 = 4.1GB
.Однако я заметил, что он использует более чем в два раза больше памяти.
index
- это string
, а class_id
- это int64
, поэтому я не думаю, что они являются виновником здесь.
Я уже пытался использовать gc.collect()
, но безуспешно.Как вы думаете, мой код оставляет ссылки позади?
Вот метод:
def prepare_gallery(self, data_loader, TTA, pbar=False, dump_path=None):
'''Compute embeddings for a data_loader and store it in model.
This is required before predicting to a test set.
New entries should be removed from data before calling this function
to avoid inferring on useless images.
data_loader: A linear loader containing the database that test is
compared against.'''
self.set_mode('valid')
self.net.cuda()
n_iter = len(data_loader.dataset) / data_loader.batch_size
if pbar:
loader = tqdm(enumerate(data_loader), total=n_iter)
else:
loader = enumerate(data_loader)
# Run inference and get embeddings
feat_list = []
index_list = []
class_list = []
for i, (index, im, class_id) in loader:
with torch.no_grad():
feat = tta(self.net, im)
# Returns something like np.random.random((32, 512))
feat_list.extend(feat)
index_list.extend(index)
class_list.extend(class_id.item())
if dump_path is not None:
np.save(dump_path + '_ids', index_list)
np.save(dump_path + '_cls', class_list)
np.save(dump_path + '_feat', feat_list)
return np.asarray(index_list), np.asarray(feat_list), np.asarray(class_list)