TensorFlow.js में कस्टम ऑप्स, कर्नेल और ग्रेडिएंट लिखना

अवलोकन

यह गाइड TensorFlow.js में कस्टम ऑपरेशंस (ऑप्स), कर्नेल और ग्रेडिएंट्स को परिभाषित करने के लिए तंत्र की रूपरेखा तैयार करता है। इसका उद्देश्य कोड के लिए मुख्य अवधारणाओं और संकेतकों का एक सिंहावलोकन प्रदान करना है जो अवधारणाओं को कार्रवाई में प्रदर्शित करता है।

यह मार्गदर्शिका किसके लिए है?

यह एक काफी उन्नत मार्गदर्शिका है जो TensorFlow.js के कुछ आंतरिक पहलुओं को छूती है, यह लोगों के निम्नलिखित समूहों के लिए विशेष रूप से उपयोगी हो सकती है:

  • TensorFlow.js के उन्नत उपयोगकर्ता विभिन्न गणितीय परिचालनों के व्यवहार को अनुकूलित करने में रुचि रखते हैं (उदाहरण के लिए मौजूदा ग्रेडिएंट कार्यान्वयन को ओवरराइड करने वाले शोधकर्ता या ऐसे उपयोगकर्ता जिन्हें लाइब्रेरी में लापता कार्यक्षमता को पैच करने की आवश्यकता है)
  • उपयोगकर्ता ऐसे पुस्तकालयों का निर्माण कर रहे हैं जो TensorFlow.js का विस्तार करते हैं (उदाहरण के लिए TensorFlow.js प्राइमेटिव्स या एक नए TensorFlow.js बैकएंड के शीर्ष पर निर्मित एक सामान्य रैखिक बीजगणित पुस्तकालय)।
  • Tensorflow.js में नए ऑप्स का योगदान करने में रुचि रखने वाले उपयोगकर्ता जो ये तंत्र कैसे काम करते हैं, इसका सामान्य अवलोकन प्राप्त करना चाहते हैं।

यह TensorFlow.js के सामान्य उपयोग के लिए एक मार्गदर्शिका नहीं है क्योंकि यह आंतरिक कार्यान्वयन तंत्र में जाता है। TensorFlow.js का उपयोग करने के लिए आपको इन तंत्रों को समझने की आवश्यकता नहीं है

इस गाइड का अधिकतम उपयोग करने के लिए आपको TensorFlow.js स्रोत कोड को पढ़ने में सहज (या प्रयास करने के इच्छुक) होने की आवश्यकता है।

शब्दावली

इस गाइड के लिए कुछ प्रमुख शब्द पहले से ही वर्णन करने के लिए उपयोगी हैं।

ऑपरेशंस (ऑप्स) - एक या अधिक टेंसरों पर एक गणितीय ऑपरेशन जो आउटपुट के रूप में एक या अधिक टेंसर उत्पन्न करता है। ऑप्स 'उच्च स्तरीय' कोड हैं और अपने तर्क को परिभाषित करने के लिए अन्य ऑप्स का उपयोग कर सकते हैं।

कर्नेल - विशिष्ट हार्डवेयर/प्लेटफ़ॉर्म क्षमताओं से जुड़े ऑप का एक विशिष्ट कार्यान्वयन। कर्नेल 'निम्न स्तर' और बैकएंड विशिष्ट हैं। कुछ ऑप्स में ऑप से कर्नेल तक एक-से-एक मैपिंग होती है जबकि अन्य ऑप्स एकाधिक कर्नेल का उपयोग करते हैं।

Gradient / GradFunc - एक ऑप/कर्नेल की 'बैकवर्ड मोड' परिभाषा जो कुछ इनपुट के संबंध में उस फ़ंक्शन के व्युत्पन्न की गणना करती है। ग्रेडिएंट 'उच्च स्तरीय' कोड हैं (बैकएंड विशिष्ट नहीं) और अन्य ऑप्स या कर्नेल को कॉल कर सकते हैं।

कर्नेल रजिस्ट्री - कर्नेल कार्यान्वयन के लिए (कर्नेल नाम, बैकएंड नाम) टपल से एक मानचित्र।

ग्रेडिएंट रजिस्ट्री - कर्नेल नाम से ग्रेडिएंट कार्यान्वयन तक का नक्शा।

कोड संगठन

ऑपरेशंस और ग्रेडिएंट्स को tfjs-core में परिभाषित किया गया है।

कर्नेल बैकएंड विशिष्ट होते हैं और उनके संबंधित बैकएंड फ़ोल्डर्स (उदाहरण के लिए tfjs-बैकएंड-सीपीयू ) में परिभाषित होते हैं।

इन पैकेजों के अंदर कस्टम ऑप्स, कर्नेल और ग्रेडिएंट्स को परिभाषित करने की आवश्यकता नहीं है। लेकिन अक्सर अपने कार्यान्वयन में समान प्रतीकों का उपयोग करेंगे।

कस्टम ऑप्स लागू करना

कस्टम ऑप के बारे में सोचने का एक तरीका बस एक जावास्क्रिप्ट फ़ंक्शन है जो कुछ टेंसर आउटपुट देता है, अक्सर इनपुट के रूप में टेंसर के साथ।

  • कुछ ऑप्स को मौजूदा ऑप्स के संदर्भ में पूरी तरह से परिभाषित किया जा सकता है, और इन कार्यों को सीधे आयात और कॉल करना चाहिए। यहाँ एक उदाहरण है
  • एक ऑप का कार्यान्वयन बैकएंड विशिष्ट कर्नेल को भी भेज सकता है। यह Engine.runKernel के माध्यम से किया जाता है और इसे आगे "कस्टम कर्नेल लागू करना" अनुभाग में वर्णित किया जाएगा। यहाँ एक उदाहरण है

कस्टम कर्नेल लागू करना

बैकएंड विशिष्ट कर्नेल कार्यान्वयन किसी दिए गए ऑपरेशन के लिए तर्क के अनुकूलित कार्यान्वयन की अनुमति देता है। ऑप्स द्वारा tf.engine().runKernel() कॉल करने से कर्नेल का आह्वान किया जाता है। कर्नेल कार्यान्वयन को चार चीजों द्वारा परिभाषित किया गया है

  • एक कर्नेल नाम.
  • बैकएंड में कर्नेल कार्यान्वित किया जाता है।
  • इनपुट: कर्नेल फ़ंक्शन के लिए टेंसर तर्क।
  • विशेषताएँ: कर्नेल फ़ंक्शन के लिए गैर-टेंसर तर्क।

यहां कर्नेल कार्यान्वयन का एक उदाहरण दिया गया है। कार्यान्वयन के लिए उपयोग की जाने वाली परंपराएँ बैकएंड विशिष्ट हैं और प्रत्येक विशेष बैकएंड के कार्यान्वयन और दस्तावेज़ीकरण को देखने से सबसे अच्छी तरह समझी जाती हैं।

आम तौर पर कर्नेल टेंसर से कम स्तर पर काम करते हैं और इसके बजाय सीधे मेमोरी में पढ़ते और लिखते हैं जिसे अंततः tfjs-core द्वारा टेंसर में लपेटा जाएगा।

एक बार कर्नेल लागू हो जाने पर इसे tfjs-core से registerKernel फ़ंक्शन का उपयोग करके TensorFlow.js के साथ पंजीकृत किया जा सकता है। आप प्रत्येक बैकएंड के लिए एक कर्नेल पंजीकृत कर सकते हैं जिसमें आप चाहते हैं कि कर्नेल काम करे। एक बार पंजीकृत होने के बाद कर्नेल को tf.engine().runKernel(...) के साथ लागू किया जा सकता है और TensorFlow.js कार्यान्वयन के लिए भेजना सुनिश्चित करेगा। वर्तमान सक्रिय बैकएंड.

कस्टम ग्रेजुएट्स लागू करना

ग्रेडिएंट्स को आम तौर पर किसी दिए गए कर्नेल के लिए परिभाषित किया जाता है ( tf.engine().runKernel(...) पर कॉल में उपयोग किए गए उसी कर्नेल नाम से पहचाना जाता है)। यह tfjs-core को रनटाइम पर किसी भी कर्नेल के लिए ग्रेडिएंट परिभाषाएँ देखने के लिए रजिस्ट्री का उपयोग करने की अनुमति देता है।

कस्टम ग्रेडिएंट लागू करना इनके लिए उपयोगी है:

  • एक ग्रेडिएंट परिभाषा जोड़ना जो लाइब्रेरी में मौजूद नहीं हो सकती है
  • किसी दिए गए कर्नेल के लिए ग्रेडिएंट गणना को अनुकूलित करने के लिए मौजूदा ग्रेडिएंट परिभाषा को ओवरराइड करना।

आप यहां ग्रेडिएंट कार्यान्वयन के उदाहरण देख सकते हैं।

एक बार जब आप किसी दिए गए कॉल के लिए ग्रेडिएंट लागू कर लेते हैं तो इसे tfjs-core से registerGradient फ़ंक्शन का उपयोग करके TensorFlow.js के साथ पंजीकृत किया जा सकता है।

कस्टम ग्रेडिएंट्स को लागू करने का दूसरा तरीका जो ग्रेडिएंट रजिस्ट्री को बाय-पास करता है (और इस प्रकार मनमाने ढंग से मनमाने ढंग से कार्यों के लिए ग्रेडिएंट्स की गणना करने की अनुमति देता है) tf.customGrad का उपयोग कर रहा है।

यहां कस्टमग्रैड का उपयोग करने की लाइब्रेरी के भीतर एक ऑप का एक उदाहरण दिया गया है