병렬 I / O 옵션, 특히 병렬 HDF5


20

사소하게 병렬화 할 수있는 응용 프로그램이 있지만 성능은 I / O 범위가 큽니다. 응용 프로그램은 일반적으로 크기가 2-5GB 인 파일에 저장된 단일 입력 배열을 읽습니다 (그러나이 숫자는 나중에 커질 것으로 예상합니다). 일반적인 계산은 해당 배열의 각 행 또는 열에 동일한 작업을 적용합니다. CPU를 많이 사용하는 작업의 경우 최대 약 100 개의 프로세서로 확장 할 수 있지만 속도가 느린 작업의 경우 I / O 및 관련 통신 (NFS 액세스)이 지배적이며 몇 개 이상의 프로세서를 효율적으로 사용할 수 없습니다.

이러한 상황에서 효율적이고 이식 가능한 (이상적으로 이식 가능) 옵션은 무엇입니까? Parallel HDF5가 유망한 것 같습니다. 누구든지 실제 경험이 있습니까?

MPI-I / O가 조사 할만한 가치가 있습니까? 주어진 파일 레이아웃으로 효율적으로 작동합니까, 아니면 모든 것을 조정해야합니까?


4
좋은 질문입니다. 우리도 같은 문제를 가지고 있으며, 우리의 원유 솔루션은 N 개의 프로세서에 대해 N 개의 파일에 대해 도메인 분해 어레이를 쓰거나 읽는 것입니다. 나는 이것을 정말로 좋아하지 않지만 간단합니다. 다양한 라이브러리 인터페이스의 복잡성을 해결하는 답변을 보는 데 관심이 있습니다 ....
Yann

프로세서에서 어레이를 어떻게 분배합니까? 이제 병렬 처리에 무엇을 사용하고 있습니까? 통신 형식으로 NFS를 통해 파일에 쓰고 있습니까?
Dan

2
코드를 많이 재 작업하지 않아도됩니다. 나는 한 번 이런 문제가 있었고 그것을 최적화하는 것보다 IO를 피하는 것이 더 빨라졌습니다.
Dan

1
PBS 또는 Torque와 같은 대기열 시스템을 사용하고 있습니까? 그렇다면, 작업이 시작될 때 파일을 일부 디렉토리에 "스테이지 인"하는 명령이 있습니다. 속도가 눈에 띄게 빨라질 지 모르겠지만 기회가 될 수도 있습니다.
Dan

1
@ Dan : 예, PBS를 사용하며 원하는 위치에 파일을 넣을 수 있습니다. 그러나 클러스터에 노드 로컬 디스크가 없기 때문에 공유 NFS 볼륨보다 좋은 것은 없습니다.
khinsen

답변:


6

이 경우 병렬 I / O가 도움이 될 수 있지만 파일을 제공하기 위해 (고유의 시리얼) NFS를 사용하는 경우 원하는 효과를 얻지 못할 것입니다. 파일 서버와 단일 서버를 요청하는 수백 개의 프로세스가 있다고해서 단일 프로세스를 통해 수백 개의 프로세스 속도를 높일 수는 없습니다. 아직도, 그것은 병목처럼 소리가 난다 특히 이후 지점으로 도움이 될 수 읽기 쓰기보다는, 당신의 시스템이 완전히 병렬 파일 시스템으로 업그레이드됩니다 경우 큰 개선이 될 것입니다.

MPI-IO는 매우 저수준입니다. 병렬 HDF5, NetCDF4 또는 ADIOS 와 함께 "후드"에서 무슨 일이 일어나고 있는지 알기 위해 그것에 대해 무언가를 이해할 가치가 있지만, 직접 사용하는 것은 컴파일 타임에 구조가 잘 알려진 원시 이진 데이터에만 적합합니다. HDF5 및 NetCDF4는 훨씬 더 유연합니다.

데이터가 비교적 단순하다면 (예를 들어, 큰 데이터 구조가 주로 n 차원 배열 또는 벡터 인 경우) HDF5 대신 NetCDF4 (HDF5를 기반으로하는 병렬)를 권장합니다. 사용이 매우 간단합니다. HDF5는 더 복잡하며, 그 복잡성으로 인해 매우 복잡한 데이터 모델이 허용됩니다. 그러나 이것이 필요하지 않은 기능이라면 NetCDF4를 시작하는 것이 더 빠릅니다.

우리 센터에는 병렬 I / O에 대한 오후 및 하루 종일 수업이 있으며 기본 개념 인 MPI-IO, HDF5 및 NetCDF4에 대해 이야기합니다. 슬라이드는 여기 에서 찾을 수 있습니다 .


5

우리는 벡터를 출력하기 위해 MPI / IO를 사용하여 ORNL에서 전체 XT6까지 확장 할 수 있습니다. 코드 는 다음과 같습니다 . 많은 컴퓨터의 I / O 하위 시스템은 대규모 병렬 처리를 위해 설계되지 않았으므로 @Dan은 몇 단계마다 또는 다른 응집 전략을 작성하여 IO를 최소화하려고 시도하는 것이 옳다고 생각합니다.

확장 가능한 방식으로 출력을 유연하게 작성 하는 한, 레이아웃을 설명하기 위해 직렬로 작성된 소량의 XML 코드와 결합 된 HDF5 (예 : PETSc VecView )를 사용하여 큰 병렬 이진 쓰기 로 인해 XDMF에 대한 경험 이 있습니다 . 이것은 Paraview 또는 MayaVi2 와 같은 시각화 패키지로 읽을 수 있습니다 . 이 작업을 수행하는 또 다른 방법은 이진 데이터가 추가 된 VTK 형식을 사용하는 것이지만, 먼저 작성하고자하는 모든 것을 알고 있어야합니다.


XDMF는 흥미롭게 보이지만 XDMF에서 "무거운"데이터에 효율적으로 액세스하는 것이 아니라 데이터를 구성하는 것입니다. 그 부분에 무엇을 사용하십니까?
khinsen

XDMF를 사용하여 HDF5를 가리 킵니다. 그렇게하면 모든 이진 HDF5를 쓸 수 있지만 대부분의 시각화 엔진에서 읽을 수 있습니다.
Matt Knepley

1

확장 성 문제는 출력이 아니라 입력과 관련이 있다고 가정합니다. 병렬 입력은 다소 간단합니다. 각 CPU는 입력 NetCDF 파일을 열고 해당 타일에 속하는 배열 부분을 읽습니다 (동일한 NetCDF 파일을 열 수있는 독자 수에는 제한이있을 수 있지만 확실하지 않습니다) ). 병렬 출력이 더 문제가됩니다.

내가 현재하고있는 것은 아주 최적은 아니지만 지금은 효과가 있습니다. 하나의 CPU에서 모든 것을 수집하고 직렬 출력을 수행합니다. 그 동안 다른 플레이어는 작가가 끝나기를 기다립니다. 출력 비율에 대한 계산 비율을 상당히 높게 유지했기 때문에 잘 작동하므로 200 개가 넘는 CPU에 확장 성이 좋습니다. 그러나 이것은 당신이 찾고있는 해결책이 아닙니다.

RAM이 허용하는 경우 다른 해결책은 Yann이 제안한 것입니다-N 파일에 직렬로 쓰고 드론 CPU가 타일을 한 조각으로 조립합니다.

이전 답변에서 제안 된 병렬 I / O 라이브러리 외에도 NetCDF 및 MPI에 익숙하기 때문에 Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf를 참조하십시오 . 실제로 사용하지는 않았지만 + 직렬 I / O를 수집하여 벽을 칠 때 그 방향으로 나아갈 계획입니다.


확장 성 문제를 일으키는 입력입니다. 많은 노드에서 들어오는 모든 요청이 NFS 서버를 오버로드한다고 가정하지만이 가설을 검증하는 방법을 모르겠습니다.
khinsen

@khinsen 가설을 테스트하기 위해 할 수있는 일은 1에서 8 사이의 적은 수의 CPU로 파일을 읽고 나머지 데이터를 분산시키는 것입니다. 프로파일 링을 수행하고, I / O에 소요되는 시간과 분산에 소요되는 시간을 확인하십시오. CPU 리더의 수를 다양하게 변경하고 최상의 성능을 제공하는 기능을 확인하십시오.
milancurcic

좋은 제안! 코드를 다시 작성한다는 의미이므로 약간의 효과가 있지만 아마도 그만한 가치가 있습니다.
khinsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.