প্ল্যাটফর্ম এবং পরিবেশ

TensorFlow.js ব্রাউজার এবং Node.js-এ কাজ করে এবং উভয় প্ল্যাটফর্মেই বিভিন্ন উপলব্ধ কনফিগারেশন রয়েছে। প্রতিটি প্ল্যাটফর্মের বিবেচনার একটি অনন্য সেট রয়েছে যা অ্যাপ্লিকেশনগুলির বিকাশের পদ্ধতিকে প্রভাবিত করবে।

ব্রাউজারে, TensorFlow.js মোবাইল ডিভাইসের পাশাপাশি ডেস্কটপ ডিভাইসগুলিকে সমর্থন করে। প্রতিটি ডিভাইসে একটি নির্দিষ্ট সীমাবদ্ধতা রয়েছে, যেমন উপলব্ধ WebGL API, যা আপনার জন্য স্বয়ংক্রিয়ভাবে নির্ধারিত এবং কনফিগার করা হয়।

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 ব্যাকএন্ড, 'webgl', বর্তমানে ব্রাউজারের জন্য সবচেয়ে শক্তিশালী ব্যাকএন্ড। এই ব্যাকএন্ড ভ্যানিলা CPU ব্যাকএন্ডের চেয়ে 100x দ্রুত। টেনসরগুলি WebGL টেক্সচার হিসাবে সংরক্ষণ করা হয় এবং WebGL শেডারগুলিতে গাণিতিক ক্রিয়াকলাপ প্রয়োগ করা হয়। এই ব্যাকএন্ড ব্যবহার করার সময় এখানে কিছু দরকারী জিনিস জানা আছে: \

UI থ্রেড ব্লক করা এড়িয়ে চলুন

যখন একটি অপারেশন কল করা হয়, যেমন tf.matMul(a, b), ফলে tf.Tensor সিঙ্ক্রোনাসভাবে ফিরে আসে, তবে ম্যাট্রিক্স গুণের গণনা আসলে এখনও প্রস্তুত নাও হতে পারে। এর মানে হল যে tf. Tensor ফিরে এসেছে তা গণনার একটি হ্যান্ডেল মাত্র। আপনি যখন x.data() বা x.array() কল করেন, গণনাটি আসলে শেষ হয়ে গেলে মানগুলি সমাধান হবে। এটি কম্পিউটেশন সম্পূর্ণ হওয়ার সময় UI থ্রেড ব্লক করা এড়াতে তাদের সিঙ্ক্রোনাস প্রতিরূপ x.dataSync() এবং x.array() x.arraySync() এর উপর অ্যাসিঙ্ক্রোনাস x.data() এবং x.array() পদ্ধতিগুলি ব্যবহার করা গুরুত্বপূর্ণ করে তোলে।

মেমরি ব্যবস্থাপনা

WebGL ব্যাকএন্ড ব্যবহার করার সময় একটি সতর্কতা হল সুস্পষ্ট মেমরি ব্যবস্থাপনার প্রয়োজন। WebGLTextures, যেখানে টেনসর ডেটা শেষ পর্যন্ত সংরক্ষণ করা হয়, ব্রাউজার দ্বারা স্বয়ংক্রিয়ভাবে আবর্জনা সংগ্রহ করা হয় না।

একটি 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 বিট ফ্লোটিং পয়েন্ট টেক্সচার সমর্থন করে। TensorFlow.js বর্তমানে 32 বিট টেক্সচার ব্যবহার করছে কিনা তা পরীক্ষা করতে আপনি tf.ENV.getBool('WEBGL_RENDER_FLOAT32_ENABLED') ব্যবহার করতে পারেন।

শেডার কম্পাইলেশন এবং টেক্সচার আপলোড

TensorFlow.js WebGL শেডার প্রোগ্রাম চালানোর মাধ্যমে GPU-তে অপারেশন চালায়। এই শেডারগুলিকে একত্রিত করা হয় এবং অলসভাবে কম্পাইল করা হয় যখন ব্যবহারকারী একটি অপারেশন চালাতে বলে। একটি শেডারের সংকলন প্রধান থ্রেডের CPU-তে ঘটে এবং ধীর হতে পারে। TensorFlow.js স্বয়ংক্রিয়ভাবে সংকলিত শেডারগুলিকে ক্যাশে করবে, একই আকৃতির ইনপুট এবং আউটপুট টেনসরগুলির সাথে একই অপারেশনে দ্বিতীয় কলটি আরও দ্রুত করবে। সাধারণত, TensorFlow.js অ্যাপ্লিকেশনগুলি অ্যাপ্লিকেশনের জীবদ্দশায় একই ক্রিয়াকলাপগুলি একাধিকবার ব্যবহার করবে, তাই একটি মেশিন লার্নিং মডেলের মাধ্যমে দ্বিতীয় পাসটি অনেক দ্রুত।

TensorFlow.js এছাড়াও WebGLTexture হিসাবে tf.Tensor ডেটা সঞ্চয় করে। যখন একটি tf.Tensor তৈরি করা হয়, আমরা অবিলম্বে GPU-তে ডেটা আপলোড করি না, বরং tf.Tensor একটি অপারেশনে ব্যবহার না হওয়া পর্যন্ত আমরা ডেটা CPU-তে রাখি। যদি 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 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 সালে একটি নতুন ওয়েব-ভিত্তিক বাইনারি ফর্ম্যাট হিসাবে চালু করা হয়েছিল, যা JavaScript, C, C++ ইত্যাদিতে লেখা প্রোগ্রামগুলিকে ওয়েবে চালানোর জন্য একটি সংকলন লক্ষ্য প্রদান করে। WASM 2017 সাল থেকে Chrome, Safari, Firefox এবং Edge দ্বারা সমর্থিত এবং বিশ্বব্যাপী 90% ডিভাইস দ্বারা সমর্থিত।

কর্মক্ষমতা

WASM ব্যাকএন্ড নিউরাল নেটওয়ার্ক অপারেটরদের অপ্টিমাইজ করা বাস্তবায়নের জন্য XNNPACK লাইব্রেরি ব্যবহার করে।

জাভাস্ক্রিপ্ট বনাম : WASM বাইনারিগুলি সাধারণত ব্রাউজার লোড, পার্স এবং এক্সিকিউট করার জন্য জাভাস্ক্রিপ্ট বান্ডেলের তুলনায় অনেক দ্রুত। জাভাস্ক্রিপ্ট গতিশীলভাবে টাইপ করা হয় এবং আবর্জনা সংগ্রহ করা হয়, যা রানটাইমে ধীরগতির কারণ হতে পারে।

WebGL বনাম : WebGL বেশিরভাগ মডেলের জন্য WASM এর চেয়ে দ্রুত, কিন্তু WebGL শেডারগুলি চালানোর জন্য নির্দিষ্ট ওভারহেড খরচের কারণে WASM ওয়েবজিএলকে ছাড়িয়ে যেতে পারে। নীচের "আমি কখন WASM ব্যবহার করব" বিভাগে এই সিদ্ধান্ত নেওয়ার জন্য হিউরিস্টিকস নিয়ে আলোচনা করা হয়েছে।

বহনযোগ্যতা এবং স্থিতিশীলতা

WASM-এর পোর্টেবল 32-বিট ফ্লোট গাণিতিক রয়েছে, যা সমস্ত ডিভাইসে নির্ভুল সমতা প্রদান করে। অন্যদিকে, WebGL, হার্ডওয়্যার-নির্দিষ্ট এবং বিভিন্ন ডিভাইসে বিভিন্ন নির্ভুলতা থাকতে পারে (যেমন iOS ডিভাইসে 16-বিট ফ্লোটে ফলব্যাক)।

WebGL এর মতো, WASM আনুষ্ঠানিকভাবে সমস্ত প্রধান ব্রাউজার দ্বারা সমর্থিত। WebGL-এর বিপরীতে, WASM Node.js-এ চলতে পারে এবং নেটিভ লাইব্রেরি কম্পাইল করার প্রয়োজন ছাড়াই সার্ভার-সাইড ব্যবহার করা যেতে পারে।

আমি কখন WASM ব্যবহার করব?

মডেলের আকার এবং গণনাগত চাহিদা

সাধারণভাবে, WASM একটি ভাল পছন্দ যখন মডেলগুলি ছোট হয় বা আপনি নিম্ন-প্রান্তের ডিভাইসগুলির বিষয়ে যত্নবান হন যেগুলিতে WebGL সমর্থন নেই ( OES_texture_float এক্সটেনশন) বা কম শক্তিশালী GPU আছে৷ নীচের চার্টটি WebGL, WASM এবং CPU ব্যাকএন্ড জুড়ে আমাদের আনুষ্ঠানিকভাবে সমর্থিত 5টি মডেলের জন্য একটি 2018 MacBook Pro-তে Chrome-এ অনুমান সময় (TensorFlow.js 1.5.2 অনুযায়ী) দেখায়:

ছোট মডেল

মডেল ওয়েবজিএল ডব্লিউএএসএম সিপিইউ স্মৃতি
ব্লেজফেস 22.5 ms 15.6 ms 315.2 ms .4 MB
ফেসমেশ 19.3 ms 19.2 ms 335 ms 2.8 MB

আরও বড় মডেল

মডেল ওয়েবজিএল ডব্লিউএএসএম সিপিইউ স্মৃতি
পোজনেট 42.5 ms 173.9 ms 1514.7 ms 4.5 MB
বডিপিক্স 77 ms 188.4 ms 2683 ms 4.6 MB
মোবাইলনেট v2 37 ms 94 ms 923.6 ms 13 এমবি

উপরের সারণীটি দেখায় যে WASM মডেল জুড়ে প্লেইন JS CPU ব্যাকএন্ডের চেয়ে 10-30x দ্রুত এবং BlazeFace- এর মতো ছোট মডেলগুলির জন্য WebGL-এর সাথে প্রতিযোগিতামূলক, যা হালকা ওজনের (400KB), তবুও একটি শালীন সংখ্যক অপ্স (~140) রয়েছে। প্রদত্ত যে WebGL প্রোগ্রামগুলির প্রতি অপ সম্পাদনের জন্য একটি নির্দিষ্ট ওভারহেড খরচ রয়েছে, এটি ব্যাখ্যা করে কেন ব্লেজফেসের মতো মডেলগুলি WASM-এ দ্রুততর হয়৷

এই ফলাফলগুলি আপনার ডিভাইসের উপর নির্ভর করে পরিবর্তিত হবে। আপনার অ্যাপ্লিকেশনের জন্য WASM সঠিক কিনা তা নির্ধারণ করার সর্বোত্তম উপায় হল আমাদের বিভিন্ন ব্যাকএন্ডে এটি পরীক্ষা করা।

অনুমান বনাম প্রশিক্ষণ

প্রাক-প্রশিক্ষিত মডেল স্থাপনের জন্য প্রাথমিক ব্যবহার-কেস মোকাবেলা করার জন্য, WASM ব্যাকএন্ড উন্নয়ন প্রশিক্ষণ সহায়তার উপর অনুমানকে অগ্রাধিকার দেবে। WASM-এ সমর্থিত অপের একটি আপ-টু-ডেট তালিকা দেখুন এবং আপনার মডেলে অসমর্থিত অপ্স থাকলে আমাদের জানান । প্রশিক্ষণ মডেলের জন্য, আমরা নোড (টেনসরফ্লো সি++) ব্যাকএন্ড বা ওয়েবজিএল ব্যাকএন্ড ব্যবহার করার পরামর্শ দিই।

CPU ব্যাকএন্ড

CPU ব্যাকএন্ড, 'cpu' হল সবচেয়ে কম পারফরম্যান্ট ব্যাকএন্ড, তবে এটি সবচেয়ে সহজ। অপারেশনগুলি ভ্যানিলা জাভাস্ক্রিপ্টে প্রয়োগ করা হয়, যা তাদের কম সমান্তরাল করে তোলে। তারা UI থ্রেডও ব্লক করে।

এই ব্যাকএন্ডটি পরীক্ষার জন্য বা WebGL অনুপলব্ধ ডিভাইসগুলিতে খুব উপযোগী হতে পারে।

পতাকা

TensorFlow.js-এ পরিবেশের পতাকার একটি সেট রয়েছে যা স্বয়ংক্রিয়ভাবে মূল্যায়ন করা হয় এবং বর্তমান প্ল্যাটফর্মে সেরা কনফিগারেশন নির্ধারণ করে। এই পতাকাগুলি বেশিরভাগই অভ্যন্তরীণ, তবে কয়েকটি গ্লোবাল পতাকা পাবলিক API দিয়ে নিয়ন্ত্রণ করা যেতে পারে।

  • tf.enableProdMode(): প্রোডাকশন মোড সক্ষম করে, যা মডেলের বৈধতা, NaN চেক এবং পারফরম্যান্সের পক্ষে অন্যান্য সঠিকতা পরীক্ষাগুলি সরিয়ে দেবে।
  • tf.enableDebugMode() : ডিবাগ মোড সক্ষম করে, যা সম্পাদিত প্রতিটি অপারেশন কনসোলে লগ করবে, সেইসাথে রানটাইম কর্মক্ষমতা তথ্য যেমন মেমরি ফুটপ্রিন্ট এবং মোট কার্নেল এক্সিকিউশন সময়। মনে রাখবেন যে এটি আপনার অ্যাপ্লিকেশনটিকে ব্যাপকভাবে ধীর করে দেবে, এটি উৎপাদনে ব্যবহার করবেন না।