দ্রুততর ওয়েব AI এর জন্য WebAssembly এবং WebGPU বর্ধিতকরণ, অংশ 1

জানুন কিভাবে WebAssembly এবং WebGPU বর্ধিতকরণগুলি ওয়েবে মেশিন লার্নিং কর্মক্ষমতা উন্নত করে।

অস্টিন ইঞ্জি
Austin Eng
দীপ্তি গন্ডলুরি
Deepti Gandluri
ফ্রাঁসোয়া বিউফোর্ট
François Beaufort

ওয়েবে এআই অনুমান

আমরা সবাই গল্প শুনেছি: এআই আমাদের বিশ্বকে বদলে দিচ্ছে। ওয়েব কোন ব্যতিক্রম নয়.

এই বছর ক্রোম কাস্টম থিম তৈরি এবং বা আপনাকে পাঠ্যের প্রথম খসড়া লিখতে সহায়তা সহ জেনারেটিভ AI বৈশিষ্ট্যগুলি যুক্ত করেছে৷ কিন্তু AI এর চেয়ে অনেক বেশি; AI নিজেরাই ওয়েব অ্যাপ্লিকেশন সমৃদ্ধ করতে পারে।

ওয়েব পৃষ্ঠাগুলি দৃষ্টিশক্তির জন্য বুদ্ধিমান উপাদানগুলি এম্বেড করতে পারে, যেমন মুখ বাছাই করা বা অঙ্গভঙ্গি সনাক্ত করা, অডিও শ্রেণীবিভাগের জন্য বা ভাষা সনাক্তকরণের জন্য। গত বছরে, আমরা ওয়েবে বৃহৎ ভাষার মডেলের কিছু সত্যিই চিত্তাকর্ষক ডেমো সহ জেনারেটিভ AI টেক অফ দেখেছি। ওয়েব ডেভেলপারদের জন্য ব্যবহারিক অন-ডিভাইস AI চেক করতে ভুলবেন না।

ওয়েবে AI অনুমান আজ ডিভাইসের একটি বড় অংশ জুড়ে উপলব্ধ, এবং AI প্রক্রিয়াকরণ ওয়েব পৃষ্ঠাতেই ঘটতে পারে, ব্যবহারকারীর ডিভাইসে হার্ডওয়্যার ব্যবহার করে।

এটি বিভিন্ন কারণে শক্তিশালী:

  • কম খরচ : ব্রাউজার ক্লায়েন্টের উপর অনুমান চালানো সার্ভারের খরচ উল্লেখযোগ্যভাবে হ্রাস করে, এবং এটি বিশেষ করে GenAI কোয়েরির জন্য উপযোগী হতে পারে, যা নিয়মিত প্রশ্নের চেয়ে বেশি ব্যয়বহুল অর্ডার হতে পারে।
  • লেটেন্সি : অডিও বা ভিডিও অ্যাপ্লিকেশানের মতো লেটেন্সির প্রতি বিশেষভাবে সংবেদনশীল অ্যাপ্লিকেশানগুলির জন্য - আপনার সমস্ত প্রক্রিয়াকরণ ডিভাইসে ঘটলে লেটেন্সি কমে যায়৷
  • গোপনীয়তা : ক্লায়েন্ট সাইডে চলমান, একটি নতুন শ্রেণীর অ্যাপ্লিকেশন আনলক করার সম্ভাবনা রয়েছে যার জন্য বর্ধিত গোপনীয়তা প্রয়োজন, যেখানে ডেটা সার্ভারে পাঠানো যাবে না।

কীভাবে AI ওয়ার্কলোডগুলি আজ ওয়েবে চলে৷

আজ, অ্যাপ্লিকেশন ডেভেলপার এবং গবেষকরা ফ্রেমওয়ার্ক ব্যবহার করে মডেল তৈরি করেন, মডেলগুলি ব্রাউজারে রানটাইম ব্যবহার করে যেমন Tensorflow.js বা ONNX রানটাইম ওয়েব ব্যবহার করে এবং রানটাইমগুলি সম্পাদনের জন্য ওয়েব API ব্যবহার করে।

এই সমস্ত রানটাইম শেষ পর্যন্ত CPU-তে JavaScript বা WebAssembly বা WebGL বা WebGPU-এর মাধ্যমে GPU-তে চলে যায়।

আজকের ওয়েবে এআই কাজের চাপ কীভাবে চলে তার চিত্র

মেশিন লার্নিং কাজের চাপ

মেশিন লার্নিং (ML) কাজের চাপ কম্পিউটেশনাল নোডের একটি গ্রাফের মাধ্যমে টেনসরগুলিকে ঠেলে দেয়। টেনসর হল এই নোডগুলির ইনপুট এবং আউটপুট যা ডেটার উপর প্রচুর পরিমাণে গণনা করে।

এটি গুরুত্বপূর্ণ, কারণ:

  • টেনসরগুলি অনেক বড় ডেটা স্ট্রাকচার, যা মডেলগুলিতে গণনা করে যার ওজন কয়েক বিলিয়ন থাকতে পারে
  • স্কেলিং এবং অনুমান ডেটা সমান্তরালতার দিকে নিয়ে যেতে পারে। এর মানে হল একই ক্রিয়াকলাপগুলি টেনসরগুলির সমস্ত উপাদান জুড়ে সঞ্চালিত হয়।
  • এমএল নির্ভুলতা প্রয়োজন হয় না. চাঁদে অবতরণ করার জন্য আপনার একটি 64-বিট ফ্লোটিং পয়েন্ট নম্বরের প্রয়োজন হতে পারে, তবে আপনার মুখের স্বীকৃতির জন্য শুধুমাত্র 8-বিট নম্বর বা তার কম সমুদ্রের প্রয়োজন হতে পারে।

সৌভাগ্যবশত, চিপ ডিজাইনাররা মডেলগুলিকে দ্রুত, ঠাণ্ডাভাবে চালানোর জন্য বৈশিষ্ট্যগুলি যোগ করেছে এবং এমনকি সেগুলিকে চালানো সম্ভব করে তোলে।

এদিকে, এখানে WebAssembly এবং WebGPU টিমে, আমরা ওয়েব ডেভেলপারদের কাছে সেই নতুন ক্ষমতাগুলি প্রকাশ করার জন্য কাজ করছি। আপনি যদি একজন ওয়েব অ্যাপ্লিকেশন ডেভেলপার হন, তাহলে আপনি এই নিম্ন-স্তরের আদিমগুলি ঘন ঘন ব্যবহার করতে পারবেন না। আমরা আশা করি আপনি যে টুলচেইন বা ফ্রেমওয়ার্কগুলি ব্যবহার করছেন তা নতুন বৈশিষ্ট্য এবং এক্সটেনশনগুলিকে সমর্থন করবে, এইভাবে আপনি আপনার অবকাঠামোতে ন্যূনতম পরিবর্তনের সাথে উপকৃত হতে পারেন। কিন্তু আপনি যদি পারফরম্যান্সের জন্য আপনার অ্যাপ্লিকেশনগুলিকে ম্যানুয়ালি টিউন করতে চান তবে এই বৈশিষ্ট্যগুলি আপনার কাজের সাথে প্রাসঙ্গিক।

ওয়েব অ্যাসেম্বলি

WebAssembly (Wasm) হল একটি কমপ্যাক্ট, দক্ষ বাইট কোড ফর্ম্যাট যা রানটাইম বুঝতে এবং কার্যকর করতে পারে। এটি অন্তর্নিহিত হার্ডওয়্যার ক্ষমতার সুবিধা নেওয়ার জন্য ডিজাইন করা হয়েছে, তাই এটি কাছাকাছি নেটিভ গতিতে কার্যকর করতে পারে। কোডটি যাচাই করা হয়েছে এবং একটি মেমরি-নিরাপদ, স্যান্ডবক্সযুক্ত পরিবেশে কার্যকর করা হয়।

Wasm মডিউল তথ্য একটি ঘন বাইনারি এনকোডিং সঙ্গে প্রতিনিধিত্ব করা হয়. একটি পাঠ্য-ভিত্তিক বিন্যাসের তুলনায়, এর অর্থ দ্রুত ডিকোডিং, দ্রুত লোডিং, মেমরির ব্যবহার হ্রাস। এটি পোর্টেবল এই অর্থে যে এটি অন্তর্নিহিত আর্কিটেকচার সম্পর্কে অনুমান করে না যা আধুনিক স্থাপত্যগুলিতে ইতিমধ্যে সাধারণ নয়।

WebAssembly স্পেসিফিকেশন পুনরাবৃত্তিমূলক এবং একটি খোলা W3C কমিউনিটি গ্রুপে কাজ করা হয়।

বাইনারি বিন্যাস হোস্ট পরিবেশ সম্পর্কে কোন অনুমান করে না, তাই এটি নন-ওয়েব এম্বেডিংগুলিতেও ভালভাবে কাজ করার জন্য ডিজাইন করা হয়েছে।

আপনার অ্যাপ্লিকেশন একবার কম্পাইল করা যেতে পারে, এবং সর্বত্র চালানো যেতে পারে: একটি ডেস্কটপ, ল্যাপটপ, একটি ফোন, বা ব্রাউজার সহ অন্য কোনো ডিভাইস৷ এই সম্পর্কে আরও জানতে WebAssembly-এর সাথে শেষ পর্যন্ত উপলব্ধি করা যে কোনও জায়গায় একবার লিখুন, চালান দেখুন।

একটি ল্যাপটপ, ট্যাবলেট এবং ফোনের চিত্র

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

ওয়েবে, পোর্টেবিলিটি এবং নিরাপত্তার জন্য, আমরা সাবধানে মূল্যায়ন করি যে কোন সেটটি প্রাইমিটিভ প্রকাশ পেয়েছে। এটি হার্ডওয়্যার দ্বারা প্রদত্ত সর্বাধিক কর্মক্ষমতা সহ ওয়েবের অ্যাক্সেসযোগ্যতার ভারসাম্য বজায় রাখে।

WebAssembly হল CPU-র একটি পোর্টেবল বিমূর্ততা, তাই সমস্ত Wasm অনুমান CPU-তে চালানো হয়। যদিও এটি সবচেয়ে কার্যকরী পছন্দ নয়, CPU গুলি ব্যাপকভাবে উপলব্ধ এবং বেশিরভাগ ডিভাইসে বেশিরভাগ কাজের চাপে কাজ করে।

টেক্সট বা অডিও ওয়ার্কলোডের মতো ছোট কাজের জন্য, GPU ব্যয়বহুল হবে। সাম্প্রতিক অনেক উদাহরণ রয়েছে যেখানে ওয়াসম সঠিক পছন্দ:

আপনি ওপেন সোর্স ডেমোতে আরও বেশি কিছু আবিষ্কার করতে পারেন, যেমন: whisper-tiny , llama.cpp , এবং Gemma2B ব্রাউজারে চলছে

আপনার অ্যাপ্লিকেশনের জন্য একটি সামগ্রিক পদ্ধতি গ্রহণ করুন

আপনার নির্দিষ্ট এমএল মডেল, অ্যাপ্লিকেশন পরিকাঠামো এবং ব্যবহারকারীদের জন্য সামগ্রিক উদ্দেশ্যযুক্ত অ্যাপ্লিকেশন অভিজ্ঞতার উপর ভিত্তি করে আদিম বেছে নেওয়া উচিত

উদাহরণস্বরূপ, MediaPipe-এর মুখের ল্যান্ডমার্ক সনাক্তকরণে, CPU অনুমান এবং GPU অনুমান তুলনাযোগ্য (একটি Apple M1 ডিভাইসে চলছে), কিন্তু এমন মডেল রয়েছে যেখানে বৈচিত্র উল্লেখযোগ্যভাবে বেশি হতে পারে।

এমএল ওয়ার্কলোডের ক্ষেত্রে, আমরা ফ্রেমওয়ার্ক লেখক এবং অ্যাপ্লিকেশন অংশীদারদের কথা শোনার সময়, সর্বাধিক অনুরোধকৃত বর্ধিতকরণগুলি বিকাশ এবং প্রেরণ করার জন্য একটি সম্পূর্ণ অ্যাপ্লিকেশন ভিউ বিবেচনা করি। এগুলি বিস্তৃতভাবে তিনটি বিভাগে পড়ে:

  • পারফরম্যান্সের জন্য গুরুত্বপূর্ণ CPU এক্সটেনশনগুলিকে প্রকাশ করুন
  • বড় মডেল চালানো সক্ষম করুন
  • অন্যান্য ওয়েব API-এর সাথে বিরামহীন ইন্টারপ সক্ষম করুন

দ্রুত গণনা

যেমনটি দাঁড়িয়েছে, WebAssembly স্পেক শুধুমাত্র নির্দেশাবলীর একটি নির্দিষ্ট সেট অন্তর্ভুক্ত করে যা আমরা ওয়েবে প্রকাশ করি। কিন্তু হার্ডওয়্যার নতুন নির্দেশনা যোগ করতে থাকে যা নেটিভ এবং WebAssembly পারফরম্যান্সের মধ্যে ব্যবধান বাড়ায়।

মনে রাখবেন, ML মডেলের সর্বদা উচ্চ মাত্রার নির্ভুলতার প্রয়োজন হয় না। রিলাক্সড SIMD হল এমন একটি প্রস্তাব যা কিছু কঠোর, অ-নিয়ন্ত্রকতামূলক প্রয়োজনীয়তা হ্রাস করে, যা কিছু ভেক্টর অপারেশনের জন্য দ্রুত কোডজেনের দিকে পরিচালিত করে যা কর্মক্ষমতার জন্য হট স্পট। আরও, রিলাক্সড সিমডি নতুন ডট প্রোডাক্ট এবং এফএমএ নির্দেশাবলী প্রবর্তন করে যা বিদ্যমান ওয়ার্কলোডকে 1.5 - 3 বার থেকে দ্রুত করে। এটি Chrome 114 এ পাঠানো হয়েছিল।

অর্ধ-নির্ভুলতা ফ্লোটিং পয়েন্ট ফরম্যাট IEEE FP16-এর জন্য 16-বিট ব্যবহার করে একক নির্ভুলতা মানগুলির জন্য ব্যবহৃত 32-বিটের পরিবর্তে। একক নির্ভুলতা মানের তুলনায়, অর্ধ-নির্ভুলতা মান ব্যবহার করার বিভিন্ন সুবিধা রয়েছে, মেমরির প্রয়োজনীয়তা হ্রাস করা হয়েছে, যা প্রশিক্ষণ এবং বৃহত্তর নিউরাল নেটওয়ার্ক স্থাপন, মেমরি ব্যান্ডউইথ হ্রাস করতে সক্ষম করে। হ্রাসকৃত নির্ভুলতা ডেটা স্থানান্তর এবং গণিত ক্রিয়াকলাপকে গতি দেয়।

আরও বড় মডেল

ওয়াসম রৈখিক মেমরির পয়েন্টারগুলিকে 32-বিট পূর্ণসংখ্যা হিসাবে উপস্থাপন করা হয়। এর দুটি পরিণতি রয়েছে: স্তূপের আকার 4GB-তে সীমাবদ্ধ (যখন কম্পিউটারে এর চেয়ে অনেক বেশি শারীরিক RAM থাকে), এবং যে অ্যাপ্লিকেশন কোডটি Wasm কে লক্ষ্য করে সেটিকে 32-বিট পয়েন্টার আকারের সাথে সামঞ্জস্যপূর্ণ হতে হবে (যা)।

বিশেষ করে আমাদের আজকের মতো বড় মডেলগুলির সাথে, এই মডেলগুলিকে WebAssembly-এ লোড করা সীমাবদ্ধ হতে পারে৷ Memory64 প্রস্তাবটি 4GB এর চেয়ে বড় এবং নেটিভ প্ল্যাটফর্মের ঠিকানা স্থানের সাথে মেলে এমন লিনিয়ার মেমরির মাধ্যমে এই সীমাবদ্ধতাগুলি সরিয়ে দেয়।

আমরা Chrome-এ সম্পূর্ণ কার্যকরী বাস্তবায়ন করেছি এবং এই বছরের শেষের দিকে পাঠানো হবে বলে অনুমান করা হচ্ছে। আপাতত, আপনি পতাকা chrome://flags/#enable-experimental-webassembly-features নিয়ে পরীক্ষা চালাতে পারেন এবং আমাদের প্রতিক্রিয়া পাঠাতে পারেন।

আরও ভাল ওয়েব ইন্টারপ

WebAssembly ওয়েবে বিশেষ উদ্দেশ্য কম্পিউটের জন্য এন্ট্রি পয়েন্ট হতে পারে।

WebAssembly ওয়েবে GPU অ্যাপ্লিকেশন আনতে ব্যবহার করা যেতে পারে। এর অর্থ হল একই C++ অ্যাপ্লিকেশন যা ডিভাইসে চালাতে পারে ছোট পরিবর্তন সহ ওয়েবেও চলতে পারে।

Emscripten , Wasm কম্পাইলার টুলচেন, ইতিমধ্যে WebGPU-এর জন্য বাইন্ডিং আছে। এটি ওয়েবে AI অনুমানের জন্য এন্ট্রি পয়েন্ট, তাই এটি গুরুত্বপূর্ণ যে Wasm বাকী ওয়েব প্ল্যাটফর্মের সাথে নির্বিঘ্নে ইন্টারঅপারেটিং করতে পারে। আমরা এই স্থানটিতে কয়েকটি ভিন্ন প্রস্তাব নিয়ে কাজ করছি।

জাভাস্ক্রিপ্ট প্রতিশ্রুতি একীকরণ (JSPI)

সাধারণ C এবং C++ (পাশাপাশি অন্যান্য অনেক ভাষা) অ্যাপ্লিকেশনগুলি সাধারণত একটি সিঙ্ক্রোনাস API এর বিপরীতে লেখা হয়। এর মানে হল যে অপারেশনটি সম্পূর্ণ না হওয়া পর্যন্ত অ্যাপ্লিকেশনটি কার্যকর করা বন্ধ করবে। এই ধরনের ব্লকিং অ্যাপ্লিকেশানগুলি সাধারণত অ্যাসিঙ্ক-সচেতন অ্যাপ্লিকেশানগুলির তুলনায় লিখতে আরও স্বজ্ঞাত।

যখন ব্যয়বহুল অপারেশনগুলি প্রধান থ্রেডকে ব্লক করে, তখন তারা I/O ব্লক করতে পারে এবং জ্যাঙ্ক ব্যবহারকারীদের কাছে দৃশ্যমান হয়। নেটিভ অ্যাপ্লিকেশনের একটি সিঙ্ক্রোনাস প্রোগ্রামিং মডেল এবং ওয়েবের অ্যাসিঙ্ক্রোনাস মডেলের মধ্যে একটি অমিল রয়েছে৷ এটি লিগ্যাসি অ্যাপ্লিকেশনগুলির জন্য বিশেষত সমস্যাযুক্ত, যা পোর্ট করা ব্যয়বহুল। Emscripten Asyncify এর সাথে এটি করার একটি উপায় সরবরাহ করে, তবে এটি সর্বদা সর্বোত্তম বিকল্প নয় - বড় কোডের আকার এবং ততটা দক্ষ নয়।

নিম্নলিখিত উদাহরণ হল কম্পিউটিং ফিবোনাচি, যোগ করার জন্য জাভাস্ক্রিপ্ট প্রতিশ্রুতি ব্যবহার করে।

long promiseFib(long x) {
 if (x == 0)
   return 0;
 if (x == 1)
   return 1;
 return promiseAdd(promiseFib(x - 1), promiseFib(x - 2));
}
// promise an addition
EM_ASYNC_JS(long, promiseAdd, (long x, long y), {
  return Promise.resolve(x+y);
});
emcc -O3 fib.c -o b.html -s ASYNCIFY=2

এই উদাহরণে, নিম্নলিখিতগুলিতে মনোযোগ দিন:

  • EM_ASYNC_JS ম্যাক্রো সমস্ত প্রয়োজনীয় আঠালো কোড তৈরি করে যাতে আমরা প্রতিশ্রুতির ফলাফল অ্যাক্সেস করতে JSPI ব্যবহার করতে পারি, ঠিক যেমন এটি একটি সাধারণ ফাংশনের জন্য হবে।
  • বিশেষ কমান্ড লাইন বিকল্প, -s ASYNCIFY=2 । এটি জাভাস্ক্রিপ্ট আমদানির সাথে ইন্টারফেস করতে JSPI ব্যবহার করে এমন কোড জেনারেট করার বিকল্পটি চালু করে যা প্রতিশ্রুতি দেয়।

JSPI, এটি কীভাবে ব্যবহার করবেন এবং এর সুবিধা সম্পর্কে আরও জানতে, v8.dev-এ WebAssembly JavaScript প্রতিশ্রুতি ইন্টিগ্রেশন API এর পরিচিতি পড়ুন। বর্তমান মূল বিচার সম্পর্কে জানুন।

মেমরি নিয়ন্ত্রণ

ডেভেলপারদের Wasm মেমরির উপর খুব কম নিয়ন্ত্রণ আছে; মডিউল তার নিজস্ব মেমরির মালিক। এই মেমরি অ্যাক্সেস করার জন্য যে কোনো API গুলিকে অবশ্যই অনুলিপি বা অনুলিপি করতে হবে এবং এই ব্যবহারটি সত্যিই যোগ করতে পারে। উদাহরণস্বরূপ, একটি গ্রাফিক্স অ্যাপ্লিকেশন প্রতিটি ফ্রেমের জন্য অনুলিপি করতে এবং অনুলিপি করতে হতে পারে।

মেমরি কন্ট্রোল প্রস্তাবের লক্ষ্য হল Wasm রৈখিক মেমরির উপর সূক্ষ্ম দানাদার নিয়ন্ত্রণ প্রদান করা এবং অ্যাপ্লিকেশন পাইপলাইন জুড়ে কপির সংখ্যা কমানো। এই প্রস্তাবটি ফেজ 1-এ রয়েছে, আমরা স্ট্যান্ডার্ডের বিবর্তন সম্পর্কে জানাতে Chrome এর জাভাস্ক্রিপ্ট ইঞ্জিন V8-এ প্রোটোটাইপ করছি।

কোন ব্যাকএন্ড আপনার জন্য সঠিক তা নির্ধারণ করুন

যদিও CPU সর্বব্যাপী, এটি সর্বদা সর্বোত্তম বিকল্প নয়। জিপিইউ বা এক্সিলারেটরগুলিতে বিশেষ উদ্দেশ্য কম্পিউটগুলি পারফরম্যান্স অফার করতে পারে যা উচ্চ মাত্রার অর্ডার, বিশেষত বড় মডেল এবং উচ্চ-সম্পন্ন ডিভাইসগুলিতে। এটি নেটিভ অ্যাপ্লিকেশন এবং ওয়েব অ্যাপ্লিকেশন উভয়ের জন্যই সত্য।

আপনি কোন ব্যাকএন্ড বেছে নেবেন তা নির্ভর করে অ্যাপ্লিকেশন, ফ্রেমওয়ার্ক বা টুলচেইনের উপর, সেইসাথে কর্মক্ষমতাকে প্রভাবিত করে এমন অন্যান্য কারণের উপর। তাতে বলা হয়েছে, আমরা এমন প্রস্তাবে বিনিয়োগ চালিয়ে যাচ্ছি যা মূল Wasm কে বাকি ওয়েব প্ল্যাটফর্মের সাথে এবং আরও নির্দিষ্টভাবে WebGPU-এর সাথে ভালভাবে কাজ করতে সক্ষম করে।

পার্ট 2 পড়া চালিয়ে যান