I/O Problemi nel Caricamento di alcune Grandi H5PY File (Pytorch)

0

Domanda

Ho incontrato un problema!

Di recente ho incontrato un problema di I/O problema. Il target e i dati di input vengono memorizzati con h5py file. Ogni file di destinazione è di 2,6 GB , mentre ogni file di input è 10.2 GB. Ho 5 set di dati di input e di 5 target di set di dati in totale.

Ho creato un set di dati personalizzato per ogni funzione h5py file e quindi utilizzare i dati.ConcatDataset classe di collegare tutti i set di dati. Il set di dati personalizzato funzione è:

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

Allora io uso dataset_train = data.ConcatDataset([MydataSet(indx=index, train=True) for index in range(1, 6)]) per la formazione. Quando solo 2-3 h5py vengono utilizzati i file, la velocità di I/O è normale e tutto va per il verso giusto. Tuttavia, quando il 5 file vengono utilizzati, la velocità di allenamento, sta gradualmente diminuendo (5 iterazioni/s 1 iterazioni/s). Posso cambiare il num_worker e il problema esiste ancora.

Qualcuno potrebbe darmi una soluzione? Devo unire più h5py file in uno più grande? O altri metodi? Grazie in anticipo!

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

Migliore risposta

1

Il miglioramento delle prestazioni richiede tempi di parametri di riferimento. Per farlo è necessario identificare i potenziali colli di bottiglia e associati scenari. Hai detto "con 2-3 file la velocità di I/O è normale" e "5 quando vengono utilizzati i file, la velocità di allenamento diminuisce gradualmente". Così, è il tuo problema di prestazioni di I/O la velocità o la velocità di allenamento? O sai? Se non si conosce, è necessario isolare e confrontare le prestazioni di I/O e le prestazioni di addestramento separatamente per i 2 scenari.
In altre parole, per misurare le prestazioni di I/O (solo) è necessario eseguire le seguenti prove:

  1. Il tempo di leggere e concatenare 2-3 file,
  2. Il tempo di leggere e concatenare 5 file,
  3. Copiare il 5 file in 1, e l'ora di leggere il file unito,
  4. O, collegare i 5 file 1 file, e il tempo.

E per misurare la velocità di allenamento (solo) è necessario confrontare le prestazioni per le seguenti prove:

  • Unire 2-3 file, quindi leggere e treno da file unito.
  • Unire tutti e 5 i file, quindi leggere e treno dalla fusione di file.
  • O, collegare i 5 file 1 file, quindi leggere e treno da file collegato.

Come indicato nel mio commento, la fusione (o collegamento) più HDF5 in un unico file è facile se tutti i set di dati sono al livello principale e di tutti i set di dati nomi sono unici. Ho aggiunto il link esterno metodo, perché potrebbe fornire le stesse prestazioni, senza duplicazione di file dati di grandi dimensioni.

Di seguito è il codice che mostra entrambi i metodi. Sostituire i nomi di file in fnames elenco, e dovrebbe essere pronto per l'esecuzione. Se il set di dati i nomi non sono univoci, è necessario creare un unico nome, e di assegnare in h5fr.copy() -- come questo: h5fr.copy(h5fr[ds],h5fw,'unique_dataset_name')

Codice di unire -o - link file :
(commento/decommentare le linee, come più appropriato)

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

Dopo la pubblicazione del codice che le copie di tutti i set di dati a 1 file, ho capito che i link esterni potrebbe essere una soluzione migliore. Eliminare duplicati, le copie dei dati. L'unica domanda è la prestazione. Il codice per il collegamento è quasi identico. Ho modificato la mia risposta e il codice per mostrare entrambi i metodi.
kcw78

In altre lingue

Questa pagina è in altre lingue

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