Ребят, помогите пожалуйста разобраться, как сделать правильно!? У меня есть файл

типа hdf5. В pytorch датасете у меня с него считываются данные. Проблема заключается в том, что при обучении, всё что считывается, остается в ram, и постепенно ram переполняется. Есть мысли почему так происходит и куда копать?

class ExtractDataset(Dataset):

def __init__(self, path2captions: str, path2vectors: str,):

self.path2captions = path2captions
self.first_path2vectors = first_path2vectors

with h5py.File(self.first_path2vectors, 'r') as f:
self.number = max(int(key) for key in f.keys())

def __len__(self):
return self.number

def get_data_from_hdf5(self, path, idx):

with h5py.File(path, 'r') as f:
data = f[f'{idx}'][:]

data = torch.from_numpy(data).squeeze()

return data

def __getitem__(self, idx):

detections = self.get_data_from_hdf5(self.first_path2vectors, idx)

caption = self.get_data_from_hdf5(self.path2captions , idx)

return {'inputs': detections, 'outputs': caption}

Далее все стандартно, отправляю датасет в даталоадер и в цикл тренировочный.

Пробовал считывать значение напряму в список, потом в __getitem__ из списка каждый раз удалять значения, но это тоже не помогло.

class ExtractDataset(Dataset):

def __init__(self, path2captions: str, first_path2vectors: str):

self.path2captions = path2captions
self.first_path2vectors = first_path2vectors
self.data_cache = []

def __len__(self):

with h5py.File(self.first_path2vectors, 'r') as f:
number = max(int(key) for key in f.keys())

return number

def cache_data_from_hdf5(self, path, idx):

with h5py.File(path, 'r') as f:
self.data_cache.append(torch.from_numpy(f[f'{idx}'][:]).squeeze())

def __getitem__(self, idx):

self.cache_data_from_hdf5(self.first_path2vectors, idx)

self.cache_data_from_hdf5(self.path2captions , idx)

return {'inputs': self.data_cache.pop(0), 'outputs': self.data_cache.pop(0)}

UPD1: с компьютера в телеграме код читабельный, с телефона не очень ( прошу прощения.
UPD2: возможно здесь все нормально, стоит искать утечку в другом месте? но все остально идет на gpu

14 ответов

55 просмотров

Заюзать либу Dataset от хаггингфэйс и перестать страдать )

А чем она хороша? При работе с большим корпусом становится проблематично, так как надо токенизировать, и всё это хэшируется на диске

А где проблема? Токенизированным лежит на диске и лежит. Многопоточный map из коробки. Многопоточное залетание в память из коробки. Идеальная интеграция с Тренером от HF из коробки Как выглядит вариант идеальнее?

Нету bucketing'а с диска, кажется

Что подразумевается под bucketing?

Группировка в батчи примеров одного или близкого по размеру последовательности для рннок и трансформеров

Джереми Говард страшно гордился в свое время, что у него в фастаи такое есть)

Сталкивался с этим при обучении wav2vec.

В целом они это решили динамическим паддингом в тренере

а чем это так хорошо? в плане скорости, или и на самом обучении как-то сказывается

На обучении вряд ли, но на скорости может сказаться значительно. Как и на требуемой для обучения памяти.

а на память-то это как влияет? видимо будут батчи которые меньше потребуют, но верхняя максимальная планка не понизится же от этого, а значит и погоды не сделает. или как?

Да, верно. Верхняя планка не понизится, это я ерунду сказал)

Но это по условии считывания с диска, а не с памяти, естественно.

Похожие вопросы

Карта сайта