Есть ли более эффективный способ получения пакетов из набора данных hdf5?

У меня есть класс данных для загрузки данных Pytorch. Он извлекает элементы из архива hdf5 (150 тыс. Образцов), прежде чем я загружу их в загрузчик данных и обучу небольшой автоэнкодер с одним скрытым слоем. Однако, когда я пытаюсь обучить свою сеть, ничего не происходит, нет загрузки графического процессора. Для начала я использую 4 процессора и 2 графических процессора.

У меня размер партии 128, и я использую 8 рабочих, когда начинаю обучение.

Я также следил за учебником Pytorchs dataparallel. Ниже мой код для класса данных hdf5.

import torch.multiprocessing as mp mp.set_start_method(‘fork’) from torch.utils import data import h5py import time class Features_Dataset(data.Dataset): def __init__(self, file_path, phase): self.file_path = file_path self.archive = None self.phase = phase with h5py.File(file_path, ‘r’, libver=’latest’, swmr=True) as f: self.length = len(f[(self.phase) + ‘_labels’]) def _get_archive(self): if self.archive is None: self.archive = h5py.File(self.file_path, ‘r’, libver=’latest’, swmr=True) assert self.archive.swmr_mode return self.archive def __getitem__(self, index): archive = self._get_archive() label = archive[str(self.phase) + ‘_labels’] datum = archive[str(self.phase) + ‘_all_arrays’] path = archive[str(self.phase) + ‘_img_paths’] return datum[index], label[index], path[index] def __len__(self): return self.length def close(self): self.archive.close() if __name__ == ‘__main__’: train_dataset = Features_Dataset(file_path= «featuresdata/train.hdf5», phase= ‘train’) trainloader = data.DataLoader(train_dataset, num_workers=8, batch_size=1) print(len(trainloader)) myStart = time.time() for i, (data, label, path) in enumerate(trainloader): print(path)

Это мой класс для автоэнкодера:

import torch import torch.nn as nn class AutoEncoder(nn.Module): def __init__(self, n_embedded): super(AutoEncoder, self).__init__() self.encoder = nn.Sequential( nn.Linear(6144, n_embedded)) self.decoder = nn.Sequential(nn.Linear(n_embedded, 6144)) def forward(self, x): encoded = self.encoder(x) decoded = self.decoder(encoded) return encoded, decoded

Вот как я инициализирую модель:

device = torch.device(«cuda») # Initialize / load checkpoint model = AutoEncoder(2048) if torch.cuda.device_count() > 1: print(«Let’s use», torch.cuda.device_count(), «GPUs!») model= nn.DataParallel(model) model.to(device) criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(),weight_decay=1e-5)

Я убеждаюсь, что мои входы тоже вставлены в устройство.

Может ли быть проблемой скорость получения пакетов? Что касается класса hdf5 Features Dataset, я пытаюсь лениво загрузить набор данных hdf5 без использования __init__, однако я думаю, что, возможно, проблема может быть в вычислении длины набора данных …

Источник: ledsshop.ru

Стиль жизни - Здоровье!