ตัวเลือก Parallel I / O โดยเฉพาะ HDF5 แบบขนาน


20

ฉันมีแอปพลิเคชันที่สามารถทำให้ขนานกันเล็กน้อย แต่ประสิทธิภาพของมันคือขอบเขต I / O ขนาดใหญ่ แอปพลิเคชันอ่านอาร์เรย์อินพุตเดียวที่เก็บอยู่ในไฟล์ที่โดยทั่วไปมีขนาด 2-5 GB (แต่ฉันคาดว่าจำนวนนี้จะเพิ่มขึ้นในอนาคต) การคำนวณทั่วไปใช้การดำเนินการเดียวกันกับแต่ละแถวหรือคอลัมน์ของอาร์เรย์นั้น สำหรับการทำงานหนักของ CPU ฉันได้รับการปรับขนาดที่ดีมากถึงโปรเซสเซอร์ 100 ตัว แต่สำหรับการดำเนินการที่ช้าลง I / O และการสื่อสารที่เกี่ยวข้อง (การเข้าถึง NFS) นั้นครองและฉันไม่สามารถใช้ตัวประมวลผลได้อย่างมีประสิทธิภาพ

ตัวเลือกใดที่มีประสิทธิภาพและพกพา (มีประสิทธิภาพในการพกพา) สำหรับสถานการณ์เช่นนี้? Parallel HDF5 ดูเหมือนว่าจะมีแนวโน้ม ไม่มีใครมีประสบการณ์ชีวิตจริงกับมันหรือไม่?

MPI-I / O จะเป็นสิ่งที่ควรพิจารณาหรือไม่ มันสามารถทำงานได้อย่างมีประสิทธิภาพกับรูปแบบไฟล์ที่กำหนดหรือฉันต้องปรับทุกอย่าง?


4
เป็นคำถามที่ดีมาก เรามีปัญหาเดียวกันและวิธีแก้ปัญหาอย่างคร่าว ๆ ของเราคือการเขียน / อ่านโดเมนที่ได้รับการแบ่งแยกไปยัง / จากไฟล์ N สำหรับโปรเซสเซอร์ N ฉันไม่ชอบสิ่งนี้ แต่มันง่าย ฉันจะสนใจในการมองเห็นคำตอบที่ยังอยู่ที่ความซับซ้อนของอินเตอร์เฟซห้องสมุดต่างๆ ....
Yann

คุณกระจายอาเรย์ทั่วทั้งโปรเซสเซอร์อย่างไร? ตอนนี้คุณใช้อะไรเพื่อความเท่าเทียม คุณกำลังเขียนไฟล์ไปยัง NFS ในรูปแบบของการสื่อสารหรือไม่?
Dan

2
คุณอาจไม่ต้องทำงานซ้ำรหัสของคุณมากนัก ฉันมีปัญหาเช่นนี้เพียงครั้งเดียวและสามารถเพิ่มความเร็วในการหลีกเลี่ยง IO ได้ดีกว่าการปรับให้เหมาะสม
Dan

1
คุณใช้ระบบคิวเช่น PBS หรือ Torque หรือไม่? ถ้าเป็นเช่นนั้นมีคำสั่งให้ "สเตจอิน" ไฟล์ไปยังบางไดเร็กทอรีเมื่องานเริ่ม ฉันไม่รู้ว่ามันจะเร่งความเร็วของสิ่งต่าง ๆ อย่างเห็นได้ชัดหรือไม่ แต่มันก็คุ้มค่ากับการยิง
ด่าน

1
@ แดน: ใช่ฉันใช้ PBS และฉันสามารถใช้มันเพื่อวางไฟล์ของฉันได้ทุกที่ที่ต้องการ แต่เนื่องจากคลัสเตอร์ของฉันไม่มีดิสก์โหนดท้องถิ่นจึงไม่มีอะไรดีไปกว่าไดรฟ์ข้อมูล NFS ที่ใช้ร่วมกัน
khinsen

คำตอบ:


6

I / O แบบขนานสามารถช่วยคุณได้ในกรณีนี้ แต่ถ้าคุณใช้ (NFS แบบสวย ๆ ) เพื่อให้บริการไฟล์ของคุณมันจะไม่ส่งผลเต็มรูปแบบที่คุณอาจต้องการ - จะมีคอขวดแบบอนุกรมที่ fileserver และการมีหลายร้อยโพรเซสที่ทำการร้องขอของเซิร์ฟเวอร์เดียวจะไม่ให้ปัจจัยหลายร้อยสปีดอัพในการทำมันผ่านกระบวนการเดียว ถึงกระนั้นก็อาจช่วยได้โดยเฉพาะอย่างยิ่งเนื่องจากดูเหมือนว่าคอขวดกำลังอ่านมากกว่าการเขียนและมันจะเป็นการปรับปรุงที่ยิ่งใหญ่หากระบบของคุณได้รับการอัพเกรดเป็นระบบไฟล์แบบขนานอย่างสมบูรณ์

MPI-IO นั้นต่ำมาก มันเป็นสิ่งที่เข้าใจมูลค่าประมาณมันจะรู้ว่าสิ่งที่เกิดขึ้น "ภายใต้ประทุน" กับ HDF5 ขนานNetCDF4หรือADIOSแต่ใช้มันด้วยตัวคุณเองที่เป็นจริงเท่านั้นเหมาะดีสำหรับข้อมูลไบนารีดิบที่โครงสร้างเป็นที่รู้จักกันดีที่รวบรวมเวลา HDF5 และ NetCDF4 นั้นมีความยืดหยุ่นมากกว่า

โปรดทราบว่าหากข้อมูลของคุณค่อนข้างง่าย - เช่นโครงสร้างข้อมูลขนาดใหญ่ส่วนใหญ่เป็นอาร์เรย์ n-dimension หรือเวกเตอร์ - ฉันขอแนะนำ NetCDF4 (ซึ่งเป็นแบบคู่ขนานและยึดตาม HDF5) มากกว่า HDF5 มันเป็นsiginificantlyง่ายในการใช้งาน HDF5 มีความซับซ้อนมากขึ้นและในการแลกเปลี่ยนกับความซับซ้อนนั้นทำให้แบบจำลองข้อมูลที่ซับซ้อนมาก แต่ถ้าเป็นคุณสมบัติที่คุณไม่ต้องการจะเป็นการเริ่มต้นที่ NetCDF4 เร็วขึ้น

ที่ศูนย์ของเราเรามีชั้นเรียนช่วงบ่ายและช่วงกลางวันบน I / O ขนานที่เราพูดถึงแนวคิดพื้นฐาน MPI-IO, HDF5 และ NetCDF4; ภาพนิ่งที่สามารถพบได้ที่นี่


5

เราได้รับการปรับขนาดให้ดีขึ้นจนถึง XT6 ทั้งหมดที่ ORNL โดยใช้ MPI / IO เพื่อเอาท์พุทเวกเตอร์ นี่คือรหัส ระบบย่อย I / O สำหรับเครื่องหลายเครื่องไม่ได้ออกแบบมาสำหรับการขนานขนาดใหญ่ดังนั้นฉันคิดว่า @Dan นั้นถูกต้องที่ฉันจะพยายามลด IO ลงโดยการเขียนทุก ๆ สองสามก้าวเท่านั้นหรือกลยุทธ์การรวมตัวกันอื่น ๆ

เท่าที่การเขียนผลลัพธ์ที่ยืดหยุ่นในแบบที่ปรับขนาดได้ฉันมีประสบการณ์กับXDMFซึ่งสามารถได้รับผลกระทบจากการเขียนไบนารีแบบขนานขนาดใหญ่โดยใช้ HDF5 (เช่น PETSc VecView ) ควบคู่กับโค้ด XML จำนวนเล็กน้อยที่เขียนในอนุกรมเพื่ออธิบายโครงร่าง นี้สามารถอ่านได้โดยแพคเกจการสร้างภาพเหมือนParaviewหรือMayaVi2 อีกวิธีในการทำเช่นนี้คือใช้รูปแบบ VTK พร้อมกับข้อมูลไบนารีต่อท้ายอย่างไรก็ตามสิ่งนี้ต้องการให้คุณรู้ทุกอย่างที่คุณต้องการเขียนล่วงหน้า


XDMF ดูน่าสนใจ แต่มันเกี่ยวกับการจัดการข้อมูลมากกว่าการเข้าถึงสิ่งที่ XDMF เรียกว่าข้อมูล "หนัก" อย่างมีประสิทธิภาพ คุณใช้อะไรกับมุมมองนั้น
khinsen

เราแค่ใช้ XDMF เพื่อชี้ไปที่ HDF5 ด้วยวิธีนี้คุณสามารถเขียนไบนารี HDF5 ทั้งหมด แต่ให้อ่านโดยเอนจิ้นการสร้างภาพส่วนใหญ่
Matt Knepley

1

ฉันคิดว่าปัญหาความสามารถในการขยายของคุณเกี่ยวข้องกับผลลัพธ์ไม่ใช่อินพุต อินพุตแบบขนานค่อนข้างง่าย - สิ่งที่ฉันทำคือแต่ละ CPU เปิดไฟล์ NetCDF อินพุตและอ่านส่วนของอาเรย์ที่เป็นของไทล์ (อาจมีข้อ จำกัด ว่าผู้อ่านจำนวนมากสามารถเปิดไฟล์ NetCDF เดียวกันได้อย่างไร แต่ฉันไม่แน่ใจ ) เอาต์พุตแบบขนานมีปัญหามากกว่า

สิ่งที่ฉันกำลังทำอยู่ในขณะนี้ยังไม่เหมาะสมที่สุด แต่ใช้ได้สำหรับตอนนี้ ฉันรวบรวมทุกสิ่งใน CPU ตัวเดียวและทำเอาต์พุตอนุกรม ในขณะเดียวกันผู้เล่นคนอื่น ๆ ก็รอให้ผู้เขียนเสร็จ สิ่งนี้ทำงานได้ดีสำหรับฉันเพราะฉันจัดการเพื่อคำนวณอัตราส่วนต่อผลผลิตค่อนข้างสูง - ดังนั้นความสามารถในการปรับขยายจะดีสำหรับซีพียูมากกว่า 200 ตัว แต่นี่ไม่ใช่ทางออกที่คุณกำลังมองหา

อีกวิธีคือสิ่งที่ Yann แนะนำ - เขียนลำดับลงในไฟล์ N และมี drone CPU ประกอบไทล์ลงในหนึ่งชิ้น - ถ้าเป็น RAM ที่อนุญาต

นอกเหนือจากไลบรารี I / O ขนานที่แนะนำในคำตอบก่อนหน้าคุณอาจต้องการดู Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdfเนื่องจากคุณคุ้นเคยกับ NetCDF และ MPI แล้ว ฉันไม่ได้ใช้มันในทางปฏิบัติ แต่วางแผนที่จะไปในทิศทางนั้นเมื่อฉันชนกำแพงด้วยการรวบรวม + serial I / O


มันเป็นอินพุตที่สร้างปัญหาการขยายขีดความสามารถของฉัน ฉันคิดว่าคำขอทั้งหมดที่เข้ามาจากหลาย ๆ โหนดนั้นโอเวอร์โหลดเซิร์ฟเวอร์ NFS แต่ฉันไม่รู้ว่าจะตรวจสอบสมมติฐานนี้ได้อย่างไร
khinsen

@khinsen สิ่งที่คุณสามารถทำได้เพื่อทดสอบสมมุติฐานของคุณคืออ่านไฟล์ที่มี CPU จำนวนน้อยพูดระหว่าง 1 ถึง 8 และกระจายข้อมูลไปยังส่วนที่เหลือ ทำโปรไฟล์ดูเวลาที่คุณใช้กับ I / O และกระจายไปเท่าใด เปลี่ยนจำนวนตัวอ่าน CPU และดูว่าอะไรจะให้ประสิทธิภาพที่ดีที่สุด
milancurcic

คำแนะนำที่ดี! นี่จะเป็นงานบางอย่างเพราะมันหมายถึงการเขียนรหัสใหม่ แต่มันอาจคุ้มค่า
khinsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.