Есть ли более эффективный способ получения пакетов из набора данных 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__, однако я думаю, что, возможно, проблема может быть в вычислении длины набора данных …

См. также:  Как получить значения из модального окна частичного просмотра для обновления формы?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. TSRAI

    Проблема может заключаться в узком месте, вызванном отложенной загрузкой. Вы можете попробовать загрузить все данные в init загрузчика данных (если у вас достаточно ресурсов). Затем в getitem просто верните данные [индекс], метку [индекс], путь [индекс] из уже подготовленных списков. Надеюсь, это поможет. Удачи!

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: