I/O Probleme la Încărcare mai Multe Mari H5PY Fișiere (Pytorch)

0

Problema

Eu am intalnit o problema!

Recent am întâlnit o problemă de I/O problema. Țintă și datele de intrare sunt stocate cu h5py fișiere. Fiecare fișier țintă este de 2.6 GB , în timp ce fiecare fișier de intrare este de 10.2 GB. Am 5 seturi de date de intrare și 5 seturi de date țintă în total.

Am creat un obicei de date funcția pentru fiecare h5py fișier și de a folosi apoi datele.ConcatDataset clasa a lega toate seturile de date. Personalizat set de date funcția este:

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])

Apoi am folosi dataset_train = data.ConcatDataset([MydataSet(indx=index, train=True) for index in range(1, 6)]) pentru formare. Atunci când doar 2-3 h5py fișiere sunt utilizate, I/O viteză este normal și totul merge bine. Cu toate acestea, atunci când 5 fișiere sunt utilizate, viteza de antrenament este treptat în scădere (5 iterații/s la 1 iterații/s). Am schimba num_worker și problema încă există.

Ar putea cineva sa-mi dea o solutie? Ar trebui să fuzioneze mai multe h5py fișiere într-una mai mare? Sau alte metode? Multumesc anticipat!

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

Cel mai bun răspuns

1

Îmbunătățirea performanței necesită sincronizare de referință. Pentru a face asta ai nevoie pentru a identifica eventualele blocaje și asociate scenarii. Ai spus "cu 2-3 fișiere I/O este viteza normală" și "când 5 fișiere sunt utilizate, pregătirea viteza scade treptat". Deci, este problema de performanta I/O viteza, sau viteza de antrenament? Sau nu stii? Dacă nu știți, aveți nevoie pentru a izola și de a compara I/O performanță și de performanță de formare separat pentru cele 2 scenarii.
Cu alte cuvinte, pentru a măsura I/O de performanță (numai) aveți nevoie pentru a rula următoarele teste:

  1. Timp pentru a citi și a înlănțui 2-3 fișiere,
  2. Timp pentru a citi și a înlănțui 5 fișiere,
  3. Copia 5 fișiere în 1, și timp de citit din fuzionat fișier,
  4. Sau, link-ul de 5 fișiere de la 1 fișier, și de timp.

Și pentru a măsura viteza de antrenament (doar) de care aveți nevoie pentru a compara performanța pentru următoarele teste:

  • Merge 2-3 fișiere, apoi citiți și trenul de la fuzionat fișier.
  • Fuziona toate cele 5 fișiere, apoi citiți și tren din fuzionat fișier.
  • Sau, link-ul de 5 fișiere de la 1 fișier, apoi citiți și tren de fișier legat.

După cum sa menționat în comentariul meu, care fuzionează (sau conectarea) mai multe HDF5 fișiere într-un singur este ușor dacă toate seturile de date sunt la nivelul rădăcină și tot setul de date de nume sunt unice. Am adaugat link-ul extern metodă pentru că s-ar putea oferi aceeași performanță, fără duplicarea fișiere mari de date.

Mai jos este codul care arată ambele metode. Înlocui nume de fișiere în fnames lista, și ar trebui să fie gata pentru a rula. Dacă setul de date numele nu sunt unice, va trebui să creați un nume unic, și atribui în h5fr.copy() -- astfel: h5fr.copy(h5fr[ds],h5fw,'unique_dataset_name')

Cod pentru a merge-sau - link-ul de fișiere :
(/decomentează linii după caz)

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

După postarea de cod care copiază toate seturile de date să-1 dosar, mi-am dat seama că link-uri externe ar putea fi o soluție mai bună. Ei elimina duplicat copii ale datelor. Singura întrebare este de performanță. Codul pentru link-ul este aproape identic. Am modificat raspunsul meu și cod pentru a afișa ambele metode.
kcw78

În alte limbi

Această pagină este în alte limbi

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