簡體   English   中英

有沒有更有效的方法從 hdf5 數據集中檢索批次?

[英]Is there a more efficient way of retrieving batches from a hdf5 dataset?

我有一個用於 Pytorch 數據加載的數據類。 它從 hdf5 存檔(150k 樣本)中檢索項目,然后我將其輸入數據加載器並訓練一個小的隱藏層自動編碼器。 但是,當我嘗試訓練我的網絡時,什么也沒有發生,沒有 GPU 利用率。 我正在使用 4 個 CPU 和 2 個 GPU 開始。

我的批量大小是 128,當我開始訓練時我使用了 8 個工人。

我也遵循了 Pytorchs 數據並行教程。 下面是我的 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)

這是我的自動編碼器 class:

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

這就是我初始化 model 的方式:

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 功能數據集 class,我試圖在不使用__init__的情況下延遲加載 hdf5 數據集,但我認為計算數據集的長度可能是問題......

問題可能是延遲加載導致的瓶頸。 您可以嘗試在數據加載器的init處加載所有數據(如果您有足夠的資源)。 然后,在getitem處,只需從已准備好的列表中返回 datum[index]、label[index]、path[index]。 希望能幫助到你。 祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM