типа 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
Заюзать либу Dataset от хаггингфэйс и перестать страдать )
А чем она хороша? При работе с большим корпусом становится проблематично, так как надо токенизировать, и всё это хэшируется на диске
А где проблема? Токенизированным лежит на диске и лежит. Многопоточный map из коробки. Многопоточное залетание в память из коробки. Идеальная интеграция с Тренером от HF из коробки Как выглядит вариант идеальнее?
Нету bucketing'а с диска, кажется
Что подразумевается под bucketing?
Группировка в батчи примеров одного или близкого по размеру последовательности для рннок и трансформеров
Джереми Говард страшно гордился в свое время, что у него в фастаи такое есть)
Сталкивался с этим при обучении wav2vec.
В целом они это решили динамическим паддингом в тренере
а чем это так хорошо? в плане скорости, или и на самом обучении как-то сказывается
На обучении вряд ли, но на скорости может сказаться значительно. Как и на требуемой для обучения памяти.
а на память-то это как влияет? видимо будут батчи которые меньше потребуют, но верхняя максимальная планка не понизится же от этого, а значит и погоды не сделает. или как?
Да, верно. Верхняя планка не понизится, это я ерунду сказал)
Но это по условии считывания с диска, а не с памяти, естественно.
Обсуждают сегодня