I/O Problémy při Načítání Několik Velkých H5PY Soubory (Pytorch)

0

Otázka

Potkal jsem problém!

V poslední době se setkávám problém I/O problém. Cíle a vstupní data jsou uložena s h5py soubory. Každý cílový soubor je 2,6 GB , zatímco každý vstupní soubor je 10.2 GB. Mám 5 vstupních datových sad a 5 cílových datových souborů celkem.

Vytvořil jsem vlastní dataset funkce pro každý h5py souboru a potom pomocí data.ConcatDataset třídy propojit všechny datové sady. Vlastní dataset funkce 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])

Pak jsem použít dataset_train = data.ConcatDataset([MydataSet(indx=index, train=True) for index in range(1, 6)]) pro trénink. Když jen 2-3 h5py soubory jsou používány, I/O, rychlost je normální, a všechno půjde dobře. Nicméně, když 5 soubory jsou používány, školení, rychlost se postupně snižuje (5 iterací/s 1 iterací/s). Jsem změnit num_worker a problém stále existuje.

Mohl by mi někdo dát řešení? Měl jsem sloučit několik h5py soubory do větší? Nebo jiné metody? Díky předem!

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

Nejlepší odpověď

1

Zlepšení výkonu vyžaduje načasování referenční hodnoty. K tomu, že budete potřebovat, aby identifikovat potenciální úzká místa a souvisejících scénářů. Řekl jsi,"s 2-3 soubory I/O rychlost je normální" a "až 5 souborů se používají, školení, rychlost se postupně snižuje". Takže, to je váš problém výkonu I/O rychlost, nebo rychlost tréninku? Nebo to víš? Pokud nevíte, budete muset izolovat a porovnat I/O výkon a výkonnost školení odděleně pro 2 scénáře.
Jinými slovy, k měření výkonnosti I/O (pouze), musíte spustit následující testy:

  1. Čas na čtení a zřetězit 2-3 soubory,
  2. Čas na čtení a zřetězit 5 souborů,
  3. Nakopírujte 5 souborů do 1, a čas na čtení ze sloučeného souboru,
  4. Nebo, odkaz 5 soubory do 1 souboru a času.

A měřit rychlost tréninku (pouze), je třeba porovnat výkon pro následující zkoušky:

  • Sloučení 2-3 soubory, pak si přečtěte a vlak z sloučeného souboru.
  • Sloučení všech 5 souborů, pak si přečtěte a vlak z sloučeného souboru.
  • Nebo, odkaz 5 soubory do 1 souboru, potom si přečtěte a vlak z odkazovaného souboru.

Jak je uvedeno v můj komentář, sloučení (nebo propojení) více HDF5 souborů do jednoho, je snadné, pokud všechny datové sady jsou na kořenové úrovni a všechny datové sady jsou jedinečné názvy. Jsem přidal externí odkaz metodu, protože to může poskytnout stejný výkon, bez duplikování velké datové soubory.

Níže je kód, který ukazuje, jak metody. Nahradit názvy souborů v fnames seznamu, a to by měl být připraven ke spuštění. Pokud váš dataset názvy nejsou jedinečné, budete muset vytvořit jedinečné názvy a přiřadit v h5fr.copy() - jako tento: h5fr.copy(h5fr[ds],h5fw,'unique_dataset_name')

Kód sloučit nebo spojit soubory :
(komentář/odkomentujte řádky podle potřeby)

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 odeslání kódu, který zkopíruje všechny datové soubory do 1 souboru, jsem si uvědomil, že externí odkazy, může být lepší řešení. Oni eliminovat duplicitní kopie dat. Jedinou otázkou je výkon. Kód pro odkaz je téměř totožný. Upravil jsem svou odpověď a kód pro zobrazení obou metod.
kcw78

V jiných jazycích

Tato stránka je v jiných jazycích

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