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());
वेबजीएल बैकएंड
WebGL बैकएंड, 'webgl', वर्तमान में ब्राउज़र के लिए सबसे शक्तिशाली बैकएंड है। यह बैकएंड वैनिला सीपीयू बैकएंड की तुलना में 100 गुना तेज है। Tensors को WebGL बनावट के रूप में संग्रहीत किया जाता है और गणितीय कार्यों को WebGL शेड्स में लागू किया जाता है। इस बैकएंड का उपयोग करते समय जानने योग्य कुछ उपयोगी बातें यहां दी गई हैं: \
UI थ्रेड को ब्लॉक करने से बचें
जब एक ऑपरेशन कहा जाता है, जैसे tf.matMul(a, b), परिणामी tf.Tensor को सिंक्रोनाइज़ किया जाता है, हालांकि मैट्रिक्स गुणन की गणना वास्तव में अभी तक तैयार नहीं हो सकती है। इसका मतलब है कि tf.Tensor लौटाया गया गणना के लिए सिर्फ एक हैंडल है। जब आप x.data()
या x.array()
पर कॉल करते हैं, तो मान तब हल हो जाएंगे जब गणना वास्तव में पूरी हो जाएगी। यह एसिंक्रोनस x.data()
और x.array()
विधियों को उनके सिंक्रोनस समकक्षों x.dataSync()
और x.arraySync()
पर उपयोग करना महत्वपूर्ण बनाता है ताकि गणना पूर्ण होने के दौरान UI थ्रेड को ब्लॉक करने से बचा जा सके।
स्मृति प्रबंधन
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 बिट फ़्लोटिंग पॉइंट बनावट का समर्थन करता है। आप tf.ENV.getBool('WEBGL_RENDER_FLOAT32_ENABLED')
का उपयोग यह जांचने के लिए कर सकते हैं कि TensorFlow.js वर्तमान में 32 बिट बनावट का उपयोग कर रहा है या नहीं।
शेडर संकलन और बनावट अपलोड
TensorFlow.js WebGL शेडर प्रोग्राम चलाकर GPU पर संचालन निष्पादित करता है। जब उपयोगकर्ता किसी ऑपरेशन को निष्पादित करने के लिए कहता है, तो इन शेड्स को इकट्ठा और संकलित किया जाता है। एक शेडर का संकलन मुख्य धागे पर सीपीयू पर होता है और धीमा हो सकता है। TensorFlow.js स्वचालित रूप से संकलित शेड्स को कैश करेगा, एक ही आकार के इनपुट और आउटपुट टेंसर के साथ एक ही ऑपरेशन के लिए दूसरी कॉल को बहुत तेज कर देगा। आमतौर पर, TensorFlow.js एप्लिकेशन एप्लिकेशन के जीवनकाल में एक ही ऑपरेशन का कई बार उपयोग करेंगे, इसलिए मशीन लर्निंग मॉडल के माध्यम से दूसरा पास बहुत तेज है।
TensorFlow.js tf.Tensor डेटा को WebGLTextures के रूप में भी स्टोर करता है। जब एक tf.Tensor
बनाया जाता है, तो हम तुरंत GPU पर डेटा अपलोड नहीं करते हैं, बल्कि हम डेटा को CPU पर तब तक रखते हैं जब तक कि tf.Tensor
का उपयोग किसी ऑपरेशन में नहीं किया जाता है। यदि tf.Tensor
का दूसरी बार उपयोग किया जाता है, तो डेटा पहले से ही GPU पर है, इसलिए कोई अपलोड लागत नहीं है। एक विशिष्ट मशीन लर्निंग मॉडल में, इसका मतलब है कि मॉडल के माध्यम से पहली भविष्यवाणी के दौरान वजन अपलोड किया जाता है और मॉडल के माध्यम से दूसरा पास बहुत तेज होगा।
यदि आप अपने मॉडल या TensorFlow.js कोड के माध्यम से पहली भविष्यवाणी के प्रदर्शन की परवाह करते हैं, तो हम वास्तविक डेटा का उपयोग करने से पहले उसी आकार के इनपुट टेंसर को पास करके मॉडल को गर्म करने की सलाह देते हैं।
उदाहरण के लिए:
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
सिंक्रोनाइज़ करते हैं। हालांकि, वेबजीएल बैकएंड के विपरीत, टेंसर को वापस लाने से पहले ऑपरेशन पूरा हो गया है। इसका मतलब है कि tf.matMul(a, b)
पर कॉल करने से UI थ्रेड ब्लॉक हो जाएगा।
इस कारण से, यदि आप इसे किसी उत्पादन अनुप्रयोग में उपयोग करने का इरादा रखते हैं, तो आपको TensorFlow.js को वर्कर थ्रेड्स में चलाना चाहिए ताकि मुख्य थ्रेड को ब्लॉक न किया जा सके।
Node.js के बारे में अधिक जानकारी के लिए, यह मार्गदर्शिका देखें।
WASM बैकएंड
TensorFlow.js एक WebAssembly बैकएंड ( wasm
) प्रदान करता है, जो CPU त्वरण प्रदान करता है और इसे वेनिला JavaScript 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 को 2015 में एक नए वेब-आधारित बाइनरी प्रारूप के रूप में पेश किया गया था, जो वेब पर चलने के लिए एक संकलन लक्ष्य जावास्क्रिप्ट, C, C ++, आदि में लिखे गए प्रोग्राम प्रदान करता है। WASM 2017 से क्रोम, सफारी, फ़ायरफ़ॉक्स और एज द्वारा समर्थित है, और दुनिया भर में 90% उपकरणों द्वारा समर्थित है।
प्रदर्शन
WASM बैकएंड तंत्रिका नेटवर्क ऑपरेटरों के अनुकूलित कार्यान्वयन के लिए XNNPACK लाइब्रेरी का लाभ उठाता है।
बनाम जावास्क्रिप्ट : WASM बायनेरिज़ आमतौर पर ब्राउज़रों को लोड करने, पार्स करने और निष्पादित करने के लिए जावास्क्रिप्ट बंडलों की तुलना में बहुत तेज़ होते हैं। जावास्क्रिप्ट गतिशील रूप से टाइप किया जाता है और कचरा एकत्र किया जाता है, जो रनटाइम पर मंदी का कारण बन सकता है।
वेबजीएल बनाम वेबजीएल अधिकांश मॉडलों के लिए डब्ल्यूएएसएम से तेज है, लेकिन छोटे मॉडल के लिए डब्ल्यूएएसएम वेबजीएल शेडर्स को क्रियान्वित करने की निश्चित ओवरहेड लागत के कारण वेबजीएल से बेहतर प्रदर्शन कर सकता है। नीचे "मुझे WASM का उपयोग कब करना चाहिए" खंड इस निर्णय को लेने के लिए अनुमानों पर चर्चा करता है।
पोर्टेबिलिटी और स्थिरता
WASM में पोर्टेबल 32-बिट फ्लोट अंकगणित है, जो सभी उपकरणों में सटीक समता प्रदान करता है। दूसरी ओर, WebGL, हार्डवेयर-विशिष्ट है और विभिन्न उपकरणों में अलग-अलग सटीकता हो सकती है (उदाहरण के लिए iOS उपकरणों पर 16-बिट फ़्लोट पर वापस आना)।
WebGL की तरह, WASM आधिकारिक तौर पर सभी प्रमुख ब्राउज़रों द्वारा समर्थित है। WebGL के विपरीत, WASM Node.js में चल सकता है, और देशी पुस्तकालयों को संकलित करने की आवश्यकता के बिना सर्वर-साइड का उपयोग किया जा सकता है।
मुझे डब्ल्यूएएसएम का उपयोग कब करना चाहिए?
मॉडल आकार और कम्प्यूटेशनल मांग
सामान्य तौर पर, WASM एक अच्छा विकल्प है जब मॉडल छोटे होते हैं या आप निम्न-अंत वाले उपकरणों की परवाह करते हैं जिनमें WebGL समर्थन ( OES_texture_float
एक्सटेंशन) की कमी होती है या जिनमें कम शक्तिशाली GPU होते हैं। नीचे दिया गया चार्ट वेबजीएल, डब्ल्यूएएसएम, और सीपीयू बैकएंड में हमारे आधिकारिक रूप से समर्थित 5 मॉडलों के लिए 2018 मैकबुक प्रो पर क्रोम में अनुमान समय (TensorFlow.js 1.5.2 के अनुसार) दिखाता है:
छोटे मॉडल
नमूना | वेबजीएल | मी था | सी पी यू | स्मृति |
---|---|---|---|---|
ब्लेज़फेस | 22.5 एमएस | 15.6 एमएस | 315.2 एमएस | .4 एमबी |
फेसमेश | 19.3 एमएस | 19.2 एमएस | 335 एमएस | 2.8 एमबी |
बड़े मॉडल
नमूना | वेबजीएल | मी था | सी पी यू | स्मृति |
---|---|---|---|---|
पोज़नेट | 42.5 एमएस | 173.9 एमएस | 1514.7 एमएस | 4.5 एमबी |
बॉडीपिक्स | 77 एमएस | 188.4 एमएस | 2683 एमएस | 4.6 एमबी |
मोबाइलनेट v2 | 37 एमएस | 94 एमएस | 923.6 एमएस | 13 एमबी |
ऊपर दी गई तालिका से पता चलता है कि WASM सभी मॉडलों में सादे JS CPU बैकएंड की तुलना में 10-30x तेज है, और BlazeFace जैसे छोटे मॉडल के लिए WebGL के साथ प्रतिस्पर्धी है, जो हल्का (400KB) है, फिर भी इसमें ऑप्स की एक अच्छी संख्या (~ 140) है। यह देखते हुए कि वेबजीएल कार्यक्रमों की एक निश्चित ओवरहेड लागत प्रति ऑप निष्पादन है, यह बताता है कि ब्लेज़फेस जैसे मॉडल डब्ल्यूएएसएम पर तेज क्यों हैं।
ये परिणाम आपके डिवाइस के आधार पर अलग-अलग होंगे। यह निर्धारित करने का सबसे अच्छा तरीका है कि क्या WASM आपके आवेदन के लिए सही है, इसे हमारे विभिन्न बैकएंड पर परीक्षण करना है।
अनुमान बनाम प्रशिक्षण
पूर्व-प्रशिक्षित मॉडल की तैनाती के लिए प्राथमिक उपयोग-मामले को संबोधित करने के लिए, WASM बैकएंड विकास प्रशिक्षण समर्थन पर अनुमान को प्राथमिकता देगा। WASM में समर्थित ऑप्स की अप-टू-डेट सूची देखें और हमें बताएं कि क्या आपके मॉडल में असमर्थित ऑप है। प्रशिक्षण मॉडल के लिए, हम Node (TensorFlow C++) बैकएंड या WebGL बैकएंड का उपयोग करने की सलाह देते हैं।
सीपीयू बैकएंड
सीपीयू बैकएंड, 'सीपीयू', सबसे कम प्रदर्शन करने वाला बैकएंड है, हालांकि यह सबसे सरल है। संचालन सभी वेनिला जावास्क्रिप्ट में कार्यान्वित किए जाते हैं, जो उन्हें कम समानांतर बनाता है। वे UI थ्रेड को भी ब्लॉक करते हैं।
यह बैकएंड परीक्षण के लिए या उन उपकरणों पर बहुत उपयोगी हो सकता है जहां WebGL अनुपलब्ध है।
झंडे
TensorFlow.js में पर्यावरण फ़्लैग का एक सेट होता है जो स्वचालित रूप से मूल्यांकन किया जाता है और वर्तमान प्लेटफ़ॉर्म में सर्वोत्तम कॉन्फ़िगरेशन निर्धारित करता है। ये झंडे ज्यादातर आंतरिक हैं, लेकिन कुछ वैश्विक झंडे सार्वजनिक एपीआई के साथ नियंत्रित किए जा सकते हैं।
-
tf.enableProdMode():
उत्पादन मोड को सक्षम करता है, जो प्रदर्शन के पक्ष में मॉडल सत्यापन, NaN जाँच और अन्य शुद्धता जाँचों को हटा देगा। -
tf.enableDebugMode()
: डिबग मोड को सक्षम करता है, जो निष्पादित होने वाले प्रत्येक ऑपरेशन को कंसोल में लॉग करेगा, साथ ही साथ रनटाइम प्रदर्शन जानकारी जैसे मेमोरी फ़ुटप्रिंट और कुल कर्नेल निष्पादन समय। ध्यान दें कि यह आपके एप्लिकेशन को बहुत धीमा कर देगा, इसे उत्पादन में उपयोग न करें।