Birkaç Büyük H5PY Dosyası Yüklenirken G / Ç Sorunları (Pytorch)

0

Soru

Bir sorunla karşılaştım!

Son zamanlarda bir G/Ç sorunu sorunuyla karşılaşıyorum. Hedef ve giriş verileri h5py dosyalarıyla saklanır. Her hedef dosya 2,6 GB, her giriş dosyası ise 10,2 gb'dir. Toplamda 5 giriş veri kümem ve 5 hedef veri kümem var.

Her h5py dosyası için özel bir veri kümesi işlevi oluşturdum ve sonra verileri kullandım.Tüm veri kümelerini bağlamak için ConcatDataset sınıfı. Özel veri kümesi işlevi şöyledir:

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

Sonra kullanırım dataset_train = data.ConcatDataset([MydataSet(indx=index, train=True) for index in range(1, 6)]) eğitim için. Yalnızca 2-3 h5py dosyası kullanıldığında, G / Ç hızı normaldir ve her şey yolunda gider. Ancak, 5 dosya kullanıldığında, eğitim hızı giderek azalmaktadır (5 yineleme/s ile 1 yineleme/s). Num_worker'ı değiştiriyorum ve sorun hala var.

Herkes bana bir çözüm verebilir mi? Birkaç h5py dosyasını daha büyük bir dosyaya birleştirmeli miyim? Ya da başka yöntemler? Şimdiden teşekkürler!

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

En iyi cevabı

1

Performansı artırmak zamanlama ölçütlerini gerektirir. Bunu yapmak için olası darboğazları ve ilişkili senaryoları tanımlamanız gerekir. "2-3 dosya ile G/Ç hızı normaldir" ve "5 dosya kullanıldığında eğitim hızı giderek azalır"dediniz. Yani, O hız, ya da hız eğitim/performans sorunu nedir? Ya da biliyor musunuz? Bilmiyorsanız, G/Ç performansını ve eğitim performansını 2 senaryo için ayrı ayrı ayırmanız ve karşılaştırmanız gerekir.
Başka bir deyişle, G / Ç performansını ölçmek için (yalnızca) aşağıdaki testleri çalıştırmanız gerekir:

  1. 2-3 Dosyayı okuma ve birleştirme zamanı,
  2. 5 Dosyayı okuma ve birleştirme zamanı,
  3. 5 Dosyayı 1'e kopyalayın ve birleştirilmiş dosyadan okunan zamanı,
  4. Veya 5 dosyayı 1 dosyaya ve zamana bağlayın.

Ve eğitim hızını ölçmek için (yalnızca) aşağıdaki testlerin performansını karşılaştırmanız gerekir:

  • 2-3 Dosyayı birleştirin, ardından birleştirilmiş dosyadan okuyun ve eğitin.
  • Tüm 5 dosyayı birleştirin, ardından birleştirilmiş dosyadan okuyun ve eğitin.
  • Veya 5 dosyayı 1 dosyaya bağlayın, ardından bağlantılı dosyadan okuyun ve eğitin.

Yorumumda belirtildiği gibi, tüm veri kümeleri kök düzeyindeyse ve tüm veri kümesi adları benzersizse, birden çok HDF5 dosyasını bir araya getirmek (veya bağlamak) kolaydır. Harici bağlantı yöntemini ekledim çünkü büyük veri dosyalarını çoğaltmadan aynı performansı sağlayabilir.

Her iki yöntemi gösteren kod aşağıdadır. Dosya adlarınızın yerine fnames listele ve çalışmaya hazır olmalı. Veri kümesi adlarınız benzersiz değilse, benzersiz adlar oluşturmanız ve atamanız gerekir h5fr.copy() -- bu gibi : h5fr.copy(h5fr[ds],h5fw,'unique_dataset_name')

Dosyaları birleştirmek veya bağlamak için kod :
(uygun şekilde açıklama / açıklama satırları)

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

Tüm veri kümelerini 1 dosyaya kopyalayan kod gönderdikten sonra, dış bağlantıların daha iyi bir çözüm olabileceğini fark ettim. Verilerin çoğaltılmış kopyalarını ortadan kaldırırlar. Tek soru performans. Bağlanacak kod hemen hemen aynıdır. Her iki yöntemi de göstermek için cevabımı ve kodu değiştirdim.
kcw78

Diğer dillerde

Bu sayfa diğer dillerde

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