मंच और पर्यावरण

TensorFlow.js ब्राउज़र और Node.js में काम करता है, और दोनों प्लेटफ़ॉर्म में कई अलग-अलग कॉन्फ़िगरेशन उपलब्ध हैं। प्रत्येक प्लेटफ़ॉर्म में विचारों का एक अनूठा सेट होता है जो एप्लिकेशन विकसित करने के तरीके को प्रभावित करेगा।

ब्राउज़र में, TensorFlow.js मोबाइल डिवाइस के साथ-साथ डेस्कटॉप डिवाइस को भी सपोर्ट करता है। प्रत्येक डिवाइस में उपलब्ध वेबजीएल एपीआई की तरह बाधाओं का एक विशिष्ट सेट होता है, जो आपके लिए स्वचालित रूप से निर्धारित और कॉन्फ़िगर किया जाता है।

Node.js में, TensorFlow.js सीधे TensorFlow API से बाइंडिंग या धीमी वेनिला CPU कार्यान्वयन के साथ चलने का समर्थन करता है।

वातावरण

जब TensorFlow.js प्रोग्राम निष्पादित किया जाता है, तो विशिष्ट कॉन्फ़िगरेशन को पर्यावरण कहा जाता है। पर्यावरण में एक वैश्विक बैकएंड के साथ-साथ झंडों का एक सेट शामिल है जो TensorFlow.js की बारीक विशेषताओं को नियंत्रित करता है।

बैकेंड

TensorFlow.js कई अलग-अलग बैकएंड का समर्थन करता है जो टेंसर स्टोरेज और गणितीय संचालन को लागू करता है। किसी भी समय, केवल एक बैकएंड सक्रिय होता है। अधिकांश समय, TensorFlow.js वर्तमान परिवेश को देखते हुए स्वचालित रूप से आपके लिए सर्वश्रेष्ठ बैकएंड का चयन करेगा। हालाँकि, कभी-कभी यह जानना महत्वपूर्ण है कि किस बैकएंड का उपयोग किया जा रहा है और इसे कैसे स्विच किया जाए।

यह जानने के लिए कि आप किस बैकएंड का उपयोग कर रहे हैं:

console.log(tf.getBackend());

यदि आप बैकएंड को मैन्युअल रूप से बदलना चाहते हैं:

tf.setBackend('cpu');
console.log(tf.getBackend());

वेबजीएल बैकएंड

वेबजीएल बैकएंड, 'वेबजीएल', वर्तमान में ब्राउज़र के लिए सबसे शक्तिशाली बैकएंड है। यह बैकएंड वेनिला सीपीयू बैकएंड से 100 गुना तेज है। टेन्सर्स को WebGL टेक्सचर के रूप में संग्रहीत किया जाता है और गणितीय संचालन WebGL शेडर्स में कार्यान्वित किए जाते हैं। इस बैकएंड का उपयोग करते समय जानने योग्य कुछ उपयोगी बातें यहां दी गई हैं: \

यूआई थ्रेड को ब्लॉक करने से बचें

जब किसी ऑपरेशन को कॉल किया जाता है, जैसे tf.matMul(a, b), तो परिणामी tf.Tensor समकालिक रूप से वापस आ जाता है, हालाँकि मैट्रिक्स गुणन की गणना वास्तव में अभी तक तैयार नहीं हो सकती है। इसका मतलब है कि लौटाया गया tf.Tensor केवल गणना के लिए एक हैंडल है। जब आप x.data() या x.array() को कॉल करते हैं, तो गणना वास्तव में पूरी होने पर मान हल हो जाएंगे। इससे गणना पूरी होने के दौरान यूआई थ्रेड को अवरुद्ध करने से बचने के लिए उनके सिंक्रोनस समकक्षों x.dataSync() x.data() x.array() x.arraySync() ) विधियों का उपयोग करना महत्वपूर्ण हो जाता है।

स्मृति प्रबंधन

WebGL बैकएंड का उपयोग करते समय एक चेतावनी स्पष्ट मेमोरी प्रबंधन की आवश्यकता है। WebGLTextures, जहां Tensor डेटा अंततः संग्रहीत किया जाता है, ब्राउज़र द्वारा स्वचालित रूप से कचरा एकत्र नहीं किया जाता है।

tf.Tensor की मेमोरी को नष्ट करने के लिए, आप dispose() विधि का उपयोग कर सकते हैं:

const a = tf.tensor([[1, 2], [3, 4]]);
a.dispose();

किसी एप्लिकेशन में कई ऑपरेशनों को एक साथ श्रृंखलाबद्ध करना बहुत आम है। सभी मध्यवर्ती चरों को निपटाने के लिए उनका संदर्भ रखने से कोड की पठनीयता कम हो सकती है। इस समस्या को हल करने के लिए, TensorFlow.js एक tf.tidy() विधि प्रदान करता है जो सभी tf.Tensor s को साफ़ करता है जो इसे निष्पादित करने के बाद किसी फ़ंक्शन द्वारा वापस नहीं किए जाते हैं, उसी तरह जैसे किसी फ़ंक्शन को निष्पादित करते समय स्थानीय चर को साफ़ किया जाता है:

const a = tf.tensor([[1, 2], [3, 4]]);
const y = tf.tidy(() => {
  const result = a.square().log().neg();
  return result;
});
शुद्धता

मोबाइल उपकरणों पर, WebGL केवल 16 बिट फ़्लोटिंग पॉइंट टेक्सचर का समर्थन कर सकता है। हालाँकि, अधिकांश मशीन लर्निंग मॉडल को 32 बिट फ्लोटिंग पॉइंट वेट और एक्टिवेशन के साथ प्रशिक्षित किया जाता है। मोबाइल डिवाइस के लिए मॉडल पोर्ट करते समय यह सटीक समस्याएं पैदा कर सकता है क्योंकि 16 बिट फ्लोटिंग नंबर केवल [0.000000059605, 65504] रेंज में संख्याओं का प्रतिनिधित्व कर सकते हैं। इसका मतलब यह है कि आपको सावधान रहना चाहिए कि आपके मॉडल में वजन और सक्रियता इस सीमा से अधिक न हो। यह जांचने के लिए कि डिवाइस 32 बिट टेक्सचर का समर्थन करता है या नहीं, tf.ENV.getBool('WEBGL_RENDER_FLOAT32_CAPABLE') का मान जांचें, यदि यह गलत है तो डिवाइस केवल 16 बिट फ्लोटिंग पॉइंट टेक्सचर का समर्थन करता है। यह जांचने के लिए कि क्या TensorFlow.js वर्तमान में 32 बिट टेक्सचर का उपयोग कर रहा है, आप tf.ENV.getBool('WEBGL_RENDER_FLOAT32_ENABLED') उपयोग कर सकते हैं।

शेडर संकलन और बनावट अपलोड

TensorFlow.js WebGL शेडर प्रोग्राम चलाकर GPU पर संचालन निष्पादित करता है। जब उपयोगकर्ता किसी ऑपरेशन को निष्पादित करने के लिए कहता है तो इन शेडर्स को असेंबल और संकलित किया जाता है। शेडर का संकलन मुख्य थ्रेड पर सीपीयू पर होता है और धीमा हो सकता है। TensorFlow.js संकलित शेडर्स को स्वचालित रूप से कैश कर देगा, जिससे समान आकार के इनपुट और आउटपुट टेंसर के साथ उसी ऑपरेशन में दूसरी कॉल बहुत तेज हो जाएगी। आमतौर पर, TensorFlow.js एप्लिकेशन, एप्लिकेशन के जीवनकाल में एक ही ऑपरेशन का कई बार उपयोग करेगा, इसलिए मशीन लर्निंग मॉडल के माध्यम से दूसरा पास बहुत तेज है।

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

यदि आप अपने मॉडल या TensorFlow.js कोड के माध्यम से पहली भविष्यवाणी के प्रदर्शन की परवाह करते हैं, तो हम वास्तविक डेटा का उपयोग करने से पहले उसी आकार के इनपुट Tensor को पास करके मॉडल को गर्म करने की सलाह देते हैं।

उदाहरण के लिए:

const model = await tf.loadLayersModel(modelUrl);

// Warmup the model before using real data.
const warmupResult = model.predict(tf.zeros(inputShape));
warmupResult.dataSync();
warmupResult.dispose();

// The second predict() will be much faster
const result = model.predict(userData);

Node.js TensorFlow बैकएंड

TensorFlow Node.js बैकएंड, 'नोड' में, संचालन में तेजी लाने के लिए TensorFlow C API का उपयोग किया जाता है। यदि उपलब्ध हो तो यह मशीन के उपलब्ध हार्डवेयर एक्सेलेरेशन, जैसे CUDA, का उपयोग करेगा।

इस बैकएंड में, WebGL बैकएंड की तरह, ऑपरेशन tf.Tensor s को समकालिक रूप से लौटाते हैं। हालाँकि, WebGL बैकएंड के विपरीत, आपके द्वारा टेंसर वापस पाने से पहले ऑपरेशन पूरा हो जाता है। इसका मतलब है कि tf.matMul(a, b) पर कॉल UI थ्रेड को ब्लॉक कर देगी।

इस कारण से, यदि आप इसे किसी उत्पादन एप्लिकेशन में उपयोग करना चाहते हैं, तो आपको मुख्य थ्रेड को अवरुद्ध न करने के लिए वर्कर थ्रेड में TensorFlow.js चलाना चाहिए।

Node.js पर अधिक जानकारी के लिए, यह मार्गदर्शिका देखें।

WASM बैकएंड

TensorFlow.js एक WebAssembly बैकएंड ( wasm ) प्रदान करता है, जो CPU त्वरण प्रदान करता है और इसे वेनिला जावास्क्रिप्ट CPU ( cpu ) और WebGL त्वरित ( webgl ) बैकएंड के विकल्प के रूप में उपयोग किया जा सकता है। इसके प्रयेाग के लिए:

// Set the backend to WASM and wait for the module to be ready.
tf.setBackend('wasm');
tf.ready().then(() => {...});

यदि आपका सर्वर .wasm फ़ाइल को किसी भिन्न पथ या भिन्न नाम पर प्रस्तुत कर रहा है, तो बैकएंड आरंभ करने से पहले setWasmPath उपयोग करें। अधिक जानकारी के लिए README में "बंडलर्स का उपयोग करना" अनुभाग देखें:

import {setWasmPath} from '@tensorflow/tfjs-backend-wasm';
setWasmPath(yourCustomPath);
tf.setBackend('wasm');
tf.ready().then(() => {...});
WASM क्यों?

WASM को 2015 में एक नए वेब-आधारित बाइनरी प्रारूप के रूप में पेश किया गया था, जो जावास्क्रिप्ट, C, C++ आदि में लिखे गए प्रोग्राम को वेब पर चलाने के लिए एक संकलन लक्ष्य प्रदान करता है। WASM को 2017 से क्रोम, सफारी, फ़ायरफ़ॉक्स और एज द्वारा समर्थित किया गया है, और यह दुनिया भर के 90% उपकरणों द्वारा समर्थित है।

प्रदर्शन

WASM बैकएंड तंत्रिका नेटवर्क ऑपरेटरों के अनुकूलित कार्यान्वयन के लिए XNNPACK लाइब्रेरी का लाभ उठाता है।

बनाम जावास्क्रिप्ट : WASM बायनेरिज़ आमतौर पर ब्राउज़रों को लोड करने, पार्स करने और निष्पादित करने के लिए जावास्क्रिप्ट बंडलों की तुलना में बहुत तेज़ होते हैं। जावास्क्रिप्ट को गतिशील रूप से टाइप किया जाता है और कचरा एकत्र किया जाता है, जो रनटाइम पर मंदी का कारण बन सकता है।

बनाम WebGL : अधिकांश मॉडलों के लिए WebGL WASM से तेज़ है, लेकिन छोटे मॉडलों के लिए WASM WebGL शेडर्स को निष्पादित करने की निश्चित ओवरहेड लागत के कारण WebGL से बेहतर प्रदर्शन कर सकता है। नीचे "मुझे WASM का उपयोग कब करना चाहिए" अनुभाग इस निर्णय को लेने के लिए अनुमानों पर चर्चा करता है।

पोर्टेबिलिटी और स्थिरता

WASM में पोर्टेबल 32-बिट फ्लोट अंकगणित है, जो सभी उपकरणों में सटीक समानता प्रदान करता है। दूसरी ओर, WebGL, हार्डवेयर-विशिष्ट है और विभिन्न उपकरणों में अलग-अलग परिशुद्धता हो सकती है (उदाहरण के लिए iOS उपकरणों पर 16-बिट फ़्लोट पर फ़ॉलबैक)।

WebGL की तरह, WASM आधिकारिक तौर पर सभी प्रमुख ब्राउज़रों द्वारा समर्थित है। WebGL के विपरीत, WASM Node.js में चल सकता है, और मूल पुस्तकालयों को संकलित करने की आवश्यकता के बिना सर्वर-साइड पर उपयोग किया जा सकता है।

मुझे WASM का उपयोग कब करना चाहिए?

मॉडल का आकार और कम्प्यूटेशनल मांग

सामान्य तौर पर, WASM एक अच्छा विकल्प है जब मॉडल छोटे होते हैं या आप निचले स्तर के उपकरणों की परवाह करते हैं जिनमें WebGL समर्थन ( OES_texture_float एक्सटेंशन) की कमी होती है या कम शक्तिशाली GPU होते हैं। नीचे दिया गया चार्ट वेबजीएल, डब्ल्यूएएसएम और सीपीयू बैकएंड पर हमारे आधिकारिक तौर पर समर्थित 5 मॉडलों के लिए 2018 मैकबुक प्रो पर क्रोम में अनुमान समय (टेन्सरफ्लो.जेएस 1.5.2 के अनुसार) दिखाता है:

छोटे मॉडल

नमूना वेबजीएल मी था CPU याद
ब्लेज़फेस 22.5 एमएस 15.6 एमएस 315.2 एमएस .4 एमबी
फेसमेश 19.3 एमएस 19.2 एमएस 335 एमएस 2.8 एमबी

बड़े मॉडल

नमूना वेबजीएल मी था CPU याद
पोज़नेट 42.5 एमएस 173.9 एमएस 1514.7 एमएस 4.5 एमबी
बॉडीपिक्स 77 एमएस 188.4 एमएस 2683 एमएस 4.6 एमबी
मोबाइलनेट v2 37 एमएस 94 एमएस 923.6 एमएस 13 एमबी

ऊपर दी गई तालिका से पता चलता है कि WASM सभी मॉडलों में सादे JS CPU बैकएंड की तुलना में 10-30 गुना तेज है, और ब्लेज़फेस जैसे छोटे मॉडलों के लिए WebGL के साथ प्रतिस्पर्धी है, जो हल्का (400KB) है, फिर भी इसमें अच्छी संख्या में ऑप्स (~ 140) हैं। यह देखते हुए कि WebGL प्रोग्रामों की प्रति ऑप निष्पादन एक निश्चित ओवरहेड लागत होती है, यह बताता है कि ब्लेज़फेस जैसे मॉडल WASM पर तेज़ क्यों हैं।

ये परिणाम आपके डिवाइस के आधार पर अलग-अलग होंगे। यह निर्धारित करने का सबसे अच्छा तरीका है कि WASM आपके एप्लिकेशन के लिए सही है या नहीं, इसे हमारे विभिन्न बैकएंड पर परीक्षण करना है।

अनुमान बनाम प्रशिक्षण

पूर्व-प्रशिक्षित मॉडलों की तैनाती के लिए प्राथमिक उपयोग-मामले को संबोधित करने के लिए, WASM बैकएंड विकास प्रशिक्षण समर्थन पर अनुमान को प्राथमिकता देगा। WASM में समर्थित ऑप्स की अद्यतन सूची देखें और हमें बताएं कि क्या आपके मॉडल में कोई असमर्थित ऑप है। प्रशिक्षण मॉडल के लिए, हम नोड (टेन्सरफ्लो सी++) बैकएंड या वेबजीएल बैकएंड का उपयोग करने की सलाह देते हैं।

सीपीयू बैकएंड

सीपीयू बैकएंड, 'सीपीयू', सबसे कम प्रदर्शन करने वाला बैकएंड है, हालांकि यह सबसे सरल है। सभी ऑपरेशन वेनिला जावास्क्रिप्ट में कार्यान्वित किए जाते हैं, जो उन्हें कम समानांतर बनाता है। वे यूआई थ्रेड को भी ब्लॉक करते हैं।

यह बैकएंड परीक्षण के लिए, या उन उपकरणों पर बहुत उपयोगी हो सकता है जहां WebGL अनुपलब्ध है।

झंडे

TensorFlow.js में पर्यावरण ध्वजों का एक सेट है जो स्वचालित रूप से मूल्यांकन किया जाता है और वर्तमान प्लेटफ़ॉर्म में सर्वोत्तम कॉन्फ़िगरेशन निर्धारित करता है। ये झंडे अधिकतर आंतरिक हैं, लेकिन कुछ वैश्विक झंडों को सार्वजनिक एपीआई से नियंत्रित किया जा सकता है।

  • tf.enableProdMode(): उत्पादन मोड को सक्षम करता है, जो प्रदर्शन के पक्ष में मॉडल सत्यापन, NaN जांच और अन्य शुद्धता जांच को हटा देगा।
  • tf.enableDebugMode() : डिबग मोड को सक्षम करता है, जो निष्पादित प्रत्येक ऑपरेशन को कंसोल पर लॉग करेगा, साथ ही मेमोरी फ़ुटप्रिंट और कुल कर्नेल निष्पादन समय जैसी रनटाइम प्रदर्शन जानकारी भी देगा। ध्यान दें कि यह आपके एप्लिकेशन को बहुत धीमा कर देगा, इसका उपयोग उत्पादन में न करें।