I/O问题在加载多大的H5PY文件(Pytorch)

0

的问题

我遇到了一个问题!

最近,我遇到一个问题的I/O问题。 目标和输入数据储存与h5py文件。 每个目标的文件是 2.6GB 虽然每个文件输入是 10.2GB. 我有5输入数据集和5个目标的数据集。

我创建了一个自定义功能的数据集每个h5py文件,然后使用 数据。ConcatDataset 类链接所有数据集。 该数据集定义功能是:

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

然后我用 dataset_train = data.ConcatDataset([MydataSet(indx=index, train=True) for index in range(1, 6)]) 培训。 当时只有2-3h5py文件的使用,I/O速度是正常的,一切顺利的权利。 然而,在5个文件使用的培训速度逐渐减少(5次迭代/s1迭代/s)。 我改变num_worker和问题仍然存在。

任何人都可以给我一个解决方案? 我应该合并几个h5py文件纳入一个更大的? 或其他的方法吗? 在此先感谢!

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

最好的答案

1

改善性能需要时间基准。 这样做,你需要查明潜在的瓶颈问题和相关的方案。 你说的"有2-3文件I/O速度是正常"和"时5的文件使用的培训速度逐渐减少". 那么,是你的表现问题I/O速度或培训的速度? 或者你知道吗? 如果你不知道,你需要隔离和比较I/O性能和培训,业绩分别为2方案。
换句话说,来衡量I/O绩(仅)需要运行如下试验:

  1. 时间阅读和将2-3的文件,
  2. 时间阅读和连接5的文件,
  3. 复制了5个文件为1时,及时读的合并文件,
  4. 或者,链接的5的文件1的文件和时间。

和测量培训速度(仅)需要比较绩效的以下试验:

  • 合并的2-3的文件,然后阅读和火车从合并的文件。
  • 合并的所有5个文件,然后阅读和火车从合并的文件。
  • 或者,链接的5的文件1的文件,然后阅读和火车从联的文件。

正如在我的评论,合并(或链接)多HDF5文件合并成一个很容易,如果所有数据集是根级别和所有数据集名称都是独一无二的。 我加入外部链接的方法,因为它可能提供相同性能,在不重复大型数据文件。

下面是代码,显示这两种方法。 代替你的文件名 fnames 列表,并应该准备运行。 如果数据集名称并不独特,你将需要创建独特的名字,并且分配在 h5fr.copy() --像这样: h5fr.copy(h5fr[ds],h5fw,'unique_dataset_name')

代码合并或链接的文件:
(评论/注释的线条如适当)

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

之后,张贴的代码复制所有的数据集1文件时,我意识到,外部的链接可能是一个更好的解决方案。 他们消除重复的副本的数据。 唯一的问题是性能。 代码链接是几乎完全相同。 我修改了我的回答,代码,以表明这两种方法。
kcw78

其他语言

此页面有其他语言版本

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