パラレルI / Oオプション、特にパラレルHDF5


20

簡単に並列化できるアプリケーションがありますが、そのパフォーマンスは大部分がI / Oバウンドです。アプリケーションは、通常2〜5 GBのサイズのファイルに格納されている単一の入力配列を読み取ります(ただし、この数値は将来的に増加する予定です)。典型的な計算では、その配列の各行または列に同じ操作が適用されます。CPUを大量に使用する操作では、約100プロセッサまで非常に優れたスケーリングが得られますが、遅い操作ではI / Oおよび関連する通信(NFSアクセス)が支配的であり、少数のプロセッサしか効率的に使用できません。

そのような状況で効率的でポータブルな(理想的には移植性の高い)オプションは何ですか?並列HDF5は有望なようです。誰かがそれを実際に体験したことがありますか?

MPI-I / Oは検討する価値があるでしょうか?特定のファイルレイアウトで効率的に動作することはできますか、それともすべてを適応させる必要がありますか?


4
いい質問ですね。同じ問題があり、粗雑な解決策は、N個のプロセッサに対して、ドメイン分解された配列をN個のファイルに読み書きすることです。これはあまり好きではありませんが、簡単です。私は....また、各種ライブラリ・インタフェースの複雑さに対処答えを見に興味がある
ヤン

プロセッサー間でアレイをどのように分散していますか?現在、並列処理に何を使用していますか?通信形式としてNFS経由でファイルに書き込みますか?
ダン

2
コードをあまり作り直す必要はないかもしれません。かつてこのような問題が発生しましたが、IOを最適化するよりも高速化することができました。
ダン

1
PBSやTorqueなどのキューシステムを使用していますか?その場合、ジョブの開始時にあるディレクトリにファイルを「ステージイン」するコマンドがあります。著しく高速化するかどうかはわかりませんが、一見の価値はあります。
ダン

1
@Dan:はい、PBSを使用しています。PBSを使用して、必要な場所にファイルを配置できます。ただし、クラスターにはノードローカルディスクがないため、共有NFSボリュームに勝るものはありません。
khinsen

回答:


6

この場合、パラレルI / Oが役立ちますが、ファイルを提供するために(本質的にかなりシリアルな)NFSを使用している場合、必要な効果が完全には得られません-シリアルボトルネックが発生しますファイルサーバーと単一のサーバーのリクエストを行う数百のプロセスを持つことは、単一のプロセスを介してそれを行うことの何百ものスピードアップの要因を提供するつもりはありません。それでも、特にボトルネックが書き込みではなく読み取りであるように聞こえるので、ある程度役立ちます。また、システムを完全な並列ファイルシステムにアップグレードすると、大きな改善になります。

MPI-IOは非常に低レベルです。並列HDF5、NetCDF4、またはADIOSで「内部」で何が起こっているかを知るために、それについて何かを理解する価値があります。HDF5とNetCDF4ははるかに柔軟性があります。

データが比較的単純な場合(たとえば、ビッグデータ構造が主にn次元の配列またはベクトルである場合)、HDF5ではなくNetCDF4(これも並列で、HDF5に基づいています)をお勧めします。使用するのが非常に簡単です。HDF5はより複雑であり、その複雑さと引き換えに、非常に複雑なデータモデルを使用できます。しかし、それがあなたが必要としない機能であるなら、NetCDF4で始めるのはより速いです。

私たちのセンターでは、MPI-IO、HDF5、およびNetCDF4の基本概念について説明する午後と1日の並列I / Oクラスがあります。スライドはここにあります


5

ORIでは、MPI / IOを使用してベクトルを出力することにより、XT6全体に適切にスケールアップできます。これがコードです。多くのマシンのI / Oサブシステムは大規模な並列処理用に設計されていないので、@ Danは正しいと思います。@ Danは、数ステップごと、または他の凝集戦略を書くだけでIOを最小化しようとするでしょう。

スケーラブルな方法で柔軟に出力を書き込む限り、XDMFの経験があります。これは、HDF5(PETSc VecViewのような)と、レイアウトを記述するためにシリアルで記述された少量のXMLコードを使用した大規模な並列バイナリ書き込みの影響を受けます。これは、ParaviewMayaVi2などの視覚化パッケージで読み取ることができます。これを行うもう1つの方法は、バイナリデータを追加したVTK形式を使用することですが、これには事前に書きたいことをすべて知っている必要があります。


XDMFは面白そうに見えますが、XDMFが「重い」データと呼ぶものに効率的にアクセスすることではなく、データを整理することです。その側面に何を使用しますか?
khinsen

XDMFを使用してHDF5を指すようにします。そうすれば、すべてのバイナリHDF5を作成できますが、ほとんどの視覚化エンジンで読み取れます。
マットネプリー

1

スケーラビリティの問題は、入力ではなく出力に関係していると思います。並列入力はかなり単純です-各CPUが入力NetCDFファイルを開き、そのタイルに属する配列の一部を読み取ります(同じNetCDFファイルを開くことができるリーダーの数に制限があるかもしれませんが、わかりません) )。パラレル出力には問題があります。

私が現在していることは、最適ではありませんが、今のところはうまくいきます。1つのCPUですべてを収集し、シリアル出力を行います。それまでの間、他のプレイヤーはライターが終了するのを待ちます。出力比に対する計算を非常に高く保つことができたので、これは私にとってはうまくいきました。したがって、スケーラビリティは200を超えるCPUに対しても良いでしょう。しかし、これはあなたが探している解決策ではありません。

別の解決策は、Yannが提案したものです-RAMで許可されている場合、Nファイルに連続して書き込み、ドローンCPUでタイルを1つに組み立てます。

以前の回答で提案された並列I / Oライブラリとは別に、NetCDFとMPIに慣れているため、Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdfを調べることもできます。実際には使用しませんでしたが、ギャザリング+シリアルI / Oで壁にぶつかったときにその方向に進む予定です。


スケーラビリティの問題を引き起こすのは入力です。多くのノードからのすべての着信要求がNFSサーバーに過負荷をかけていると思いますが、この仮説を検証する方法がわかりません。
khinsen

@khinsen仮説をテストするためにできることは、少数のCPU(たとえば1〜8)でファイルを読み取り、データを残りに分散させることです。プロファイリングを行い、I / Oに費やす時間と分散に費やす時間を確認します。CPUリーダーの数を変えて、最高のパフォーマンスが得られるものを確認します。
ミラノ語

良い提案!これはコードを書き換えることを意味するため、ある程度の作業になりますが、おそらく価値があるでしょう。
khinsen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.