इस पेज का अनुवाद Cloud Translation API से किया गया है.
Switch to English

TensorFlow कार्यक्रम में डिबगिंग संख्यात्मक मुद्दे TensorBoard डीबगर V2 का उपयोग करना

शामिल महासंकट घटनाओं NaN रों कभी कभी एक TensorFlow कार्यक्रम के दौरान हो सकता है, मॉडल प्रशिक्षण प्रक्रियाओं को गंभीर। इस तरह की घटनाओं के मूल कारण विशेष रूप से गैर तुच्छ आकार और जटिलता के मॉडल के लिए, अक्सर स्पष्ट नहीं है। यह आसान मॉडल कीड़े के इस प्रकार डिबग करने के लिए बनाने के लिए, TensorBoard 2.3+ (एक साथ TensorFlow साथ 2.3+) एक विशेष डीबगर V2 कहा जाता डैशबोर्ड प्रदान करता है। यहाँ हम कैसे एक असली एक तंत्रिका TensorFlow में लिखा नेटवर्क में Nans शामिल बग के माध्यम से काम करके इस उपकरण का उपयोग करने के लिए प्रदर्शन।

तकनीक इस ट्यूटोरियल में सचित्र इस तरह के जटिल कार्यक्रमों में क्रम टेन्सर आकार निरीक्षण के रूप में डिबगिंग गतिविधियों के अन्य प्रकार के लिए लागू कर रहे हैं। इस ट्यूटोरियल उनकी घटना के अपेक्षाकृत उच्च आवृत्ति के कारण Nans पर केंद्रित है।

बग अवलोकन

TF2 कार्यक्रम हम डिबग हूँ के स्रोत कोड है GitHub पर उपलब्ध । उदाहरण के कार्यक्रम भी tensorflow पिप पैकेज में (संस्करण 2.3+) पैक किया जाता है और द्वारा लाया जा सकता है:

 python -m tensorflow.python.debug.examples.v2.debug_mnist_v2
 

यह TF2 कार्यक्रम एक बहु परत धारणा (MLP) और गाड़ियों यह पहचान करने के लिए बनाता है MNIST छवियों। इस उदाहरण उद्देश्यपूर्ण, कस्टम परत निर्माणों, नुकसान समारोह, और प्रशिक्षण पाश को परिभाषित करने के TF2 के निम्न स्तर के API का उपयोग करता है क्योंकि NaN कीड़े की संभावना अधिक है जब हम की तुलना में इस और अधिक लचीला लेकिन अधिक त्रुटि प्रवण एपीआई का उपयोग जब हम उपयोग में आसान करने के लिए उपयोग, लेकिन इस तरह के रूप में थोड़ा कम लचीला उच्च स्तरीय एपीआई tf.keras

कार्यक्रम प्रत्येक प्रशिक्षण चरण के बाद एक परीक्षण सटीकता प्रिंट करता है। हम कंसोल में देख सकते हैं कि परीक्षण सटीकता एक लगभग मौका स्तर (~ 0.1) पहला कदम के बाद कम से अटक जाता है। यह निश्चित रूप से कैसे नहीं मॉडल प्रशिक्षण व्यवहार करने की उम्मीद है: हम सटीकता की उम्मीद धीरे-धीरे 1.0 (100%) से संपर्क करने के लिए कदम के रूप में बढ़ जाती है।

 Accuracy at step 0: 0.216
Accuracy at step 1: 0.098
Accuracy at step 2: 0.098
Accuracy at step 3: 0.098
...
 

एक शिक्षित अनुमान है कि इस समस्या को इस तरह के NaN या अनंत के रूप में एक संख्यात्मक अस्थिरता, के कारण होता है। हालांकि, कैसे हम इस मामले है संख्यात्मक अस्थिरता पैदा करने के लिए जिम्मेदार इस बात की पुष्टि करते हैं वास्तव में और हम TensorFlow आपरेशन (सेशन) कैसे मिल सकती है? इन सवालों का जवाब करने के लिए, के साधन डीबगर V2 के साथ गाड़ी कार्यक्रम करते हैं।

डीबगर V2 के साथ TensorFlow कोड Instrumenting

tf.debugging.experimental.enable_dump_debug_info() डीबगर V2 के एपीआई प्रवेश बिंदु है। यह कोड की एक पंक्ति के साथ एक TF2 कार्यक्रम उपकरणों। उदाहरण के लिए, कार्यक्रम की शुरुआत के पास निम्न पंक्ति का कारण होगा डिबग जानकारी / tmp / tfdbg2_logdir पर लॉग निर्देशिका (logdir) करने के लिए लिखा जा को जोड़ने। डिबग जानकारी TensorFlow क्रम के विभिन्न पहलुओं को शामिल किया गया। TF2 में, यह उत्सुक निष्पादन का पूरा इतिहास भी शामिल है, ग्राफ द्वारा किया जाता भवन @ tf.function उन घटनाओं की, रेखांकन के निष्पादन, निष्पादन घटनाओं द्वारा उत्पन्न टेन्सर मूल्यों, साथ ही कोड स्थान (अजगर स्टैक ट्रेस) । डिबग जानकारी की समृद्धि उन अस्पष्ट कीड़े को संकीर्ण करने में सक्षम बनाता है।

 tf.debugging.experimental.enable_dump_debug_info(
    logdir="/tmp/tfdbg2_logdir",
    tensor_debug_mode="FULL_HEALTH",
    circular_buffer_size=-1)
 

tensor_debug_mode तर्क नियंत्रण क्या जानकारी डीबगर V2 प्रत्येक उत्सुक या में ग्राफ टेन्सर से निकालता है। "FULL_HEALTH" एक विधा है कि कैप्चर निम्नलिखित प्रत्येक चल प्रकार टेन्सर (जैसे, सामान्य रूप से देखा float32 और कम आम के बारे में जानकारी bfloat16 dtype):

  • DType
  • पद
  • तत्वों की कुल संख्या
  • नकारात्मक परिमित (: चल प्रकार के तत्वों का एक टूटने निम्नलिखित श्रेणियों में - शून्य () 0 ), सकारात्मक परिमित ( + ), नकारात्मक अनंत ( -∞ ), सकारात्मक अनंत ( +∞ ), और NaN

"FULL_HEALTH" मोड NaN और अनंत को शामिल कीड़े डीबगिंग के लिए उपयुक्त है। अन्य समर्थित के लिए नीचे देखें tensor_debug_mode रों।

circular_buffer_size तर्क कितने टेन्सर घटनाओं logdir में सहेजे जाते हैं नियंत्रित करता है। यह 1000 तक चूक, जो instrumented TF2 कार्यक्रम के अंत से पहले ही पिछले 1000 tensors का कारण बनता है डिस्क पर सहेज सकते हैं। इस डिफ़ॉल्ट व्यवहार डिबग-डेटा पूर्णता का त्याग द्वारा डिबगर भूमि के ऊपर कम कर देता है। पूर्णता पसंद है, के रूप में इस मामले में, हम परिपत्र बफर (जैसे, -1 यहाँ) एक नकारात्मक मूल्य के लिए तर्क की स्थापना द्वारा निष्क्रिय कर सकते हैं।

Debug_mnist_v2 उदाहरण का आह्वान enable_dump_debug_info() यह करने के लिए आदेश-पंक्ति झंडे पास करके। हमारे समस्याग्रस्त TF2 कार्यक्रम फिर से चलाने के इस डीबगिंग उपकरण के साथ सक्रिय है, कार्य करें:

 python -m tensorflow.python.debug.examples.v2.debug_mnist_v2 \
    --dump_dir /tmp/tfdbg2_logdir --dump_tensor_debug_mode FULL_HEALTH
 

TensorBoard में डिबगर V2 जीयूआई शुरू

डिबगर उपकरण के साथ कार्यक्रम चल रहा है / tmp / tfdbg2_logdir पर एक logdir पैदा करता है। हम TensorBoard शुरू करने और साथ logdir पर यह इंगित कर सकते हैं:

 tensorboard --logdir /tmp/tfdbg2_logdir
 

वेब ब्राउज़र, नेविगेट TensorBoard के पृष्ठ पर http पर में: // स्थानीय होस्ट: 6006। "डीबगर V2" प्लगइन डिफ़ॉल्ट रूप से सक्रिय किया जाना चाहिए, एक पृष्ठ प्रदर्शित कि ऐसा दिखाई देता:

डीबगर V2 पूर्ण दृश्य स्क्रीनशॉट

डीबगर V2 जीयूआई का उपयोग Nans के मूल कारण को खोजने के लिए

TensorBoard में डिबगर V2 जीयूआई छह वर्गों में आयोजित किया जाता है:

  • अलर्ट: यह ऊपरी-बाएं अनुभाग instrumented TensorFlow कार्यक्रम से डीबग डेटा में डिबगर द्वारा पता लगाया "अलर्ट" से घटनाओं की एक सूची है। प्रत्येक चेतावनी एक निश्चित विसंगति है कि वारंट ध्यान इंगित करता है। हमारे मामले में, इस खंड पर प्रकाश डाला 499 NaN / ∞ एक प्रमुख गुलाबी-लाल रंग के साथ घटनाओं। यह हमारे संदेह है कि मॉडल अपने आंतरिक टेन्सर मूल्यों में Nans और / या infinities की मौजूदगी के कारण जानने के लिए विफल रहता है की पुष्टि करता है। हम जल्द ही इन सूचनाओं पर में तल्लीन हूँ।
  • अजगर निष्पादन समयरेखा: इस शीर्ष मध्य अनुभाग के ऊपरी हिस्से है। यह ऑप्स और रेखांकन के लिए उत्सुक निष्पादन का पूरा इतिहास प्रस्तुत करता है। समय के प्रत्येक बॉक्स प्रारंभिक ( "मॉडल" के लिए "TensorSliceDataset" सेशन, "एम" के लिए जैसे, "टी" सेशन या ग्राफ के नाम का पत्र द्वारा चिह्नित है tf.function )। हम नेविगेशन बटन और समयावधि के ऊपर स्क्रॉलबार का उपयोग करके इस समय नेविगेट कर सकते हैं।
  • ग्राफ़ निष्पादन: जीयूआई के ऊपरी-दाएं कोने पर स्थित है, इस खंड हमारे डिबगिंग कार्य के लिए केंद्रीय किया जाएगा। यह चल dtype tensors रेखांकन अंदर अभिकलन (यानी, द्वारा संकलित सभी का इतिहास शामिल होता @tf-function रों)।
  • ग्राफ़ संरचना (टॉप-मध्य वर्ग के नीचे आधा), स्रोत कोड (निचले बाएं अनुभाग), और स्टैक ट्रेस (निचले दाएं अनुभाग) शुरू में खाली हैं। उनकी सामग्री जब हम परस्पर प्रभाव जीयूआई के साथ भरे जाएंगे। इन तीन वर्गों भी हमारे डिबगिंग कार्य में महत्वपूर्ण भूमिका निभा होगा।

अपने आप को यूआई के संगठन के लिए उन्मुख करने के बाद, के क्यों Nans दिखाई दिया तह तक पहुंचने के लिए निम्न चरणों लेते हैं। सबसे पहले, NaN / ∞ अलर्ट खंड में चेतावनी पर क्लिक करें। यह स्वचालित रूप से ग्राफ़ निष्पादन खंड में 600 ग्राफ tensors की सूची स्क्रॉल और पर # 88 है, जो "लॉग: 0" नामक एक टेन्सर है केंद्रित एक द्वारा उत्पन्न Log (प्राकृतिक लघुगणक) सेशन। एक मुख्य गुलाबी-लाल रंग पर प्रकाश डाला 2 डी के 1000 तत्वों के बीच एक -∞ तत्व टेन्सर float32। यह TF2 कार्यक्रम के क्रम इतिहास में पहली टेन्सर है कि किसी भी NaN या अनंत निहित है: tensors अभिकलन पहले यह NaN या शामिल नहीं है ∞; कई (वास्तव में, सबसे) अभिकलन tensors बाद में Nans होते हैं। हम स्क्रॉल करके और ग्राफ़ निष्पादन इस सूची में नीचे इस बात की पुष्टि कर सकते हैं। इस अवलोकन एक मजबूत संकेत है कि प्रदान करता है Log सेशन इस TF2 कार्यक्रम में संख्यात्मक अस्थिरता का स्रोत है।

डीबगर संस्करण 2: नेन / इन्फिनिटी सचेतक और ग्राफ निष्पादन सूची

ऐसा क्यों होता है Log बाहर एक -∞ सेशन थूक? उस सवाल का जवाब सेशन के लिए इनपुट की जांच की आवश्यकता है। टेन्सर के नाम पर क्लिक ( "प्रवेश करें: 0") एक सरल लेकिन जानकारीपूर्ण दृश्य को लाता Log ग्राफ़ संरचना खंड में अपनी TensorFlow ग्राफ में सेशन के आसपास के क्षेत्र। नोट सूचना प्रवाह के शीर्ष से नीचे दिशा। सेशन में ही बीच में बोल्ड में दिखाया गया है। इसके तत्काल बाद यह ऊपर, हम देख सकते हैं एक प्लेसहोल्डर सेशन एक और करने के लिए केवल इनपुट प्रदान करता है Log सेशन। कहाँ टेन्सर उत्पन्न इस ग्राफ़ निष्पादन सूची में प्लेसहोल्डर logits द्वारा किया जाता है? एक दृश्य सहायता के रूप में पीले रंग की पृष्ठभूमि रंग का उपयोग करके, हम देख सकते हैं logits:0 टेन्सर ऊपर दो पंक्तियों है Log:0 टेन्सर, कि है, पंक्ति 85 में।

डीबगर संस्करण 2: ग्राफ़ संरचना देख सकते हैं और इनपुट टेन्सर को अनुरेखण

के संख्यात्मक टूटने पर एक और अधिक सावधान देखो "logits: 0" पंक्ति 85 में टेन्सर का पता चलता है क्यों अपने उपभोक्ता Log:0 एक का उत्पादन -∞: "logits: 0" के 1000 तत्वों में एक तत्व 0 से मूल्य है। -∞ 0 का प्राकृतिक लघुगणक की गणना का परिणाम है! हम किसी भी तरह सुनिश्चित कर सकते हैं कि प्रवेश सेशन केवल सकारात्मक आदानों से अवगत कराया जाता है, हम ऐसा होने से NaN / ∞ को रोकने के लिए कर सकेंगे। इस क्लिपिंग को लागू करने (जैसे, का उपयोग करके प्राप्त किया जा सकता tf.clip_by_value () ) प्लेसहोल्डर logits टेन्सर पर।

हम बग को सुलझाने के करीब हो रही है, लेकिन अभी तक ऐसा नहीं किया। आदेश सुधार लागू करने के लिए, हम जानते हैं कि जहां अजगर स्रोत कोड के लिए लॉग सेशन और उसके प्लेसहोल्डर इनपुट उत्पन्न में की जरूरत है। डीबगर V2 उनके स्रोत के लिए ग्राफ ऑप्स और निष्पादन की घटनाओं का पता लगाने के लिए प्रथम श्रेणी के सहायता प्रदान करता है। जब हम क्लिक किया Log:0 ग्राफ़ सज़ाएँ में टेन्सर, स्टैक ट्रेस अनुभाग लॉग सेशन के निर्माण के मूल स्टैक ट्रेस के साथ बसा हुआ था। स्टैक ट्रेस कुछ हद तक बड़े क्योंकि यह TensorFlow के आंतरिक कोड से कई फ्रेम (जैसे, gen_math_ops.py और dumping_callback.py) है, जो हम सुरक्षित रूप से सबसे डिबगिंग कार्यों के लिए अनदेखा कर सकते हैं शामिल है। ब्याज की फ्रेम लाइन 216 debug_mnist_v2.py की (यानी, पायथन फ़ाइल हम वास्तव में डिबग करने के लिए कोशिश कर रहे हैं) है। क्लिक करने से "रेखा 204" स्रोत कोड अनुभाग में कोड की इसी लाइन के एक दृश्य को लाता है।

डीबगर V2: स्रोत कोड और स्टैक ट्रेस

यह अंत में स्रोत कोड है कि इसके logits इनपुट से समस्याग्रस्त लॉग सेशन बनाया करने के लिए हमें लाता है। यह कस्टम के साथ सजाया स्पष्ट क्रोस एंट्रोपी नुकसान समारोह है @tf.function और इसलिए एक TensorFlow ग्राफ में बदल दिया। प्लेसहोल्डर सेशन "logits" हानि कार्य करने के लिए पहले इनपुट तर्क से मेल खाती है। Log सेशन tf.math.log () API कॉल के साथ बनाया जाता है।

इस बग के लिए मूल्य-कतरन ठीक तरह दिखाई देगा:

   diff = -(labels *
           tf.clip_by_value(tf.math.log(logits), 1e-6, 1.))
 

यह इस TF2 कार्यक्रम में और MLP सफलतापूर्वक प्रशिक्षित करने के लिए कारण संख्यात्मक अस्थिरता का समाधान हो जाएगा। संख्यात्मक अस्थिरता तय करने के लिए एक अन्य संभावित दृष्टिकोण का उपयोग करने के लिए है tf.keras.losses.CategoricalCrossentropy

यह एक कोड परिवर्तन के साथ आ करने के लिए एक TF2 मॉडल बग को देख से हमारी यात्रा का निष्कर्ष है कि सुधारों को बग, डिबगर V2 उपकरण है, जो instrumented TF2 कार्यक्रम के लिए उत्सुक और ग्राफ निष्पादन इतिहास में पूर्ण दृश्यता, संख्यात्मक सारांश सहित प्रदान करता है के द्वारा सहायता प्राप्त टेन्सर मूल्यों और ऑप्स, tensors और उनके मूल स्रोत कोड के बीच सहयोग के।

डीबगर V2 के हार्डवेयर संगतता

डीबगर V2 सीपीयू और GPU सहित मुख्यधारा प्रशिक्षण हार्डवेयर का समर्थन करता है। साथ बहु GPU प्रशिक्षण tf.distributed.MirroredStrategy भी समर्थित है। के लिए समर्थन TPU एक प्रारंभिक चरण में अब भी है और कॉल करने की आवश्यकता

 tf.config.set_soft_device_placement(True)
 

कॉल करने से पहले enable_dump_debug_info() यह रूप में अच्छी तरह tpus पर अन्य सीमा होती है। आप डीबगर V2 प्रयोग करने में समस्या आ रही हों, हमारे पर कीड़े रिपोर्ट करें GitHub मुद्दों पेज

डीबगर V2 के एपीआई संगतता

डीबगर V2 TensorFlow के सॉफ्टवेयर ढेर के एक अपेक्षाकृत कम स्तर पर लागू किया है, और इसलिए साथ संगत है है tf.keras , tf.data , और अन्य API TensorFlow के निचले स्तर के ऊपर एक बने। डीबगर V2 हालांकि उत्सुक निष्पादन समय TF1 कार्यक्रमों द्वारा उत्पन्न डिबग logdirs के लिए खाली हो जाएगा, TF1 के साथ पिछड़े संगत भी है।

एपीआई उपयोग युक्तियाँ

इस डिबगिंग API के बारे में एक अक्सर पूछे जाने वाले सवाल यह है कि जहां TensorFlow कोड एक में करने के लिए कॉल डालूँ enable_dump_debug_info() आमतौर पर, एपीआई जितनी जल्दी हो सके अपने TF2 कार्यक्रम में बुलाया जाना चाहिए, अधिमानतः पायथन आयात लाइनों के बाद और इससे पहले कि ग्राफ के निर्माण और क्रियान्वयन शुरू करते हैं। यह और सभी ऑप्स की पूर्ण कवरेज रेखांकन कि सत्ता अपने मॉडल और उसके प्रशिक्षण सुनिश्चित करेगा।

वर्तमान में समर्थित tensor_debug_modes हैं: NO_TENSOR , CURT_HEALTH , CONCISE_HEALTH , FULL_HEALTH , और SHAPE । वे जानकारी की मात्रा प्रत्येक टेन्सर और डिबग कार्यक्रम के लिए प्रदर्शन भूमि के ऊपर से निकाला में भिन्नता है। देखें आर्ग अनुभाग के enable_dump_debug_info() के प्रलेखन]।

प्रदर्शन भूमि के ऊपर

instrumented TensorFlow कार्यक्रम के लिए डिबगिंग API का परिचय प्रदर्शन भूमि के ऊपर। भूमि के ऊपर से भिन्न होता है tensor_debug_mode , हार्डवेयर प्रकार, और instrumented TensorFlow कार्यक्रम की प्रकृति। एक संदर्भ बिंदु के रूप में, एक GPU पर, NO_TENSOR मोड एक 15% भूमि के ऊपर एक के प्रशिक्षण के दौरान कहते हैं ट्रांसफार्मर मॉडल बैच का आकार 64 के तहत अन्य tensor_debug_modes के लिए प्रतिशत भूमि के ऊपर उच्च रहे हैं: के लिए लगभग 50% CURT_HEALTH , CONCISE_HEALTH , FULL_HEALTH और SHAPE मोड। सीपीयू पर, भूमि के ऊपर से थोड़ा कम है। Tpus पर, भूमि के ऊपर वर्तमान में अधिक है।

अन्य TensorFlow डिबगिंग एपीआई के संबंध

ध्यान दें कि TensorFlow डीबगिंग के लिए अन्य उपकरणों और एपीआई प्रदान करता है। आप के तहत इस तरह एपीआई ब्राउज़ कर सकते हैं tf.debugging.* नाम स्थान एपीआई डॉक्स पेज पर। इन API सर्वाधिक उपयोग होने वाले में से एक है tf.print() जब एक डिबगर V2 का उपयोग करना चाहिए और जब चाहिए tf.print() का उपयोग किया? tf.print() इस मामले में जहां में सुविधाजनक है

  1. हम वास्तव में पता है जो tensors मुद्रित करने के लिए,
  2. हम जहां वास्तव में स्रोत कोड में उन लोगों को सम्मिलित करने के पता tf.print() बयान,
  3. ऐसे tensors की संख्या बहुत बड़ी नहीं है।

अन्य मामलों (जैसे, कई टेन्सर मूल्यों की जांच, TensorFlow के आंतरिक कोड द्वारा उत्पन्न टेन्सर मूल्यों की जांच, और संख्यात्मक अस्थिरता की उत्पत्ति के लिए खोज के रूप में हम ऊपर से पता चला है) के लिए, डिबगर V2 डिबगिंग की एक तेज़ तरीका प्रदान करता है। इसके अलावा, डिबगर V2 उत्सुक और ग्राफ tensors निरीक्षण करने के लिए एक एकीकृत दृष्टिकोण प्रदान करता है। इसके अतिरिक्त यह ग्राफ संरचना और कोड स्थानों, जिनमें से क्षमता से परे हैं के बारे में जानकारी प्रदान करता है tf.print()

एक और एपीआई कि शामिल ∞ और NaN समस्याओं को डीबग करने के लिए इस्तेमाल किया जा सकता है tf.debugging.enable_check_numerics() विपरीत enable_dump_debug_info() , enable_check_numerics() डिस्क पर डिबग जानकारी बचाने नहीं करता है। इसके बजाय, यह केवल पर नज़र रखता है ∞ और TensorFlow रनटाइम के दौरान NaN और जल्द ही के रूप में किसी भी सेशन में इस तरह के खराब संख्यात्मक मानों उत्पन्न करता है के रूप में मूल कोड स्थान के साथ बाहर त्रुटियों। यह सिर के ऊपर की तुलना में एक कम प्रदर्शन किया है enable_dump_debug_info() , लेकिन कार्यक्रम के निष्पादन इतिहास का एक पूरा का पता लगाने का खर्च वहन नहीं कर रहा है और डीबगर V2 की तरह एक ग्राफिकल यूजर इंटरफेस के साथ नहीं आती है।