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

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() , মান যখন গণনার আসলে সম্পন্ন করেছে সমাধান হবে। এটি গুরুত্বপূর্ণ অ্যাসিঙ্ক্রোনাস ব্যবহার করে তোলে x.data() এবং x.array() তাদের সমলয় প্রতিরূপ উপর পদ্ধতি x.dataSync() এবং x.arraySync() ইউআই থ্রেড যখন গণনার সম্পন্ন হয়ে ব্লক এড়ানো।

স্মৃতি ব্যবস্থাপনা

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 বিট ভাসমান সংখ্যার মতো একটি মোবাইল ডিভাইসের জন্য একটি মডেল porting শুধুমাত্র সীমার মধ্যে সংখ্যার উপস্থাপন করতে পারেন হতে পারে [0.000000059605, 65504] । এর মানে হল যে আপনার সতর্ক হওয়া উচিত যে আপনার মডেলের ওজন এবং অ্যাক্টিভেশন এই পরিসীমা অতিক্রম না করে। ডিভাইস সমর্থন 32 বিট অঙ্গবিন্যাস, মান পরীক্ষা কিনা তা যাচাই করতে tf.ENV.getBool('WEBGL_RENDER_FLOAT32_CAPABLE') , যদি এই মিথ্যা তারপর ডিভাইস শুধুমাত্র 16 বিট ফ্লোটিং পয়েন্ট অঙ্গবিন্যাস সমর্থন করে। আপনি ব্যবহার করতে পারেন tf.ENV.getBool('WEBGL_RENDER_FLOAT32_ENABLED') যদি TensorFlow.js বর্তমানে 32 বিট অঙ্গবিন্যাস ব্যবহার করছে করো।

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

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

TensorFlow.js এছাড়াও WebGLTexture হিসাবে tf.Tensor ডেটা সঞ্চয় করে। যখন একটি tf.Tensor সৃষ্টি করা হয়, আমরা অবিলম্বে জিপিইউ ডেটা আপলোড করবেন না, বরং আমরা 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 সিঙ্ক্রোনাস s। যাইহোক, WebGL ব্যাকএন্ডের বিপরীতে, আপনি টেনসর ফিরে পাওয়ার আগে অপারেশনটি সম্পন্ন হয়। এর অর্থ এই যে একটি কল tf.matMul(a, b) ইউআই থ্রেড অবরুদ্ধ করবে।

এই কারণে, আপনি যদি এটি একটি প্রোডাকশন অ্যাপ্লিকেশনে ব্যবহার করতে চান, তাহলে মূল থ্রেডটি ব্লক না করার জন্য আপনাকে কর্মী থ্রেডগুলিতে 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 আগে আপনি ব্যাকএন্ড আরম্ভ। দেখুন "ব্যবহার করে Bundlers" আরও তথ্যের জন্য README অধ্যায়:

import {setWasmPath} from '@tensorflow/tfjs-backend-wasm';
setWasmPath(yourCustomPath);
tf.setBackend('wasm');
tf.ready().then(() => {...});
কেন WASM?

WASM একটি নতুন ওয়েব ভিত্তিক বাইনারি ফর্ম্যাটে যেমন 2015 চালু হয়, ওয়েবে চালানোর জন্য জাভাস্ক্রিপ্ট, সি, সি ++, ইত্যাদি একটি সঙ্কলন লক্ষ্য লেখা প্রোগ্রাম করে। 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 ব্যবহার করব?

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

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

ছোট মডেল

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

আরও বড় মডেল

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

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

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

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

CPU ব্যাকএন্ড

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

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

পতাকা

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

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