समानांतर I / O विकल्प, विशेष रूप से समानांतर HDF5 में


20

मेरे पास एक एप्लिकेशन है जिसे तुच्छ रूप से समानांतर किया जा सकता है लेकिन इसका प्रदर्शन काफी हद तक I / O बाध्य है। एप्लिकेशन एक फ़ाइल में संग्रहीत एकल इनपुट सरणी को पढ़ता है जो आम तौर पर 2-5 जीबी आकार में होता है (लेकिन मुझे उम्मीद है कि यह संख्या भविष्य में बढ़ने की संभावना है)। एक विशिष्ट संगणना उस पंक्ति के प्रत्येक पंक्ति या स्तंभ पर एक ही ऑपरेशन को लागू करती है। CPU- हेवी ऑपरेशंस के लिए, मुझे लगभग 100 प्रोसेसर तक बहुत अच्छे स्केलिंग मिलते हैं, लेकिन धीमे संचालन के लिए I / O और संबंधित संचार (NFS एक्सेस) हावी है और मैं कुछ प्रोसेसर से अधिक कुशलता से उपयोग नहीं कर सकता।

ऐसी स्थिति के लिए कुशल और पोर्टेबल (आदर्श रूप से कुशल रूप से कुशल) विकल्प क्या हैं? समानांतर HDF5 आशाजनक लगता है। क्या किसी को इसके साथ वास्तविक जीवन का अनुभव है?

क्या MPI-I / O कुछ देखने लायक होगा? क्या यह किसी दिए गए फ़ाइल लेआउट के साथ कुशलता से काम कर सकता है, या क्या मुझे सब कुछ अनुकूलित करना होगा?


4
बड़ा सवाल है। हमारे पास एक ही समस्या है, और हमारा क्रूड सॉल्यूशन एन प्रोसेसर के लिए एन फाइल से / से डोमेन विघटित सरणी को लिखने / पढ़ने के लिए है। मुझे वास्तव में यह पसंद नहीं है, लेकिन यह सरल है। मुझे उन उत्तरों को देखने में दिलचस्पी होगी, जो विभिन्न पुस्तकालय इंटरफेस की जटिलता को भी संबोधित करते हैं ....
यन

कैसे आप प्रोसेसर में सरणी वितरित कर रहे हैं? अब आप समानता के लिए क्या उपयोग कर रहे हैं? क्या आप संचार के एक रूप के रूप में एनएफएस पर फाइलें लिख रहे हैं?
दान

2
आपको अपने कोड को बहुत अधिक काम नहीं करना पड़ सकता है; मुझे एक बार इस तरह की समस्या हुई थी और आईओ से बचने के लिए इसे अनुकूलित करने की तुलना में बेहतर स्पीडअप प्राप्त करने में सक्षम था।
Dan

1
क्या आप पीबीएस या टॉर्क जैसी कतार प्रणाली का उपयोग कर रहे हैं? यदि ऐसा है, तो नौकरी शुरू होने पर कुछ निर्देशिका में एक फ़ाइल में "चरण" करने के लिए आदेश हैं। मुझे नहीं पता कि यह चीजों को गति देगा, लेकिन यह एक शॉट के लायक हो सकता है।
दान

1
@ दान: हाँ, मैं पीबीएस का उपयोग करता हूं, और मैं अपनी फ़ाइल को जहां भी चाहता हूं, वहां रखने के लिए इसका उपयोग कर सकता हूं। लेकिन चूंकि मेरे क्लस्टर में नोड-लोकल डिस्क नहीं है, इसलिए एक साझा एनएफएस वॉल्यूम से बेहतर कुछ नहीं है।
खिंसन

जवाबों:


6

इस मामले में समानांतर I / O आपकी मदद कर सकता है, लेकिन यदि आप अपनी फ़ाइलों की सेवा के लिए (स्वाभाविक रूप से सुंदर धारावाहिक) NFS का उपयोग कर रहे हैं, तो यह वह पूर्ण प्रभाव नहीं होने वाला है जो आप चाहते हैं - इस पर एक सीरियल अड़चन होने वाली है फ़ाइलरवर और एकल सर्वर के अनुरोध करने वाली सैकड़ों प्रक्रियाएँ होने से आपको एकल प्रक्रिया के माध्यम से करने के सैकड़ों स्पीडअप के कारक नहीं मिलेंगे। फिर भी, यह एक बिंदु पर मदद कर सकता है, खासकर जब से ऐसा लगता है जैसे कि लिखने के बजाय अड़चन पढ़ रही है, और यह एक बड़ा सुधार होगा यदि आपका सिस्टम पूरी तरह से समानांतर फाइल सिस्टम में अपग्रेड हो जाता है।

MPI-IO बहुत निम्न स्तर का है; समानांतर HDF5 , NetCDF4 , या ADIOS के साथ "हुड के नीचे" क्या चल रहा है, यह जानने के लिए इसके बारे में कुछ समझने लायक है , लेकिन इसका उपयोग करना वास्तव में केवल कच्चे बाइनरी डेटा के लिए अनुकूल है जहां संरचना संकलन के समय में अच्छी तरह से जानी जाती है। HDF5 और NetCDF4 अधिक लचीले हैं।

ध्यान दें कि यदि आपका डेटा अपेक्षाकृत सरल है - उदाहरण के लिए, बड़ी डेटा संरचनाएं मुख्य रूप से एन-डायमेंशनल एरेज़ या वैक्टर हैं - मैं एचडीसी 5 के बजाय नेटसीडीएफ 4 (जो समानांतर भी है, और एचडीएफ 5 पर आधारित है) की सलाह देता हूं; यह है siginificantly उपयोग करने के लिए सरल। HDF5 अधिक जटिल है, और इसके बदले में जटिलता बहुत जटिल डेटा मॉडल की अनुमति देती है। लेकिन अगर यह एक ऐसी विशेषता है जिसकी आपको आवश्यकता नहीं है, तो यह NetCDF4 में आरंभ करने के लिए तेज़ है।

हमारे केंद्र में हमारे पास समानांतर I / O पर एक दोपहर और दिन भर की कक्षा है जहाँ हम बुनियादी अवधारणाओं, MPI-IO, HDF5 और NetCDF4 के बारे में बात करते हैं; स्लाइड यहां देख सकते हैं


5

हम आउटपुट वैक्टर को MPI / IO का उपयोग करके ORNL पर पूरे XT6 तक अच्छी स्केलिंग प्राप्त करते हैं। यहाँ कोड है । कई मशीनों के लिए I / O सबसिस्टम को बड़े पैमाने पर समानता के लिए डिज़ाइन नहीं किया गया है, इसलिए मुझे लगता है कि @Dan सही है कि मैं हर कुछ कदम, या कुछ अन्य ढेर रणनीति लिखकर IO को कम से कम करने की कोशिश करूंगा।

जहाँ तक लचीले ढंग से आउटपुट को स्केलेबल तरीके से लिखने की बात है, मेरे पास एक्सडीएमएफ के साथ अनुभव है , जो कि लेआउट का वर्णन करने के लिए सीरियल में लिखे गए XML कोड की एक छोटी राशि के साथ मिलकर HDF5 (जैसे PETSc VecView ) का उपयोग करके बड़े समानांतर बाइनरी राइट से प्रभावित हो सकता है । इस तरह दृश्य संकुल द्वारा पढ़ा जा सकता पाराव्यू या MayaVi2 । ऐसा करने का एक और तरीका यह है कि संलग्न द्विआधारी डेटा के साथ VTK प्रारूप का उपयोग करें, हालांकि इसके लिए यह आवश्यक है कि आप वह सब कुछ जानते हों जो आप सामने लिखना चाहते हैं।


XDMF दिलचस्प लगता है, लेकिन यह XDMF को "भारी" डेटा कहे जाने वाले डेटा को कुशलता से एक्सेस करने के बजाय डेटा को व्यवस्थित करने के बारे में है। आप उस पहलू के लिए क्या उपयोग करते हैं?
खिंसन

हम सिर्फ HDF5 में इंगित करने के लिए XDMF का उपयोग करते हैं। इस तरह आप सभी बाइनरी HDF5 लिख सकते हैं, लेकिन क्या यह अधिकांश विज़ुअलाइज़ेशन इंजनों द्वारा पढ़ा गया है।
मैट नेप्ले

1

मुझे लगता है कि आपकी स्केलेबिलिटी समस्या आउटपुट से संबंधित है, न कि इनपुट से। समानांतर इनपुट बल्कि सरल है - मैं क्या करता हूं प्रत्येक CPU इनपुट NetCDF फ़ाइल खोलता है और उस सरणी का हिस्सा पढ़ता है जो इसकी टाइल से संबंधित है (एक ही NetCDF फ़ाइल को कितने पाठक खोल सकते हैं इसकी एक सीमा हो सकती है लेकिन मुझे यकीन नहीं है )। समानांतर आउटपुट अधिक समस्याग्रस्त है।

वर्तमान में मैं जो कर रहा हूं वह काफी इष्टतम नहीं है, लेकिन अभी के लिए काम करता है। मैं एक सीपीयू पर पूरी चीज इकट्ठा करता हूं और सीरियल आउटपुट करता हूं। इस बीच, अन्य खिलाड़ी लेखक के समाप्त होने की प्रतीक्षा करते हैं। यह मेरे लिए अच्छी तरह से काम करता है क्योंकि मैं आउटपुट अनुपात पर गणना को बहुत अधिक रखने में कामयाब रहा - इसलिए 200 से अधिक सीपीयू के लिए स्केलेबिलिटी अच्छी होगी। लेकिन यह वह समाधान नहीं है जिसकी आपको तलाश है।

एक अन्य समाधान है जो यन ने सुझाया है - सी फ़ाइलों को क्रमबद्ध रूप से लिखें और एक ड्रोन सीपीयू टाइल्स को एक टुकड़े पर इकट्ठा करें - अगर यह रैम की अनुमति है।

पिछले उत्तरों में सुझाए गए समानांतर I / O पुस्तकालयों के अलावा, आप समानांतर NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf में भी देखना चाहते हैं , क्योंकि आप पहले से ही NetCDF और MPI के साथ सहज हैं। मैंने इसे अभ्यास में उपयोग नहीं किया, लेकिन उस दिशा में जाने की योजना बनाते हैं जब मैंने दीवार को इकट्ठा किया + सीरियल I / O के साथ।


यह ऐसा इनपुट है जो मेरी मापनीयता को बनाता है। मुझे लगता है कि कई नोड्स से आने वाले सभी अनुरोध एनएफएस सर्वर को अधिभारित करते हैं, लेकिन मुझे नहीं पता कि इस परिकल्पना को कैसे सत्यापित किया जाए।
खिंसन

@khinsen आप अपनी परिकल्पना का परीक्षण करने के लिए क्या कर सकते हैं, एक छोटी संख्या में सीपीयू के साथ फ़ाइल को पढ़ा जाता है, 1 और 8 के बीच कहते हैं, और डेटा को बाकी हिस्सों में बिखेरते हैं। प्रोफाइलिंग करें, देखें कि आप I / O पर कितना समय बिताते हैं और बिखराव पर कितना खर्च करते हैं। सीपीयू पाठकों की संख्या से सावधान रहें और देखें कि आपको सबसे अच्छा प्रदर्शन क्या है।
दूधनसिक

अच्छा सुझाव! यह कुछ काम होगा क्योंकि इसका मतलब कोड को फिर से लिखना है, लेकिन यह शायद इसके लायक है।
खिंसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.