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ý
..................................................................................................................