Paralel G / Ç seçenekleri, özellikle paralel HDF5


20

Önemsiz olarak paralelleştirilebilen bir uygulamam var, ancak performansı büyük ölçüde G / Ç'ye bağlı. Uygulama, genellikle 2-5 GB boyutunda bir dosyada depolanan tek bir girdi dizisini okur (ancak bu sayının gelecekte büyümesini beklerim). Tipik bir hesaplama, aynı işlemi o dizinin her satırına veya sütununa uygular. CPU-ağır işlemler için yaklaşık 100 işlemciye kadar çok iyi ölçeklendirme yaparım, ancak daha yavaş işlemler için G / Ç ve ilgili iletişim (NFS erişimi) baskındır ve birkaç işlemciden daha fazlasını verimli bir şekilde kullanamam.

Böyle bir durum için verimli ve taşınabilir (ideal olarak taşınabilir) verimli seçenekler nelerdir? Paralel HDF5 umut verici görünüyor. Bununla ilgili gerçek yaşam deneyimi olan var mı?

MPI-I / O bakmaya değer bir şey olabilir mi? Belirli bir dosya düzeniyle verimli bir şekilde çalışabilir mi veya her şeyi uyarlamam gerekiyor mu?


4
Harika bir soru. Aynı problemimiz var ve ham çözümümüz, N işlemcileri için etki alanı ayrıştırılmış diziyi N dosyalarına / dosyalarından yazmak / okumaktır. Bunu gerçekten sevmiyorum, ama basit. Çeşitli kütüphane arayüzlerinin karmaşıklığını da ele alan cevapları görmek isterim ....
Yann

Diziyi işlemciler arasında nasıl dağıtıyorsunuz? Paralellik için şimdi ne kullanıyorsun? NFS üzerinden dosyalara bir iletişim biçimi olarak mı yazıyorsunuz?
Dan

2
Kodunuzu çok fazla yenilemeniz gerekmeyebilir; Bir kez böyle bir sorun vardı ve IO kaçınarak daha iyi bir hızlanma elde etmek mümkün oldu.
Dan

1
PBS veya Torque gibi bir kuyruk sistemi mi kullanıyorsunuz? Bu durumda, bir iş başladığında bir dosyayı bir dizine "yerleştirme" komutları vardır. Bir şeyleri belirgin bir şekilde hızlandıracak mı bilmiyorum, ama denemeye değer olabilir.
Dan

1
@ Dan: evet, PBS kullanıyorum ve dosyamı istediğim yere koymak için kullanabilirim. Ancak kümemde düğüm yerel diskleri olmadığından, paylaşılan bir NFS biriminden daha iyi bir şey yok.
khinsen

Yanıtlar:


6

Paralel G / Ç bu durumda size yardımcı olabilir, ancak dosyalarınızı sunmak için (doğal olarak oldukça seri) NFS kullanıyorsanız, istediğiniz tam etkiye sahip olmayacaktır - bir seri darboğaz olacaktır. dosya sunucusundan ve tek bir sunucudan istekte bulunan yüzlerce işleme sahip olmak size tek bir işlemle yüzlerce hızlanma faktörü vermeyecektir. Yine de, özellikle bir darboğaz yazmaktan ziyade okuyor gibi göründüğü için bir noktaya yardımcı olabilir ve sisteminiz tamamen paralel bir dosya sistemine yükseltilirse büyük bir gelişme olacaktır.

MPI-IO çok düşük seviyededir; paralel HDF5, NetCDF4 veya ADIOS ile "kaputun altında" neler olduğunu bilmek için bir şey anlamaya değer , ancak kendiniz kullanmak, yapının derleme zamanında iyi bilinen ham ikili veriler için çok uygundur. HDF5 ve NetCDF4 çok daha esnektir.

Verileriniz nispeten basitse (örneğin, büyük veri yapıları çoğunlukla n boyutlu diziler veya vektörler) - HDF5 yerine NetCDF4'ü (HDF5'e de paralel ve aynı zamanda paralel) öneririm; öyle ile anlamlı kullanımı daha basit. HDF5 daha karmaşıktır ve bu karmaşıklık karşılığında çok karmaşık veri modellerine izin verir. Ancak bu ihtiyacınız olmayan bir özellikse, NetCDF4'e başlamak daha hızlıdır.

Merkezimizde, temel kavramlar, MPI-IO, HDF5 ve NetCDF4 hakkında konuştuğumuz paralel I / O üzerinde öğleden sonra ve bir gün süren bir dersimiz var; slaytlar burada bulunabilir .


5

MPI / IO kullanarak vektörleri çıkarmak için ORNL'deki tüm XT6'ya kadar iyi ölçeklendirme elde ediyoruz. İşte kod . Birçok makine için G / Ç alt sistemleri büyük paralellik için tasarlanmamıştır, bu yüzden @Dan'ın sadece birkaç adımda veya başka bir toplama stratejisi yazarak GÇ'yi en aza indirmeye çalışacağımı düşünüyorum.

Esnek bir şekilde çıktıyı ölçeklenebilir bir şekilde yazarken , XDMF ile, düzeni tanımlamak için seri olarak yazılmış az miktarda XML kodu ile birlikte HDF5 (PETSc VecView gibi ) kullanılarak büyük paralel ikili yazmalardan etkilenebilen deneyime sahibim . Bu Paraview veya MayaVi2 gibi görselleştirme paketleri ile okunabilir . Bunu yapmanın başka bir yolu da VTK formatını ekteki ikili verilerle kullanmaktır, ancak bu, yazmak istediğiniz her şeyi bilmenizi gerektirir.


XDMF ilginç görünüyor, ancak XDMF'nin "ağır" veri olarak adlandırdığı şeye verimli bir şekilde erişmek yerine verileri düzenlemekle ilgilidir. Bu yön için ne kullanıyorsunuz?
khinsen

Sadece XDMF'yi HDF5'e işaret etmek için kullanıyoruz. Bu şekilde tüm ikili HDF5'i yazabilirsiniz, ancak çoğu görselleştirme motoru tarafından okunmasını sağlayabilirsiniz.
Matt Knepley

1

Ölçeklenebilirlik sorununuzun girdi ile değil çıktı ile ilgili olduğunu varsayıyorum. Paralel giriş oldukça basittir - yaptığım her CPU giriş NetCDF dosyasını açar ve dizinin döşemesine ait kısmını okur (kaç okuyucunun aynı NetCDF dosyasını açabileceğine dair bir sınır olabilir ama emin değilim) ). Paralel çıktı daha problemlidir.

Şu anda yaptığım şey oldukça uygun değil, ama şimdilik çalışıyor. Her şeyi tek bir CPU'da topluyorum ve seri çıkışı yapıyorum. Bu arada, diğer oyuncular yazarın bitmesini bekler. Bu benim için iyi çalıştı çünkü çıktı oranı üzerindeki hesaplamayı oldukça yüksek tutmayı başardım - bu yüzden ölçeklenebilirlik 200'den fazla CPU için iyi olurdu. Ama aradığınız çözüm bu değil.

Başka bir çözüm, Yann'ın önerdiği şeydir - N dosyalarına seri olarak yazın ve bir drone CPU'nun karoları tek parçaya birleştirmesini sağlayın - RAM izin veriyorsa.

Önceki yanıtlarda önerilen paralel G / Ç kitaplıklarının yanı sıra, NetCDF ve MPI ile zaten rahat olduğunuz için Paralel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf'ye de bakmak isteyebilirsiniz . Pratikte kullanmadım, ancak toplama + seri I / O ile duvara çarptığımda bu yönde gitmeyi planlıyorum.


Ölçeklenebilirlik sorunumu oluşturan girdi. Birçok düğümden gelen tüm isteklerin NFS sunucusunu aşırı yüklediğini, ancak bu hipotezi nasıl doğrulayacağımı bilmiyorum.
khinsen

@khinsen Hipotezinizi test etmek için yapabileceğiniz şey, az sayıda CPU ile dosyayı okumak, 1 ile 8 arasında ve verileri geri kalanına dağıtmaktır. Profil oluşturma işlemini yapın, G / Ç için ne kadar zaman harcadığınızı ve dağılım için ne kadar zaman harcadığınızı görün. CPU okuyucularının sayısını değiştirin ve size en iyi performansı neyin verdiğini görün.
milancurcic

İyi öneri! Bu biraz işe yarayacaktır çünkü kodun yeniden yazılması anlamına gelir, ancak muhtemelen buna değer.
khinsen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.