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

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 गुना तेज है। टेंसर को वेबजीएल बनावट के रूप में संग्रहीत किया जाता है और गणितीय संचालन वेबजीएल शेडर्स में कार्यान्वित किया जाता है। इस बैकएंड का उपयोग करते समय जानने योग्य कुछ उपयोगी बातें यहां दी गई हैं: \

UI थ्रेड को ब्लॉक करने से बचें

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

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

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

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

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

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

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) यूआई धागा रोकेंगे।

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

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

WASM बैकएंड

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

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

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

import {setWasmPath} from '@tensorflow/tfjs-backend-wasm';
setWasmPath(yourCustomPath);
tf.setBackend('wasm');
tf.ready().then(() => {...});
डब्ल्यूएएसएम क्यों?

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

प्रदर्शन

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

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

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

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

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

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

मुझे डब्ल्यूएएसएम का उपयोग कब करना चाहिए?

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

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

छोटे मॉडल

नमूना वेबजीएल मी था 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 तेजी मॉडल भर में सादा जे एस सीपीयू बैकएंड से 10-30x है, और जैसे छोटे मॉडल के लिए WebGL के साथ प्रतिस्पर्धी BlazeFace , जो हल्के (400KB) है, फिर भी ऑप्स के एक सभ्य संख्या (~ 140) है। यह देखते हुए कि वेबजीएल कार्यक्रमों की प्रति ऑप निष्पादन एक निश्चित ओवरहेड लागत है, यह बताता है कि ब्लेज़फेस जैसे मॉडल डब्ल्यूएएसएम पर तेज क्यों हैं।

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

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

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

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

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

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

झंडे

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

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