Tùy chọn I / O song song, đặc biệt là HDF5 song song


20

Tôi có một ứng dụng có thể song song hóa tầm thường nhưng hiệu năng của nó bị giới hạn ở mức I / O lớn. Ứng dụng đọc một mảng đầu vào duy nhất được lưu trữ trong một tệp có kích thước thường là 2-5 GB (nhưng tôi hy vọng con số này sẽ tăng lên trong tương lai). Một tính toán điển hình áp dụng cùng một hoạt động cho mỗi hàng hoặc cột của mảng đó. Đối với các hoạt động nặng CPU, tôi có khả năng mở rộng rất tốt lên tới khoảng 100 bộ xử lý, nhưng đối với các hoạt động chậm hơn I / O và giao tiếp liên quan (truy cập NFS) chiếm ưu thế và tôi không thể sử dụng hiệu quả hơn một vài bộ xử lý.

Các tùy chọn hiệu quả và di động (lý tưởng là hiệu quả di động) cho tình huống như vậy là gì? Song song HDF5 có vẻ đầy hứa hẹn. Có ai có kinh nghiệm thực tế với nó?

MPI-I / O có phải là thứ đáng để xem xét không? Nó có thể hoạt động hiệu quả với một bố cục tệp nhất định hay tôi phải điều chỉnh mọi thứ?


4
Câu hỏi tuyệt vời. Chúng tôi có cùng một vấn đề và giải pháp thô thiển của chúng tôi là ghi / đọc mảng phân tách miền đến / từ các tệp N, cho bộ xử lý N. Tôi không thực sự thích điều này, nhưng nó đơn giản. Tôi muốn thấy câu trả lời cũng giải quyết sự phức tạp của các giao diện thư viện khác nhau ....
Yann

Làm thế nào để bạn phân phối các mảng trên các bộ xử lý? Bạn đang sử dụng gì cho song song bây giờ? Bạn đang viết vào các tệp qua NFS như một hình thức giao tiếp?
Dan

2
Bạn có thể không phải làm lại mã của bạn rất nhiều; Tôi đã gặp một vấn đề như thế này một lần và có thể tăng tốc tốt hơn tránh IO hơn là tối ưu hóa nó.
Dan

1
Bạn đang sử dụng một hệ thống xếp hàng như PBS hay Torque? Nếu vậy, có các lệnh để "giai đoạn" một tập tin đến một thư mục khi một công việc bắt đầu. Tôi không biết liệu nó có tăng tốc mọi thứ một cách đáng chú ý hay không, nhưng nó có thể đáng để thử.
Dan

1
@Dan: có, tôi sử dụng PBS và tôi có thể sử dụng nó để đặt tệp của mình bất cứ nơi nào tôi muốn. Nhưng vì cụm của tôi không có đĩa cục bộ nút, nên không có gì tốt hơn khối lượng NFS được chia sẻ.
khinsen

Câu trả lời:


6

Song song I / O có thể giúp bạn trong trường hợp này, nhưng nếu bạn đang sử dụng NFS (vốn dĩ khá nối tiếp) để phục vụ các tệp của mình, thì nó sẽ không có tác dụng đầy đủ mà bạn có thể muốn - sẽ có một nút cổ chai nối tiếp tại máy chủ tệp và có hàng trăm quy trình thực hiện các yêu cầu của một máy chủ sẽ không cung cấp cho bạn các yếu tố hàng trăm tốc độ thực hiện thông qua một quy trình. Tuy nhiên, điều này có thể giúp ích cho một điểm, đặc biệt là vì nó có vẻ như nút cổ chai đang đọc chứ không phải viết và sẽ là một cải tiến lớn nếu hệ thống của bạn được nâng cấp lên hệ thống tệp hoàn toàn song song.

MPI-IO ở mức rất thấp; Thật đáng để hiểu một số điều về nó để biết những gì đang diễn ra "dưới mui xe" với HDF5, NetCDF4 hoặc ADIOS song song , nhưng bản thân việc sử dụng nó thực sự chỉ phù hợp với dữ liệu nhị phân thô mà cấu trúc được biết đến vào thời gian biên dịch. HDF5 và NetCDF4 linh hoạt hơn nhiều.

Lưu ý rằng nếu dữ liệu của bạn tương đối đơn giản - ví dụ: cấu trúc dữ liệu lớn chủ yếu là mảng hoặc vectơ n chiều - Tôi khuyên dùng NetCDF4 (cũng song song và dựa trên HDF5) thay vì HDF5; nó siginificantly đơn giản để sử dụng. HDF5 phức tạp hơn và đổi lại sự phức tạp đó cho phép các mô hình dữ liệu rất phức tạp. Nhưng nếu đó là một tính năng bạn không cần, thì bắt đầu nhanh hơn trong NetCDF4.

Tại trung tâm của chúng tôi, chúng tôi có một lớp học kéo dài cả buổi chiều và một ngày dài trên I / O song song nơi chúng tôi nói về các khái niệm cơ bản, MPI-IO, HDF5 và NetCDF4; các slide có thể được tìm thấy ở đây .


5

Chúng tôi có khả năng mở rộng tốt lên đến toàn bộ XT6 tại ORNL bằng cách sử dụng MPI / IO để tạo ra các vectơ đầu ra. Đây là . Các hệ thống con I / O cho nhiều máy không được thiết kế cho sự song song lớn, vì vậy tôi nghĩ @Dan đúng là tôi sẽ cố gắng giảm thiểu IO bằng cách chỉ viết mỗi vài bước hoặc một số chiến lược kết tụ khác.

Theo như đầu ra ghi linh hoạt theo cách có thể mở rộng, tôi có kinh nghiệm với XDMF , có thể được thực hiện bằng cách ghi nhị phân lớn song song bằng HDF5 (như PETSc VecView ) kết hợp với một lượng nhỏ mã XML được viết nối tiếp để mô tả bố cục. Điều này có thể được đọc bởi các gói trực quan như Paraview hoặc MayaVi2 . Một cách khác để làm điều này là sử dụng định dạng VTK với dữ liệu nhị phân được nối thêm, tuy nhiên điều này đòi hỏi bạn phải biết mọi thứ bạn muốn viết lên trước.


XDMF có vẻ thú vị, nhưng đó là về việc tổ chức dữ liệu thay vì truy cập hiệu quả những gì XDMF gọi là dữ liệu "nặng". Bạn sử dụng gì cho khía cạnh đó?
khinsen

Chúng tôi chỉ sử dụng XDMF để trỏ vào HDF5. Bằng cách đó, bạn có thể viết tất cả HDF5 nhị phân, nhưng được đọc bởi hầu hết các công cụ trực quan.
Matt Knepley

1

Tôi giả sử vấn đề về khả năng mở rộng của bạn có liên quan đến đầu ra, và không liên quan đến đầu vào. Đầu vào song song khá đơn giản - điều tôi làm là mỗi CPU mở tệp NetCDF đầu vào và đọc phần của mảng thuộc về khối của nó (có thể có giới hạn về số lượng người đọc có thể mở cùng một tệp NetCDF nhưng tôi không chắc ). Đầu ra song song có nhiều vấn đề hơn.

Những gì tôi đang làm hiện tại không hoàn toàn tối ưu, nhưng hiện tại vẫn hoạt động. Tôi thu thập toàn bộ mọi thứ trên một CPU và thực hiện đầu ra nối tiếp. Trong khi đó, những người chơi khác chờ nhà văn hoàn thành. Điều này làm việc tốt với tôi vì tôi đã quản lý để giữ cho tính toán trên tỷ lệ đầu ra khá cao - vì vậy khả năng mở rộng sẽ tốt cho hơn 200 CPU. Nhưng đây không phải là giải pháp bạn đang tìm kiếm.

Một giải pháp khác là những gì Yann đề xuất - ghi ser seri vào các tệp N và có CPU drone lắp ráp các ô thành một mảnh - nếu đó là cho phép RAM.

Ngoài các thư viện I / O song song được đề xuất trong các câu trả lời trước, bạn cũng có thể muốn xem xét Parallel NetCDF http://trac.mcs.anl.gov/projects/abul-netcdf , vì bạn đã cảm thấy thoải mái với NetCDF và MPI. Tôi đã không sử dụng nó trong thực tế, nhưng tôi có kế hoạch đi theo hướng đó khi tôi va vào tường với việc thu thập + I / O nối tiếp.


Đó là đầu vào tạo ra vấn đề khả năng mở rộng của tôi. Tôi cho rằng tất cả các yêu cầu đến từ nhiều nút làm quá tải máy chủ NFS, nhưng tôi không biết làm thế nào để xác minh giả thuyết này.
khinsen

@khinsen Những gì bạn có thể làm để kiểm tra giả thuyết của mình là đọc tệp với một số lượng nhỏ CPU, từ 1 đến 8, và phân tán dữ liệu cho phần còn lại. Làm hồ sơ, xem bạn dành bao nhiêu thời gian cho I / O và bao nhiêu cho việc phân tán. Thay đổi số lượng đầu đọc CPU và xem những gì mang lại cho bạn hiệu suất tốt nhất.
milancurcic

Gợi ý tốt! Đây sẽ là một số công việc vì nó có nghĩa là viết lại mã, nhưng nó có thể đáng giá.
khinsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.