डिबगिंग X10 मुद्दे

X10 त्वरक बैकएंड ग्राफ-आधारित समानांतर गणना के लिए काफी अधिक थ्रूपुट प्रदान कर सकता है, लेकिन इसकी विलंबित ट्रेसिंग और समय-समय पर संकलन कभी-कभी गैर-स्पष्ट व्यवहार का कारण बन सकता है। इसमें ग्राफ़ या टेंसर आकार में परिवर्तन, या विशाल ग्राफ़ के कारण निशानों का बार-बार पुनर्संकलन शामिल हो सकता है जो संकलन के दौरान स्मृति समस्याओं का कारण बनता है।

समस्याओं का निदान करने का एक तरीका X10 द्वारा प्रदान किए गए निष्पादन मेट्रिक्स और काउंटरों का उपयोग करना है। जब कोई मॉडल धीमा हो तो जांचने वाली पहली चीज़ एक मेट्रिक्स रिपोर्ट तैयार करना है।

मेट्रिक्स

मेट्रिक्स रिपोर्ट प्रिंट करने के लिए, अपने प्रोग्राम में PrintX10Metrics() कॉल जोड़ें:

import TensorFlow

...
PrintX10Metrics()
...

यह INFO स्तर पर विभिन्न मेट्रिक्स और काउंटरों को लॉग करेगा।

मेट्रिक्स रिपोर्ट को समझना

रिपोर्ट में निम्न बातें शामिल हैं:

  • हम कितनी बार XLA संकलनों को ट्रिगर करते हैं और संकलन पर बिताया गया कुल समय।
  • हम कितनी बार XLA गणना लॉन्च करते हैं और निष्पादन पर कुल कितना समय खर्च होता है।
  • हम कितने डिवाइस डेटा हैंडल बनाते/नष्ट करते हैं, आदि।

यह जानकारी नमूनों के प्रतिशत के संदर्भ में बताई गई है। एक उदाहरण है:

Metric: CompileTime
  TotalSamples: 202
  Counter: 06m09s401ms746.001us
  ValueRate: 778ms572.062us / second
  Rate: 0.425201 / second
  Percentiles: 1%=001ms32.778us; 5%=001ms61.283us; 10%=001ms79.236us; 20%=001ms110.973us; 50%=001ms228.773us; 80%=001ms339.183us; 90%=001ms434.305us; 95%=002ms921.063us; 99%=21s102ms853.173us

हम काउंटर भी प्रदान करते हैं, जिन्हें पूर्णांक चर नाम दिया गया है जो आंतरिक सॉफ़्टवेयर स्थिति को ट्रैक करते हैं। उदाहरण के लिए:

Counter: CachedSyncTensors
  Value: 395

ज्ञात चेतावनी

X10 द्वारा समर्थित Tensor शब्दार्थ रूप से डिफ़ॉल्ट उत्सुक मोड Tensor s की तरह व्यवहार करता है। हालाँकि, कुछ प्रदर्शन और पूर्णता चेतावनियाँ हैं:

  1. बहुत अधिक पुनर्संकलन के कारण ख़राब प्रदर्शन।

    XLA संकलन महंगा है. हर बार नई आकृतियाँ सामने आने पर X10 स्वचालित रूप से ग्राफ़ को पुन: संकलित करता है, बिना किसी उपयोगकर्ता के हस्तक्षेप के। मॉडलों को कुछ प्रशिक्षण चरणों के भीतर स्थिर आकृतियाँ देखने की आवश्यकता होती है और उस बिंदु से किसी पुनर्संकलन की आवश्यकता नहीं होती है। इसके अतिरिक्त, निष्पादन पथ को उसी कारण से शीघ्रता से स्थिर होना चाहिए: जब कोई नया निष्पादन पथ सामने आता है तो X10 पुन: संकलित होता है। संक्षेप में, पुनर्संकलन से बचने के लिए:

    • अत्यधिक परिवर्तनशील गतिशील आकृतियों से बचें। हालाँकि, विभिन्न आकृतियों की कम संख्या ठीक हो सकती है। जब संभव हो तो निश्चित आकार में पैड टेंसर करें।
    • प्रशिक्षण चरणों के बीच विभिन्न संख्या में पुनरावृत्तियों वाले लूप से बचें। X10 वर्तमान में लूपों को अनियंत्रित करता है, इसलिए अलग-अलग संख्या में लूप पुनरावृत्तियों को अलग-अलग (अनियंत्रित) निष्पादन पथों में परिवर्तित किया जाता है।
  2. बहुत कम संख्या में ऑपरेशन अभी तक X10 द्वारा समर्थित नहीं हैं।

    वर्तमान में हमारे पास कुछ ऐसे ऑपरेशन हैं जो समर्थित नहीं हैं, या तो क्योंकि उन्हें XLA और स्थिर आकृतियों के माध्यम से व्यक्त करने का कोई अच्छा तरीका नहीं है (वर्तमान में केवल nonZeroIndices ) या ज्ञात उपयोग मामलों की कमी है (कई रैखिक बीजगणित संचालन और बहुपद आरंभीकरण) . जबकि दूसरी श्रेणी को आवश्यकतानुसार संबोधित करना आसान है, पहली श्रेणी को केवल सीपीयू, गैर-एक्सएलए कार्यान्वयन के साथ इंटरऑपरेबिलिटी के माध्यम से संबोधित किया जा सकता है। इंटरऑपरेबिलिटी का उपयोग करने से अक्सर होस्ट राउंड-ट्रिप्स और कई ट्रेस में पूरी तरह से जुड़े मॉडल को खंडित करने के कारण महत्वपूर्ण प्रदर्शन निहितार्थ होते हैं। इसलिए उपयोगकर्ताओं को सलाह दी जाती है कि वे अपने मॉडलों में ऐसे परिचालनों का उपयोग करने से बचें।

    लिनक्स पर, स्विफ्ट स्टैक ट्रेस प्राप्त करने के लिए XLA_SAVE_TENSORS_FILE (अगले भाग में प्रलेखित) का उपयोग करें जिसे असमर्थित ऑपरेशन कहा जाता है। swift-demangle उपयोग करके फ़ंक्शन नामों को मैन्युअल रूप से डीमैंगल किया जा सकता है।

निशान प्राप्त करना और रेखांकन करना

यदि आपको संदेह है कि ग्राफ़ का पता लगाने के तरीके में कोई समस्या है, या आप ट्रेसिंग प्रक्रिया को समझना चाहते हैं, तो लॉग आउट करने और निशानों को देखने के लिए उपकरण प्रदान किए जाते हैं। आप XLA_SAVE_TENSORS_FILE पर्यावरण चर सेट करके X10 द्वारा पाए गए निशानों को लॉग आउट कर सकते हैं:

export XLA_SAVE_TENSORS_FILE=/home/person/TraceLog.txt

ये ट्रेस लॉग तीन प्रारूपों में आते हैं: text , hlo , और dot , पर्यावरण चर XLA_SAVE_TENSORS_FMT के माध्यम से व्यवस्थित प्रारूप के साथ:

export XLA_SAVE_TENSORS_FMT=text

जब आप अपना एप्लिकेशन चलाते हैं, तो लॉग आउट किया गया text प्रतिनिधित्व प्रत्येक व्यक्तिगत ट्रेस को X10 द्वारा उपयोग किए गए उच्च-स्तरीय टेक्स्ट नोटेशन में दिखाएगा। hlo प्रतिनिधित्व मध्यवर्ती प्रतिनिधित्व दिखाता है जो एक्सएलए कंपाइलर को दिया जाता है। इन लॉग को बहुत बड़ा होने से रोकने के लिए आप अपने प्रशिक्षण या गणना लूप के भीतर पुनरावृत्तियों की संख्या को सीमित करना चाह सकते हैं। साथ ही, आपके एप्लिकेशन का प्रत्येक रन इस फ़ाइल में संलग्न होगा, इसलिए हो सकता है कि आप इसे रन के बीच हटाना चाहें।

वेरिएबल XLA_LOG_GRAPH_CHANGES 1 पर सेट करने से ट्रेस लॉग में यह भी पता चलेगा कि ग्राफ़ में परिवर्तन कहाँ हुए हैं। यह उन स्थानों को ढूंढने में बेहद मददगार है जहां पुनर्संकलन का परिणाम होगा।

किसी ट्रेस के दृश्य प्रतिनिधित्व के लिए, dot विकल्प ग्राफ़विज़-संगत ग्राफ़ को लॉग आउट कर देगा। यदि आप ट्रेस का वह भाग निकालते हैं जो दिखता है

digraph G {
    ...
}

अपनी स्वयं की फ़ाइल में, ग्राफ़विज़ (यह मानते हुए कि यह स्थापित है) एक दृश्य आरेख उत्पन्न कर सकता है

dot -Tpng trace.dot -o trace.png

ध्यान दें कि XLA_SAVE_TENSORS_FILE पर्यावरण चर सेट करना, विशेष रूप से जब XLA_LOG_GRAPH_CHANGES के साथ संयोजन में उपयोग किया जाता है, तो प्रदर्शन पर काफी नकारात्मक प्रभाव पड़ेगा। इनका उपयोग केवल डिबगिंग करते समय करें, नियमित संचालन के लिए नहीं।

अतिरिक्त पर्यावरण चर

डिबगिंग के लिए अतिरिक्त पर्यावरण चर में शामिल हैं:

  • XLA_USE_BF16 : यदि 1 पर सेट किया जाता है, तो सभी Float मान BF16 में बदल जाता है। इसका उपयोग केवल डिबगिंग के लिए किया जाना चाहिए क्योंकि हम स्वचालित मिश्रित परिशुद्धता प्रदान करते हैं।

  • XLA_USE_32BIT_LONG : यदि 1 पर सेट किया जाता है, तो S4TF Long टाइप को XLA 32 बिट पूर्णांक प्रकार में मैप करता है। टीपीयू पर, 64 बिट पूर्णांक संगणना महंगी है, इसलिए इस ध्वज को सेट करने से मदद मिल सकती है। बेशक, उपयोगकर्ता को यह सुनिश्चित करने की ज़रूरत है कि मान अभी भी 32 बिट पूर्णांक में फ़िट हों।