I/O Problémy pri Načítaní Niekoľko Veľkých H5PY Súbory (Pytorch)

0

Otázka

Stretol som problém!

Nedávno som sa stretnúť s problémom I/O problém. Cieľ a vstupné dáta sú uložené s h5py súbory. Každý cieľový súbor je 2.6 GB , zatiaľ čo každý vstupný súbor je 10.2 GB. Mám 5 vstupné súbory dát a 5 cieľová súbory dát v celkom.

Vytvoril som si vlastný dataset funkcie pre každého h5py súbor a potom použite údajov.ConcatDataset triedy na odkaz všetky súbory dát. Vlastné dataset funkcia je:

class MydataSet(Dataset):
def __init__(self, indx=1, root_path='./xxx', tar_size=128, data_aug=True, train=True):
    self.train = train
    if self.train:
        self.in_file = pth.join(root_path, 'train', 'train_noisy_%d.h5' % indx)
        self.tar_file = pth.join(root_path, 'train', 'train_clean_%d.h5' % indx)
    else:
        self.in_file = pth.join(root_path, 'test', 'test_noisy.h5')
        self.tar_file = pth.join(root_path, 'test', 'test_clean.h5')
    self.h5f_n = h5py.File(self.in_file, 'r', driver='core')
    self.h5f_c = h5py.File(self.tar_file, 'r')
    self.keys_n = list(self.h5f_n.keys())
    self.keys_c = list(self.h5f_c.keys())
    # h5f_n.close()
    # h5f_c.close()

    self.tar_size = tar_size
    self.data_aug = data_aug

def __len__(self):
    return len(self.keys_n)

def __del__(self):
    self.h5f_n.close()
    self.h5f_c.close()

def __getitem__(self, index):
    keyn = self.keys_n[index]
    keyc = self.keys_c[index]
    datan = np.array(self.h5f_n[keyn])
    datac = np.array(self.h5f_c[keyc])
    datan_tensor = torch.from_numpy(datan).unsqueeze(0)
    datac_tensor = torch.from_numpy(datac)
    if self.data_aug and np.random.randint(2, size=1)[0] == 1: # horizontal flip
        datan_tensor = torch.flip(datan_tensor,dims=[2]) # c h w
        datac_tensor = torch.flip(datac_tensor,dims=[2])

Potom som pomocou dataset_train = data.ConcatDataset([MydataSet(indx=index, train=True) for index in range(1, 6)]) pre vzdelávanie. Keď len 2-3 h5py súbory sa používajú, I/O rýchlosť je normálne a všetko pôjde doprava. Avšak, keď 5 súbory sa používajú, školenia rýchlosť sa postupne klesá (5 iterácie/s na 1 iterácie/s). Môžem zmeniť num_worker a problém stále existuje.

Mohol by niekto dať mi riešenie? By som sa spojiť niekoľko h5py súbory do väčšej? Alebo iné metódy? Vďaka vopred!

h5py python pytorch pytorch-dataloader
2021-11-24 02:02:17
1

Najlepšiu odpoveď

1

Zlepšovanie výkonnosti vyžaduje načasovanie kritérií. Na to, že budete musieť identifikovať potenciálne prekážky a súvisiace scenáre. Povedal si:"s 2-3 súbory I/O rýchlosť je normálne" a "keď 5 súbory sa používajú, školenia rýchlosť postupne klesá". Takže, je výkon vášho problému I/O rýchlosť alebo rýchlosť tréningu? Alebo poznáte? Ak neviete, čo potrebujete izolovať a porovnajte, I/O výkon a výcvik výkon osobitne pre 2 scenáre.
Inými slovami, na meranie I/O výkon (len) musíte spustite nasledovné testy:

  1. Čas čítať a zřetězit 2-3 súbory,
  2. Čas čítať a zřetězit 5 súborov,
  3. Skopírujte 5 súborov do 1, a čas na čítanie zo zlúčených súbor,
  4. Alebo, prepojenie 5 súborov na 1 súbor, a čas.

A merať rýchlosť tréningu (len) treba porovnať výkonu pre nasledujúce testy:

  • Zlúčiť 2-3 súbory, a potom si prečítajte a vlak zo zlúčených súbor.
  • Zlúčiť všetky 5 súborov, a potom si prečítajte a vlak z zlúčil súbor.
  • Alebo, prepojenie 5 súborov na 1 súbor, a potom si prečítajte a vlak z prepojený súbor.

Ako sa uvádza vo svojom komentári, zlúčenie (alebo prepojenia) viac HDF5 súborov do jedného je jednoduché, ak všetky súbory dát sú na najvyššej úrovni a všetky dataset mená sú jedinečné. Pridala som externý odkaz metódu, pretože to by mohlo poskytnúť rovnaký výkon, bez duplikácia veľké dátové súbory.

Nižšie je kód, ktorý ukazuje, obe metódy. Náhrada svoje názvy súborov v fnames zoznam, a mal by byť pripravený na spustenie. Ak váš dataset mená nie sú jedinečné, budete musieť vytvoriť jedinečné názvy, a priradiť v h5fr.copy() - podobne ako tento: h5fr.copy(h5fr[ds],h5fw,'unique_dataset_name')

Kód zlúčiť -alebo - link súbory :
(comment/uncomment riadkov podľa potreby).

import h5py
fnames = ['file_1.h5','file_2.h5','file_3.h5']
# consider changing filename to 'linked_' when using links:
with h5py.File(f'merge_{len(fnames)}.h5','w') as h5fw:      
    for fname in fnames:
        with h5py.File(fname,'r') as h5fr:
            for ds in h5fr.keys():
                # To copy datasets into 1 file use:
                h5fr.copy(h5fr[ds],h5fw)
                # to link datasets to 1 file use:
                # h5fw[ds] = h5py.ExternalLink(fname,ds)
2021-11-25 15:23:04

Po odoslaní kód, ktorý skopíruje všetky súbory dát na 1 súbor, uvedomil som si, že externé odkazy môžu byť lepšie riešenie. Eliminujú duplikované kópie údajov. Jedinou otázkou je výkon. Kód odkaz je takmer identické. Som upravil moja odpoveď a kód zobraziť oboch metód.
kcw78

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................