Opsi I / O paralel, khususnya HDF5 paralel

20

Saya memiliki aplikasi yang dapat diparalelkan secara sepele tetapi kinerjanya sebagian besar terikat I / O. Aplikasi membaca larik input tunggal yang disimpan dalam file yang biasanya berukuran 2-5 GB (tapi saya berharap angka ini bertambah di masa mendatang). Perhitungan tipikal berlaku operasi yang sama untuk setiap baris atau kolom array itu. Untuk operasi CPU-berat, saya mendapatkan skala yang sangat baik hingga sekitar 100 prosesor, tetapi untuk operasi lebih lambat I / O dan komunikasi terkait (akses NFS) mendominasi dan saya tidak dapat menggunakan lebih dari beberapa prosesor secara efisien.

Apa opsi yang efisien dan portabel (idealnya efisien portable) untuk situasi seperti itu? HDF5 paralel tampaknya menjanjikan. Apakah ada yang punya pengalaman nyata dengan itu?

Apakah MPI-I / O akan menjadi sesuatu yang layak untuk dilihat? Bisakah ini bekerja secara efisien dengan tata letak file yang diberikan, atau apakah saya harus menyesuaikan semuanya?

khinsen
sumber
4
Pertanyaan bagus Kami memiliki masalah yang sama, dan solusi kasar kami adalah menulis / membaca larik dekomposisi domain ke / dari file N, untuk prosesor N. Saya tidak begitu suka ini, tetapi sederhana. Saya akan tertarik melihat jawaban yang juga membahas kompleksitas berbagai antarmuka perpustakaan ....
Yann
Bagaimana Anda mendistribusikan array di seluruh prosesor? Apa yang Anda gunakan untuk paralelisme sekarang? Apakah Anda menulis ke file melalui NFS sebagai bentuk komunikasi?
Dan
2
Anda mungkin tidak perlu mengerjakan ulang kode Anda terlalu banyak; Saya punya masalah seperti ini sekali dan bisa mendapatkan speedup yang lebih baik menghindari IO daripada mengoptimalkannya.
Dan
1
Apakah Anda menggunakan sistem antrian seperti PBS atau Torque? Jika demikian, ada perintah untuk "memasukkan" file ke beberapa direktori saat pekerjaan dimulai. Saya tidak tahu apakah itu akan mempercepat segalanya, tetapi mungkin layak dicoba.
Dan
1
@Dan: ya, saya menggunakan PBS, dan saya bisa menggunakannya untuk meletakkan file saya di mana pun saya mau. Tetapi karena cluster saya tidak memiliki disk node-lokal, tidak ada yang lebih baik daripada volume NFS bersama.
khinsen

Jawaban:

6

I / O paralel dapat membantu Anda dalam hal ini, tetapi jika Anda menggunakan NFS (pada dasarnya serial) untuk melayani file Anda, maka itu tidak akan memiliki efek penuh yang Anda inginkan - akan ada hambatan serial di fileserver dan memiliki ratusan proses membuat permintaan dari server tunggal tidak akan memberi Anda faktor percepatan ratusan melakukannya melalui satu proses tunggal. Namun, ini bisa membantu sampai titik tertentu, terutama karena sepertinya hambatannya adalah membaca daripada menulis, dan itu akan menjadi peningkatan besar jika sistem Anda ditingkatkan ke sistem file yang sepenuhnya paralel.

MPI-IO adalah level yang sangat rendah; ada baiknya memahami sesuatu tentang hal itu untuk mengetahui apa yang terjadi "di balik tenda" dengan paralel HDF5, NetCDF4 , atau ADIOS , tetapi menggunakannya sendiri benar-benar hanya cocok untuk data biner mentah di mana struktur tersebut dikenal pada saat kompilasi. HDF5 dan NetCDF4 jauh lebih fleksibel.

Perhatikan bahwa jika data Anda relatif sederhana - misalnya, struktur data besar terutama array atau vektor n-dimensi - saya sarankan NetCDF4 (yang juga paralel, dan berdasarkan HDF5) daripada HDF5; itu cukup nyata mudah untuk digunakan. HDF5 lebih rumit, dan sebagai gantinya kompleksitas memungkinkan model data yang sangat rumit. Tetapi jika itu fitur yang tidak Anda butuhkan, lebih cepat untuk memulai di NetCDF4.

Di pusat kami, kami memiliki kelas sore dan satu hari panjang pada I / O paralel di mana kami berbicara tentang konsep dasar, MPI-IO, HDF5, dan NetCDF4; slide dapat ditemukan di sini .


sumber
5

Kami mendapatkan peningkatan yang baik ke seluruh XT6 di ORNL menggunakan MPI / IO untuk vektor keluaran. Ini kodenya . Subsistem I / O untuk banyak mesin tidak dirancang untuk paralelisme masif, jadi saya pikir @Dan benar bahwa saya akan mencoba untuk meminimalkan IO dengan hanya menulis setiap beberapa langkah, atau beberapa strategi aglomerasi lainnya.

Sejauh menulis output secara fleksibel dengan cara yang dapat diskalakan, saya memiliki pengalaman dengan XDMF , yang dapat dipengaruhi oleh penulisan biner paralel besar menggunakan HDF5 (seperti PETSc VecView ) ditambah dengan sejumlah kecil kode XML yang ditulis secara serial untuk menggambarkan tata letak. Ini dapat dibaca oleh paket visualisasi seperti Paraview atau MayaVi2 . Cara lain untuk melakukan ini adalah menggunakan format VTK dengan data biner yang ditambahkan, namun ini mengharuskan Anda tahu semua yang ingin Anda tulis di muka.

Matt Knepley
sumber
XDMF terlihat menarik, tetapi ini tentang mengatur data dan bukan tentang mengakses secara efisien apa yang disebut XDMF sebagai data "berat". Apa yang Anda gunakan untuk aspek itu?
khinsen
Kami hanya menggunakan XDMF untuk menunjuk ke HDF5. Dengan begitu Anda dapat menulis semua HDF5 biner, tetapi membacanya oleh sebagian besar mesin visualisasi.
Matt Knepley
1

Saya berasumsi masalah skalabilitas Anda terkait dengan output, dan bukan input. Input paralel agak sederhana - apa yang saya lakukan adalah setiap CPU membuka input file NetCDF dan membaca bagian array milik tile-nya (mungkin ada batasan berapa banyak pembaca yang bisa membuka file NetCDF yang sama tapi saya tidak yakin ). Output paralel lebih bermasalah.

Apa yang saya lakukan saat ini tidak cukup optimal, tetapi bekerja untuk saat ini. Saya mengumpulkan semuanya pada satu CPU dan melakukan keluaran serial. Sementara itu, pemain lain menunggu sampai penulis selesai. Ini bekerja dengan baik untuk saya karena saya berhasil menjaga perhitungan rasio keluaran cukup tinggi - jadi skalabilitas akan lebih baik untuk lebih dari 200 CPU. Tapi ini bukan solusi yang Anda cari.

Solusi lain adalah apa yang disarankan Yann - menulis serial ke file N dan memiliki CPU drone merakit ubin menjadi satu bagian - jika RAM memungkinkan.

Terlepas dari pustaka I / O paralel yang disarankan dalam jawaban sebelumnya, Anda mungkin juga ingin melihat ke Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf , karena Anda sudah terbiasa dengan NetCDF dan MPI. Saya tidak menggunakannya dalam latihan, tetapi berencana untuk pergi ke arah itu ketika saya menabrak dinding dengan mengumpulkan + serial I / O.

milancurik
sumber
Masukan yang membuat masalah skalabilitas saya. Saya mengira bahwa semua permintaan yang masuk dari banyak node membebani server NFS, tetapi saya tidak tahu bagaimana memverifikasi hipotesis ini.
khinsen
@khinsen Apa yang dapat Anda lakukan untuk menguji hipotesis Anda adalah membaca file dengan sejumlah kecil CPU, katakanlah antara 1 dan 8, dan sebarkan data ke yang lainnya. Lakukan profiling, lihat berapa banyak waktu yang Anda habiskan untuk I / O dan berapa banyak pada pencar. Variasikan jumlah pembaca CPU dan lihat apa yang memberi Anda kinerja terbaik.
milancurik
Saran yang bagus! Ini akan menjadi pekerjaan karena itu berarti menulis ulang kode, tetapi mungkin layak.
khinsen