এই ডকুমেন্টটি হল ওয়েব অ্যাসেম্বলি এবং ওয়েবজিপিইউ বর্ধিতকরণের একটি ধারাবাহিকতা দ্রুততর ওয়েব এআই, পার্ট 1 । আমরা আপনাকে এই পোস্টটি পড়ার পরামর্শ দিচ্ছি বা চালিয়ে যাওয়ার আগে IO 24 এ আলোচনাটি দেখুন ৷
ওয়েবজিপিইউ
WebGPU দক্ষ, উচ্চ-সমান্তরাল গণনা সম্পাদন করতে ক্লায়েন্টের GPU হার্ডওয়্যারে ওয়েব অ্যাপ্লিকেশনগুলিকে অ্যাক্সেস দেয়। Chrome-এ WebGPU চালু করার পর থেকে, আমরা ওয়েবে কৃত্রিম বুদ্ধিমত্তা (AI) এবং মেশিন লার্নিং (ML) এর অবিশ্বাস্য ডেমো দেখেছি।
উদাহরণস্বরূপ, ওয়েব স্টেবল ডিফিউশন দেখিয়েছে যে সরাসরি ব্রাউজারে টেক্সট থেকে ইমেজ তৈরি করতে AI ব্যবহার করা সম্ভব। এই বছরের শুরুর দিকে, Google এর নিজস্ব Mediapipe টিম বৃহৎ ভাষা মডেল অনুমানের জন্য পরীক্ষামূলক সমর্থন প্রকাশ করেছে।
নিচের অ্যানিমেশনটি Gemma , Google-এর ওপেন সোর্স লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) দেখায়, যা সম্পূর্ণরূপে Chrome-এ ডিভাইসে চলে, বাস্তব সময়ে৷
মেটার সেগমেন্ট এনিথিং মডেলের নিম্নলিখিত আলিঙ্গন মুখের ডেমোটি সম্পূর্ণরূপে ক্লায়েন্টের উপর উচ্চ মানের অবজেক্ট মাস্ক তৈরি করে।
এগুলি কয়েকটি আশ্চর্যজনক প্রকল্প যা AI এবং ML-এর জন্য WebGPU-এর শক্তি প্রদর্শন করে৷ WebGPU এই মডেলগুলি এবং অন্যদেরকে CPU-তে যতটা সম্ভব তার চেয়ে উল্লেখযোগ্যভাবে দ্রুত চালানোর অনুমতি দেয়।
টেক্সট এম্বেডিংয়ের জন্য হাগিং ফেসের ওয়েবজিপিইউ বেঞ্চমার্ক একই মডেলের একটি সিপিইউ বাস্তবায়নের তুলনায় অসাধারণ গতি প্রদর্শন করে। একটি Apple M1 Max ল্যাপটপে, WebGPU 30 গুণ বেশি দ্রুত ছিল। অন্যরা রিপোর্ট করেছেন যে WebGPU বেঞ্চমার্ককে 120 গুণের বেশি ত্বরান্বিত করে।
AI এবং ML এর জন্য WebGPU বৈশিষ্ট্য উন্নত করা
WebGPU AI এবং ML মডেলগুলির জন্য দুর্দান্ত, যার বিলিয়ন প্যারামিটার থাকতে পারে, কম্পিউট শেডারগুলির সমর্থনের জন্য ধন্যবাদ৷ কম্পিউট শেডারগুলি GPU-তে চলে এবং বৃহৎ পরিমাণ ডেটাতে সমান্তরাল অ্যারে অপারেশন চালাতে সাহায্য করে।
গত বছরে WebGPU-তে অসংখ্য উন্নতির মধ্যে, আমরা ওয়েবে ML এবং AI পারফরম্যান্স উন্নত করার জন্য আরও ক্ষমতা যোগ করা অব্যাহত রেখেছি। সম্প্রতি, আমরা দুটি নতুন বৈশিষ্ট্য চালু করেছি: 16-বিট ফ্লোটিং পয়েন্ট এবং প্যাকড ইন্টিজার ডট পণ্য।
16-বিট ফ্লোটিং পয়েন্ট
মনে রাখবেন, এমএল ওয়ার্কলোডের নির্ভুলতার প্রয়োজন হয় না । shader-f16
হল একটি বৈশিষ্ট্য যা ওয়েবজিপিইউ শেডিং ভাষায় f16 টাইপ ব্যবহার করতে সক্ষম করে। এই ফ্লোটিং পয়েন্ট টাইপ স্বাভাবিক 32 বিটের পরিবর্তে 16 বিট নেয়। f16 এর একটি ছোট পরিসর রয়েছে এবং এটি কম সুনির্দিষ্ট, তবে অনেক ML মডেলের জন্য এটি যথেষ্ট।
এই বৈশিষ্ট্যটি কয়েকটি উপায়ে দক্ষতা বাড়ায়:
হ্রাসকৃত মেমরি : f16 উপাদান সহ টেনসরগুলি অর্ধেক স্থান নেয়, যা অর্ধেক মেমরির ব্যবহারকে হ্রাস করে। জিপিইউ কম্পিউটেশনগুলি প্রায়ই মেমরি ব্যান্ডউইথের উপর বাধাগ্রস্ত হয়, তাই অর্ধেক মেমরি প্রায়শই শেডারগুলিকে দ্বিগুণ দ্রুত চালানোর অর্থ হতে পারে। প্রযুক্তিগতভাবে, মেমরি ব্যান্ডউইথ সংরক্ষণ করতে আপনার f16 এর প্রয়োজন নেই। কম-নির্ভুলতা বিন্যাসে ডেটা সংরক্ষণ করা সম্ভব, এবং তারপর গণনার জন্য শেডারে এটিকে সম্পূর্ণ f32-এ প্রসারিত করুন। কিন্তু, GPU ডেটা প্যাক এবং আনপ্যাক করতে অতিরিক্ত কম্পিউটিং শক্তি ব্যয় করে।
হ্রাসকৃত ডেটা রূপান্তর : f16 ডেটা রূপান্তর হ্রাস করে কম গণনা ব্যবহার করে। কম নির্ভুলতা ডেটা সংরক্ষণ করা যেতে পারে এবং তারপরে রূপান্তর ছাড়াই সরাসরি ব্যবহার করা যেতে পারে।
বর্ধিত সমান্তরালতা : আধুনিক জিপিইউগুলি জিপিইউ-এর এক্সিকিউশন ইউনিটগুলিতে একই সাথে আরও মান ফিট করতে সক্ষম, এটিকে আরও বেশি সংখ্যক সমান্তরাল গণনা করতে দেয়। উদাহরণস্বরূপ, একটি জিপিইউ যা প্রতি সেকেন্ডে 5 ট্রিলিয়ন f32 ফ্লোটিং-পয়েন্ট অপারেশন সমর্থন করে প্রতি সেকেন্ডে 10 ট্রিলিয়ন f16 ফ্লোটিং-পয়েন্ট অপারেশন সমর্থন করতে পারে।

shader-f16
এর সাথে, টেক্সট এম্বেডিং বেঞ্চমার্কের জন্য Hugging Face-এর WebGPU বেঞ্চমার্ক Apple M1 Max ল্যাপটপে f32 এর চেয়ে 3 গুণ দ্রুত বেঞ্চমার্ক চালায়।WebLLM হল একটি প্রকল্প যা একাধিক বড় ভাষার মডেল চালাতে পারে। এটি Apache TVM ব্যবহার করে, একটি ওপেন সোর্স মেশিন লার্নিং কম্পাইলার ফ্রেমওয়ার্ক।
আমি WebLLM কে Llama 3 আট-বিলিয়ন প্যারামিটার মডেল ব্যবহার করে প্যারিস ভ্রমণের পরিকল্পনা করতে বলেছি। ফলাফলগুলি দেখায় যে মডেলের প্রিফিল পর্বের সময়, f16 f32 এর চেয়ে 2.1 গুণ দ্রুত। ডিকোড পর্বের সময়, এটি 1.3 গুণ বেশি দ্রুত।
অ্যাপ্লিকেশনগুলিকে প্রথমে নিশ্চিত করতে হবে যে GPU অ্যাডাপ্টারটি f16 সমর্থন করে এবং এটি উপলব্ধ থাকলে, একটি GPU ডিভাইসের অনুরোধ করার সময় স্পষ্টভাবে এটি সক্ষম করুন৷ যদি f16 সমর্থিত না হয়, আপনি requiredFeatures
অ্যারেতে এটির অনুরোধ করতে পারবেন না।
// main.js
const adapter = await navigator.gpu.requestAdapter();
const supportsF16 = adapter.features.has('shader-f16');
if (supportsF16) {
// Use f16.
const device = await adapter.requestDevice({
requiredFeatures: ['shader-f16'],
});
initApp(device);
}
তারপর, আপনার WebGPU শেডারগুলিতে, আপনাকে অবশ্যই শীর্ষে স্পষ্টভাবে f16 সক্ষম করতে হবে। এর পরে, আপনি এটিকে অন্য যেকোন ফ্লোট ডেটা টাইপের মতো শেডারের মধ্যে ব্যবহার করতে পারবেন।
// my-shader.wgsl
enable f16;
struct Data {
values : array<vec4<f16>>
}
@group(0) @binding(0) var<storage, read> data : Data;
@compute @workgroup_size(64) fn main(@builtin(global_invocation_id) gid : vec3u) {
let value : vec4<f16> = data.values[gid.x];
...
}
প্যাকড পূর্ণসংখ্যা ডট পণ্য
অনেক মডেল এখনও মাত্র 8 বিট নির্ভুলতা (f16-এর অর্ধেক) দিয়ে ভাল কাজ করে। বিভাজন এবং বস্তুর স্বীকৃতির জন্য এটি এলএলএম এবং চিত্র মডেলগুলির মধ্যে জনপ্রিয়। এটি বলেছে, মডেলগুলির আউটপুট গুণমান কম নির্ভুলতার সাথে হ্রাস পায়, তাই 8-বিট কোয়ান্টাইজেশন প্রতিটি অ্যাপ্লিকেশনের জন্য উপযুক্ত নয়।
তুলনামূলকভাবে কিছু GPU নেটিভভাবে 8-বিট মান সমর্থন করে। এখানেই প্যাক করা পূর্ণসংখ্যা ডট পণ্য আসে। আমরা Chrome 123 এ DP4a পাঠিয়েছি।
আধুনিক জিপিইউ-তে দুটি 32-বিট পূর্ণসংখ্যা নেওয়ার জন্য বিশেষ নির্দেশাবলী রয়েছে, তাদের প্রতিটিকে 4টি পরপর-প্যাক করা 8-বিট পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করুন এবং তাদের উপাদানগুলির মধ্যে ডট পণ্য গণনা করুন।
এটি এআই এবং মেশিন লার্নিংয়ের জন্য বিশেষভাবে উপযোগী কারণ ম্যাট্রিক্স গুণন কার্নেলগুলি অনেকগুলি, অনেকগুলি ডট পণ্যের সমন্বয়ে গঠিত।
উদাহরণস্বরূপ, একটি 8 x 1 ভেক্টর দিয়ে একটি 4 x 8 ম্যাট্রিক্সকে গুণ করি। আউটপুট ভেক্টরের প্রতিটি মান গণনা করার জন্য এটি কম্পিউট করার জন্য 4টি ডট পণ্য নেওয়া জড়িত; A, B, C, এবং D.
এই প্রতিটি আউটপুট গণনা করার প্রক্রিয়া একই; আমরা তাদের একটি কম্পিউটিং জড়িত পদক্ষেপ তাকান হবে. যেকোন গণনার আগে, আমাদের প্রথমে 8-বিট পূর্ণসংখ্যা ডেটাকে এমন একটি টাইপে রূপান্তর করতে হবে যার সাথে আমরা পাটিগণিত করতে পারি, যেমন f16। তারপর, আমরা একটি উপাদান-ভিত্তিক গুণ চালাই এবং অবশেষে, সমস্ত পণ্য একসাথে যোগ করি। মোট, সমগ্র ম্যাট্রিক্স-ভেক্টর গুণনের জন্য, আমরা ডেটা আনপ্যাক করার জন্য 40টি পূর্ণসংখ্যা ফ্লোট কনভার্সন করি, 32টি ফ্লোট গুণন এবং 28টি ফ্লোট সংযোজন করি।
আরও অপারেশন সহ বড় ম্যাট্রিক্সের জন্য, প্যাক করা পূর্ণসংখ্যা ডট পণ্যগুলি কাজের পরিমাণ কমাতে সাহায্য করতে পারে।
ফলাফল ভেক্টরের প্রতিটি আউটপুটের জন্য, আমরা WebGPU শেডিং ল্যাঙ্গুয়েজ বিল্ট-ইন dot4U8Packed
ব্যবহার করে দুটি প্যাকড ডট প্রোডাক্ট অপারেশন করি এবং তারপর একসাথে ফলাফল যোগ করি। মোট, সমগ্র ম্যাট্রিক্স-ভেক্টর গুণনের জন্য, আমরা কোনো ডেটা রূপান্তর করি না। আমরা 8টি প্যাকড ডট পণ্য এবং 4টি পূর্ণসংখ্যা যোগ করি।
আমরা বিভিন্ন ভোক্তা জিপিইউতে 8-বিট ডেটা সহ প্যাকড ইন্টিজার ডট পণ্যগুলি পরীক্ষা করেছি। 16-বিট ফ্লোটিং পয়েন্টের তুলনায়, আমরা দেখতে পাচ্ছি যে 8-বিট 1.6 থেকে 2.8 গুণ দ্রুত। যখন আমরা অতিরিক্তভাবে প্যাকড পূর্ণসংখ্যা ডট পণ্য ব্যবহার করি, তখন কর্মক্ষমতা আরও ভালো হয়। এটি 1.7 থেকে 2.9 গুণ দ্রুত।

wgslLanguageFeatures
সম্পত্তির সাথে ব্রাউজার সমর্থনের জন্য পরীক্ষা করুন। যদি GPU প্যাকড ডট পণ্যগুলিকে স্থানীয়ভাবে সমর্থন না করে, তাহলে ব্রাউজারটি তার নিজস্ব বাস্তবায়ন পলিফিল করে।
// main.js
if (navigator.gpu.wgslLanguageFeatures.has('packed_4x8_integer_dot_product')) {
// Use dot4U8Packed, dot4I8Packed builtin
// functions in the shaders.
}
নিম্নলিখিত কোড স্নিপেট পার্থক্য (পার্থক্য) একটি WebGPU শেডারে প্যাক করা পূর্ণসংখ্যা পণ্য ব্যবহার করার জন্য প্রয়োজনীয় পরিবর্তনগুলিকে হাইলাইট করে৷
আগে — একটি WebGPU শেডার যা ভেরিয়েবল `sum`-এ আংশিক ডট পণ্য জমা করে। লুপের শেষে, একটি ভেক্টর এবং ইনপুট ম্যাট্রিক্সের একটি সারির মধ্যে 'সমষ্টি' সম্পূর্ণ ডট পণ্যটিকে ধরে রাখে।
// my-dot-product.wgsl @compute @workgroup_size(64) fn main(@builtin(global_invocation_id) gid : vec3u) { var sum : f16; let start = gid.x * uniforms.dim; for (var i = 0u; i < uniforms.dim; i++) { let v1 : vec4<f16> = vector.values[i]; let v2 : vec4<f16> = matrix.values[start + i]; sum += dot(v1, v2); } }
পরে — প্যাক করা পূর্ণসংখ্যা ডট পণ্য ব্যবহার করার জন্য লেখা একটি WebGPU শেডার। প্রধান পার্থক্য হল ভেক্টর এবং ম্যাট্রিক্স থেকে 4টি ফ্লোট মান লোড করার পরিবর্তে, এই শেডারটি একটি একক 32-বিট পূর্ণসংখ্যা লোড করে। এই 32-বিট পূর্ণসংখ্যা চারটি 8-বিট পূর্ণসংখ্যা মানের ডেটা ধারণ করে। তারপর, আমরা দুটি মানের ডট পণ্য গণনা করতে dot4U8Packed
কল করি।
// my-dot-product.wgsl
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) gid : vec3u) {
var sum : f32;
let start = gid.x * uniforms.dim;
for (var i = 0u; i < uniforms.dim; i++) {
let v1 : u32 = vector.values[i];
let v2 : u32 = matrix.values[start + i];
sum += dot4U8Packed(v1, v2);
}
}
16-বিট ফ্লোটিং পয়েন্ট এবং প্যাকড ইন্টিজার ডট পণ্য উভয়ই ক্রোমে পাঠানো বৈশিষ্ট্য যা AI এবং ML-কে ত্বরান্বিত করে। 16-বিট ফ্লোটিং পয়েন্ট উপলব্ধ থাকে যখন হার্ডওয়্যার এটিকে সমর্থন করে এবং Chrome সমস্ত ডিভাইসে প্যাকড ইন্টিজার ডট পণ্যগুলি প্রয়োগ করে৷
আপনি আরও ভাল পারফরম্যান্স অর্জন করতে আজই Chrome Stable-এ এই বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন৷
প্রস্তাবিত বৈশিষ্ট্য
সামনের দিকে তাকিয়ে, আমরা আরও দুটি বৈশিষ্ট্য অনুসন্ধান করছি: উপগোষ্ঠী এবং সমবায় ম্যাট্রিক্স গুন।
সাবগ্রুপ বৈশিষ্ট্যটি SIMD-স্তরের সমান্তরালতাকে যোগাযোগ করতে বা সমষ্টিগত গণিত ক্রিয়াকলাপ সম্পাদন করতে সক্ষম করে, যেমন 16টির বেশি সংখ্যার জন্য একটি যোগফল। এটি দক্ষ ক্রস-থ্রেড ডেটা ভাগ করে নেওয়ার অনুমতি দেয়। সাবগ্রুপগুলি আধুনিক GPUs API-এ সমর্থিত, বিভিন্ন নাম সহ এবং সামান্য ভিন্ন আকারে।
আমরা সাধারণ সেটটিকে একটি প্রস্তাবে পাতিয়েছি যা আমরা WebGPU মানককরণ গ্রুপে নিয়েছি। এবং, আমরা একটি পরীক্ষামূলক পতাকার পিছনে Chrome-এ উপগোষ্ঠীগুলিকে প্রোটোটাইপ করেছি এবং আমাদের প্রাথমিক ফলাফলগুলিকে আলোচনায় নিয়ে এসেছি৷ মূল বিষয় হল কিভাবে পোর্টেবল আচরণ নিশ্চিত করা যায়।
কোঅপারেটিভ ম্যাট্রিক্স মাল্টিপ্লাই হল GPU-তে সাম্প্রতিক সংযোজন। একটি বড় ম্যাট্রিক্স গুণকে একাধিক ছোট ম্যাট্রিক্স গুণে ভাগ করা যেতে পারে। সমবায় ম্যাট্রিক্স গুন একক যৌক্তিক ধাপে এই ছোট স্থির-আকারের ব্লকগুলিতে গুণন সম্পাদন করে। সেই ধাপের মধ্যে, থ্রেডের একটি গ্রুপ ফলাফল গণনা করতে দক্ষতার সাথে সহযোগিতা করে।
আমরা অন্তর্নিহিত GPU API-এ সমর্থন জরিপ করেছি , এবং WebGPU মানককরণ গ্রুপের কাছে একটি প্রস্তাব উপস্থাপন করার পরিকল্পনা করেছি। সাবগ্রুপগুলির মতো, আমরা আশা করি যে বেশিরভাগ আলোচনা পোর্টেবিলিটির চারপাশে কেন্দ্রীভূত হবে।
সাবগ্রুপ ক্রিয়াকলাপগুলির কার্যকারিতা মূল্যায়ন করার জন্য, একটি বাস্তব অ্যাপ্লিকেশনে, আমরা MediaPipe-এ সাবগ্রুপগুলির জন্য পরীক্ষামূলক সমর্থনকে একীভূত করেছি এবং সাবগ্রুপ অপারেশনগুলির জন্য Chrome এর প্রোটোটাইপের সাথে এটি পরীক্ষা করেছি৷
আমরা বড় ভাষা মডেলের প্রিফিল ফেজের GPU কার্নেলে সাবগ্রুপ ব্যবহার করেছি, তাই আমি শুধুমাত্র প্রিফিল ফেজের জন্য স্পিডআপ রিপোর্ট করছি। একটি ইন্টেল জিপিইউতে, আমরা দেখতে পাই যে সাবগ্রুপগুলি বেসলাইনের চেয়ে আড়াই গুণ দ্রুত কাজ করে। যাইহোক, এই উন্নতিগুলি বিভিন্ন GPU তে সামঞ্জস্যপূর্ণ নয়।

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

GPU অপ্টিমাইজেশান কঠিন
শেষ পর্যন্ত, আপনার GPU অপ্টিমাইজ করার সর্বোত্তম উপায় ক্লায়েন্ট কি GPU অফার করে তার উপর নির্ভর করে। অভিনব নতুন GPU বৈশিষ্ট্যগুলি ব্যবহার করা সর্বদা আপনি যেভাবে আশা করতে পারেন সেভাবে অর্থ প্রদান করে না, কারণ এতে অনেক জটিল কারণ জড়িত থাকতে পারে। একটি জিপিইউতে সেরা অপ্টিমাইজেশন কৌশল অন্য জিপিইউতে সেরা কৌশল নাও হতে পারে।
আপনি GPU-এর কম্পিউটিং থ্রেডগুলি সম্পূর্ণরূপে ব্যবহার করার সময় মেমরি ব্যান্ডউইথ কমাতে চান।
মেমরি অ্যাক্সেস প্যাটার্ন সত্যিই গুরুত্বপূর্ণ হতে পারে, খুব. কম্পিউট থ্রেডগুলি হার্ডওয়্যারের জন্য সর্বোত্তম প্যাটার্নে মেমরি অ্যাক্সেস করার সময় জিপিইউগুলি আরও ভাল পারফর্ম করে। গুরুত্বপূর্ণ: আপনি বিভিন্ন GPU হার্ডওয়্যারে বিভিন্ন কর্মক্ষমতা বৈশিষ্ট্য আশা করা উচিত। আপনাকে GPU এর উপর নির্ভর করে বিভিন্ন অপ্টিমাইজেশন চালানোর প্রয়োজন হতে পারে।
নিম্নলিখিত চার্টে, আমরা একই ম্যাট্রিক্স মাল্টিপ্লাই অ্যালগরিদম নিয়েছি, কিন্তু বিভিন্ন অপ্টিমাইজেশান কৌশলের প্রভাব এবং বিভিন্ন GPU তে জটিলতা এবং ভিন্নতা আরও প্রদর্শন করতে আরেকটি মাত্রা যোগ করেছি। আমরা এখানে একটি নতুন কৌশল প্রবর্তন করেছি, যাকে আমরা "Swizzle" বলব। সুইজল হার্ডওয়্যারের জন্য আরও অনুকূল হতে মেমরি অ্যাক্সেস প্যাটার্নগুলিকে অপ্টিমাইজ করে।
আপনি দেখতে পারেন যে মেমরি সুইজল একটি উল্লেখযোগ্য প্রভাব আছে; এটি কখনও কখনও উপগোষ্ঠীর চেয়েও বেশি প্রভাবশালী। GPU 6-এ, swizzle একটি 12x স্পিডআপ প্রদান করে, যখন সাবগ্রুপগুলি একটি 13x স্পিডআপ প্রদান করে। একত্রিত, তাদের একটি অবিশ্বাস্য 26x গতি আছে। অন্যান্য জিপিইউগুলির জন্য, কখনও কখনও সুইজল এবং সাবগ্রুপগুলি একত্রিত একটির চেয়ে ভাল পারফর্ম করে। এবং অন্যান্য জিপিইউতে, একচেটিয়াভাবে সুইজল ব্যবহার করা সর্বোত্তম কার্য সম্পাদন করে।

হার্ডওয়্যারের প্রতিটি অংশে ভালভাবে কাজ করার জন্য GPU অ্যালগরিদম টিউনিং এবং অপ্টিমাইজ করার জন্য অনেক দক্ষতার প্রয়োজন হতে পারে। কিন্তু সৌভাগ্যক্রমে মিডিয়াপিপ , Transformers.js , Apache TVM , ONNX রানটাইম ওয়েব এবং আরও অনেক কিছুর মতো উচ্চ স্তরের লাইব্রেরি ফ্রেমওয়ার্কগুলিতে প্রচুর প্রতিভাবান কাজ চলছে৷
লাইব্রেরি এবং ফ্রেমওয়ার্কগুলি বিভিন্ন জিপিইউ আর্কিটেকচার পরিচালনার জটিলতা এবং প্ল্যাটফর্ম-নির্দিষ্ট কোড তৈরি করার জন্য ভাল অবস্থানে রয়েছে যা ক্লায়েন্টে ভালভাবে চলবে।
Takeaways
ক্রোম টিম মেশিন লার্নিং ওয়ার্কলোডের জন্য ওয়েব প্ল্যাটফর্ম উন্নত করতে WebAssembly এবং WebGPU স্ট্যান্ডার্ড তৈরি করতে সাহায্য করে চলেছে। আমরা দ্রুত কম্পিউট প্রাইমিটিভে বিনিয়োগ করছি, ওয়েব স্ট্যান্ডার্ড জুড়ে আরও ভাল ইন্টারপ, এবং নিশ্চিত করছি যে বড় এবং ছোট উভয় মডেলই ডিভাইস জুড়ে দক্ষতার সাথে চলতে সক্ষম।
আমাদের লক্ষ্য হল প্ল্যাটফর্মের ক্ষমতাকে সর্বাধিক করা এবং ওয়েবের সেরাটি ধরে রাখা: এটির নাগাল, ব্যবহারযোগ্যতা এবং বহনযোগ্যতা। এবং আমরা একা এই কাজ করছি না. আমরা W3C-এ অন্যান্য ব্রাউজার বিক্রেতা এবং অনেক ডেভেলপমেন্ট পার্টনারদের সাথে সহযোগিতায় কাজ করছি।
আমরা আশা করি আপনি WebAssembly এবং WebGPU এর সাথে কাজ করার সময় নিম্নলিখিতটি মনে রাখবেন:
- AI অনুমান এখন ওয়েবে, ডিভাইস জুড়ে উপলব্ধ। এটি ক্লায়েন্ট ডিভাইসে চালানোর সুবিধা নিয়ে আসে, যেমন সার্ভারের কম খরচ, কম লেটেন্সি এবং বর্ধিত গোপনীয়তা।
- যদিও আলোচিত অনেক বৈশিষ্ট্য প্রাথমিকভাবে ফ্রেমওয়ার্ক লেখকদের জন্য প্রাসঙ্গিক, আপনার অ্যাপ্লিকেশনগুলি খুব বেশি ওভারহেড ছাড়াই উপকৃত হতে পারে।
- ওয়েব মান তরল, এবং বিকশিত, এবং আমরা সবসময় প্রতিক্রিয়া খুঁজছি. WebAssembly এবং WebGPU-এর জন্য আপনার শেয়ার করুন।
স্বীকৃতি
আমরা Intel ওয়েব গ্রাফিক্স টিমকে ধন্যবাদ জানাতে চাই, যারা WebGPU f16 এবং প্যাকড ইন্টিজার ডট প্রোডাক্ট ফিচার চালানোর ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করেছিল। আমরা অন্যান্য ব্রাউজার বিক্রেতাদের সহ W3C-তে WebAssembly এবং WebGPU ওয়ার্কিং গ্রুপের অন্যান্য সদস্যদের ধন্যবাদ জানাতে চাই।
অবিশ্বাস্য অংশীদার হওয়ার জন্য Google এবং ওপেন সোর্স সম্প্রদায় উভয়েই AI এবং ML টিমকে ধন্যবাদ৷ এবং অবশ্যই, আমাদের সব সতীর্থ যারা এই সব সম্ভব করে তোলে।
,এই ডকুমেন্টটি হল ওয়েব অ্যাসেম্বলি এবং ওয়েবজিপিইউ বর্ধিতকরণের একটি ধারাবাহিকতা দ্রুততর ওয়েব এআই, পার্ট 1 । আমরা আপনাকে এই পোস্টটি পড়ার পরামর্শ দিচ্ছি বা চালিয়ে যাওয়ার আগে IO 24 এ আলোচনাটি দেখুন ৷
ওয়েবজিপিইউ
WebGPU দক্ষ, উচ্চ-সমান্তরাল গণনা সম্পাদন করতে ক্লায়েন্টের GPU হার্ডওয়্যারে ওয়েব অ্যাপ্লিকেশনগুলিকে অ্যাক্সেস দেয়। Chrome-এ WebGPU চালু করার পর থেকে, আমরা ওয়েবে কৃত্রিম বুদ্ধিমত্তা (AI) এবং মেশিন লার্নিং (ML) এর অবিশ্বাস্য ডেমো দেখেছি।
উদাহরণস্বরূপ, ওয়েব স্টেবল ডিফিউশন দেখিয়েছে যে সরাসরি ব্রাউজারে টেক্সট থেকে ইমেজ তৈরি করতে AI ব্যবহার করা সম্ভব। এই বছরের শুরুর দিকে, Google এর নিজস্ব Mediapipe টিম বৃহৎ ভাষা মডেল অনুমানের জন্য পরীক্ষামূলক সমর্থন প্রকাশ করেছে।
নিচের অ্যানিমেশনটি Gemma , Google-এর ওপেন সোর্স লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) দেখায়, যা সম্পূর্ণরূপে Chrome-এ ডিভাইসে চলে, বাস্তব সময়ে৷
মেটার সেগমেন্ট এনিথিং মডেলের নিম্নলিখিত আলিঙ্গন মুখের ডেমোটি সম্পূর্ণরূপে ক্লায়েন্টের উপর উচ্চ মানের অবজেক্ট মাস্ক তৈরি করে।
এগুলি কয়েকটি আশ্চর্যজনক প্রকল্প যা AI এবং ML-এর জন্য WebGPU-এর শক্তি প্রদর্শন করে৷ WebGPU এই মডেলগুলি এবং অন্যদেরকে CPU-তে যতটা সম্ভব তার চেয়ে উল্লেখযোগ্যভাবে দ্রুত চালানোর অনুমতি দেয়।
টেক্সট এম্বেডিংয়ের জন্য হাগিং ফেসের ওয়েবজিপিইউ বেঞ্চমার্ক একই মডেলের একটি সিপিইউ বাস্তবায়নের তুলনায় অসাধারণ গতি প্রদর্শন করে। একটি Apple M1 Max ল্যাপটপে, WebGPU 30 গুণ বেশি দ্রুত ছিল। অন্যরা রিপোর্ট করেছেন যে WebGPU বেঞ্চমার্ককে 120 গুণের বেশি ত্বরান্বিত করে।
AI এবং ML এর জন্য WebGPU বৈশিষ্ট্য উন্নত করা
WebGPU AI এবং ML মডেলগুলির জন্য দুর্দান্ত, যার বিলিয়ন প্যারামিটার থাকতে পারে, কম্পিউট শেডারগুলির সমর্থনের জন্য ধন্যবাদ৷ কম্পিউট শেডারগুলি GPU-তে চলে এবং বৃহৎ পরিমাণ ডেটাতে সমান্তরাল অ্যারে অপারেশন চালাতে সাহায্য করে।
গত বছরে WebGPU-তে অসংখ্য উন্নতির মধ্যে, আমরা ওয়েবে ML এবং AI পারফরম্যান্স উন্নত করার জন্য আরও ক্ষমতা যোগ করা অব্যাহত রেখেছি। সম্প্রতি, আমরা দুটি নতুন বৈশিষ্ট্য চালু করেছি: 16-বিট ফ্লোটিং পয়েন্ট এবং প্যাকড ইন্টিজার ডট পণ্য।
16-বিট ফ্লোটিং পয়েন্ট
মনে রাখবেন, এমএল ওয়ার্কলোডের নির্ভুলতার প্রয়োজন হয় না । shader-f16
হল একটি বৈশিষ্ট্য যা ওয়েবজিপিইউ শেডিং ভাষায় f16 টাইপ ব্যবহার করতে সক্ষম করে। এই ফ্লোটিং পয়েন্ট টাইপ স্বাভাবিক 32 বিটের পরিবর্তে 16 বিট নেয়। f16 এর একটি ছোট পরিসর রয়েছে এবং এটি কম সুনির্দিষ্ট, তবে অনেক ML মডেলের জন্য এটি যথেষ্ট।
এই বৈশিষ্ট্যটি কয়েকটি উপায়ে দক্ষতা বাড়ায়:
হ্রাসকৃত মেমরি : f16 উপাদান সহ টেনসরগুলি অর্ধেক স্থান নেয়, যা অর্ধেক মেমরির ব্যবহারকে হ্রাস করে। জিপিইউ কম্পিউটেশনগুলি প্রায়ই মেমরি ব্যান্ডউইথের উপর বাধাগ্রস্ত হয়, তাই অর্ধেক মেমরি প্রায়শই শেডারগুলিকে দ্বিগুণ দ্রুত চালানোর অর্থ হতে পারে। প্রযুক্তিগতভাবে, মেমরি ব্যান্ডউইথ সংরক্ষণ করতে আপনার f16 এর প্রয়োজন নেই। কম-নির্ভুলতা বিন্যাসে ডেটা সংরক্ষণ করা সম্ভব, এবং তারপর গণনার জন্য শেডারে এটিকে সম্পূর্ণ f32-এ প্রসারিত করুন। কিন্তু, GPU ডেটা প্যাক এবং আনপ্যাক করতে অতিরিক্ত কম্পিউটিং শক্তি ব্যয় করে।
হ্রাসকৃত ডেটা রূপান্তর : f16 ডেটা রূপান্তর হ্রাস করে কম গণনা ব্যবহার করে। কম নির্ভুলতা ডেটা সংরক্ষণ করা যেতে পারে এবং তারপরে রূপান্তর ছাড়াই সরাসরি ব্যবহার করা যেতে পারে।
বর্ধিত সমান্তরালতা : আধুনিক জিপিইউগুলি জিপিইউ-এর এক্সিকিউশন ইউনিটগুলিতে একই সাথে আরও মান ফিট করতে সক্ষম, এটিকে আরও বেশি সংখ্যক সমান্তরাল গণনা করতে দেয়। উদাহরণস্বরূপ, একটি জিপিইউ যা প্রতি সেকেন্ডে 5 ট্রিলিয়ন f32 ফ্লোটিং-পয়েন্ট অপারেশন সমর্থন করে প্রতি সেকেন্ডে 10 ট্রিলিয়ন f16 ফ্লোটিং-পয়েন্ট অপারেশন সমর্থন করতে পারে।

shader-f16
এর সাথে, টেক্সট এম্বেডিং বেঞ্চমার্কের জন্য Hugging Face-এর WebGPU বেঞ্চমার্ক Apple M1 Max ল্যাপটপে f32 এর চেয়ে 3 গুণ দ্রুত বেঞ্চমার্ক চালায়।WebLLM হল একটি প্রকল্প যা একাধিক বড় ভাষার মডেল চালাতে পারে। এটি Apache TVM ব্যবহার করে, একটি ওপেন সোর্স মেশিন লার্নিং কম্পাইলার ফ্রেমওয়ার্ক।
আমি WebLLM কে Llama 3 আট-বিলিয়ন প্যারামিটার মডেল ব্যবহার করে প্যারিস ভ্রমণের পরিকল্পনা করতে বলেছি। ফলাফলগুলি দেখায় যে মডেলের প্রিফিল পর্বের সময়, f16 f32 এর চেয়ে 2.1 গুণ দ্রুত। ডিকোড পর্বের সময়, এটি 1.3 গুণ বেশি দ্রুত।
অ্যাপ্লিকেশনগুলিকে প্রথমে নিশ্চিত করতে হবে যে GPU অ্যাডাপ্টারটি f16 সমর্থন করে এবং এটি উপলব্ধ থাকলে, একটি GPU ডিভাইসের অনুরোধ করার সময় স্পষ্টভাবে এটি সক্ষম করুন৷ যদি f16 সমর্থিত না হয়, আপনি requiredFeatures
অ্যারেতে এটির অনুরোধ করতে পারবেন না।
// main.js
const adapter = await navigator.gpu.requestAdapter();
const supportsF16 = adapter.features.has('shader-f16');
if (supportsF16) {
// Use f16.
const device = await adapter.requestDevice({
requiredFeatures: ['shader-f16'],
});
initApp(device);
}
তারপর, আপনার WebGPU শেডারগুলিতে, আপনাকে অবশ্যই শীর্ষে স্পষ্টভাবে f16 সক্ষম করতে হবে। এর পরে, আপনি এটিকে অন্য যেকোন ফ্লোট ডেটা টাইপের মতো শেডারের মধ্যে ব্যবহার করতে পারবেন।
// my-shader.wgsl
enable f16;
struct Data {
values : array<vec4<f16>>
}
@group(0) @binding(0) var<storage, read> data : Data;
@compute @workgroup_size(64) fn main(@builtin(global_invocation_id) gid : vec3u) {
let value : vec4<f16> = data.values[gid.x];
...
}
প্যাকড পূর্ণসংখ্যা ডট পণ্য
অনেক মডেল এখনও মাত্র 8 বিট নির্ভুলতা (f16-এর অর্ধেক) দিয়ে ভাল কাজ করে। বিভাজন এবং বস্তুর স্বীকৃতির জন্য এটি এলএলএম এবং চিত্র মডেলগুলির মধ্যে জনপ্রিয়। এটি বলেছে, মডেলগুলির আউটপুট গুণমান কম নির্ভুলতার সাথে হ্রাস পায়, তাই 8-বিট কোয়ান্টাইজেশন প্রতিটি অ্যাপ্লিকেশনের জন্য উপযুক্ত নয়।
তুলনামূলকভাবে কিছু GPU নেটিভভাবে 8-বিট মান সমর্থন করে। এখানেই প্যাক করা পূর্ণসংখ্যা ডট পণ্য আসে। আমরা Chrome 123 এ DP4a পাঠিয়েছি।
আধুনিক জিপিইউ-তে দুটি 32-বিট পূর্ণসংখ্যা নেওয়ার জন্য বিশেষ নির্দেশাবলী রয়েছে, তাদের প্রতিটিকে 4টি পরপর-প্যাক করা 8-বিট পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করুন এবং তাদের উপাদানগুলির মধ্যে ডট পণ্য গণনা করুন।
এটি এআই এবং মেশিন লার্নিংয়ের জন্য বিশেষভাবে উপযোগী কারণ ম্যাট্রিক্স গুণন কার্নেলগুলি অনেকগুলি, অনেকগুলি ডট পণ্যের সমন্বয়ে গঠিত।
উদাহরণস্বরূপ, একটি 8 x 1 ভেক্টর দিয়ে একটি 4 x 8 ম্যাট্রিক্সকে গুণ করি। আউটপুট ভেক্টরের প্রতিটি মান গণনা করার জন্য এটি কম্পিউট করার জন্য 4টি ডট পণ্য নেওয়া জড়িত; A, B, C, এবং D.
এই প্রতিটি আউটপুট গণনা করার প্রক্রিয়া একই; আমরা তাদের একটি কম্পিউটিং জড়িত পদক্ষেপ তাকান হবে. যেকোন গণনার আগে, আমাদের প্রথমে 8-বিট পূর্ণসংখ্যা ডেটাকে এমন একটি টাইপে রূপান্তর করতে হবে যার সাথে আমরা পাটিগণিত করতে পারি, যেমন f16। তারপর, আমরা একটি উপাদান-ভিত্তিক গুণ চালাই এবং অবশেষে, সমস্ত পণ্য একসাথে যোগ করি। মোট, সমগ্র ম্যাট্রিক্স-ভেক্টর গুণনের জন্য, আমরা ডেটা আনপ্যাক করার জন্য 40টি পূর্ণসংখ্যা ফ্লোট কনভার্সন করি, 32টি ফ্লোট গুণন এবং 28টি ফ্লোট সংযোজন করি।
আরও অপারেশন সহ বড় ম্যাট্রিক্সের জন্য, প্যাক করা পূর্ণসংখ্যা ডট পণ্যগুলি কাজের পরিমাণ কমাতে সাহায্য করতে পারে।
ফলাফল ভেক্টরের প্রতিটি আউটপুটের জন্য, আমরা WebGPU শেডিং ল্যাঙ্গুয়েজ বিল্ট-ইন dot4U8Packed
ব্যবহার করে দুটি প্যাকড ডট প্রোডাক্ট অপারেশন করি এবং তারপর একসাথে ফলাফল যোগ করি। মোট, সমগ্র ম্যাট্রিক্স-ভেক্টর গুণনের জন্য, আমরা কোনো ডেটা রূপান্তর করি না। আমরা 8টি প্যাকড ডট পণ্য এবং 4টি পূর্ণসংখ্যা যোগ করি।
আমরা বিভিন্ন ভোক্তা GPU-তে 8-বিট ডেটা সহ প্যাকড ইন্টিজার ডট পণ্যগুলি পরীক্ষা করেছি। 16-বিট ফ্লোটিং পয়েন্টের তুলনায়, আমরা দেখতে পাচ্ছি যে 8-বিট 1.6 থেকে 2.8 গুণ দ্রুত। যখন আমরা অতিরিক্তভাবে প্যাকড পূর্ণসংখ্যা ডট পণ্য ব্যবহার করি, তখন কর্মক্ষমতা আরও ভালো হয়। এটি 1.7 থেকে 2.9 গুণ দ্রুত।

wgslLanguageFeatures
সম্পত্তির সাথে ব্রাউজার সমর্থনের জন্য পরীক্ষা করুন। যদি GPU প্যাকড ডট পণ্যগুলিকে স্থানীয়ভাবে সমর্থন না করে, তাহলে ব্রাউজারটি তার নিজস্ব বাস্তবায়ন পলিফিল করে।
// main.js
if (navigator.gpu.wgslLanguageFeatures.has('packed_4x8_integer_dot_product')) {
// Use dot4U8Packed, dot4I8Packed builtin
// functions in the shaders.
}
নিম্নলিখিত কোড স্নিপেট পার্থক্য (পার্থক্য) একটি WebGPU শেডারে প্যাক করা পূর্ণসংখ্যা পণ্য ব্যবহার করার জন্য প্রয়োজনীয় পরিবর্তনগুলি হাইলাইট করে৷
আগে — একটি WebGPU শেডার যা ভেরিয়েবল `sum`-এ আংশিক ডট পণ্য জমা করে। লুপের শেষে, একটি ভেক্টর এবং ইনপুট ম্যাট্রিক্সের একটি সারির মধ্যে 'সমষ্টি' সম্পূর্ণ ডট পণ্যটিকে ধরে রাখে।
// my-dot-product.wgsl @compute @workgroup_size(64) fn main(@builtin(global_invocation_id) gid : vec3u) { var sum : f16; let start = gid.x * uniforms.dim; for (var i = 0u; i < uniforms.dim; i++) { let v1 : vec4<f16> = vector.values[i]; let v2 : vec4<f16> = matrix.values[start + i]; sum += dot(v1, v2); } }
পরে — প্যাক করা পূর্ণসংখ্যা ডট পণ্য ব্যবহার করার জন্য লেখা একটি WebGPU শেডার। প্রধান পার্থক্য হল ভেক্টর এবং ম্যাট্রিক্স থেকে 4টি ফ্লোট মান লোড করার পরিবর্তে, এই শেডারটি একটি একক 32-বিট পূর্ণসংখ্যা লোড করে। এই 32-বিট পূর্ণসংখ্যা চারটি 8-বিট পূর্ণসংখ্যা মানের ডেটা ধারণ করে। তারপর, আমরা দুটি মানের ডট পণ্য গণনা করতে dot4U8Packed
কল করি।
// my-dot-product.wgsl
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) gid : vec3u) {
var sum : f32;
let start = gid.x * uniforms.dim;
for (var i = 0u; i < uniforms.dim; i++) {
let v1 : u32 = vector.values[i];
let v2 : u32 = matrix.values[start + i];
sum += dot4U8Packed(v1, v2);
}
}
16-বিট ফ্লোটিং পয়েন্ট এবং প্যাকড ইন্টিজার ডট পণ্য উভয়ই ক্রোমে পাঠানো বৈশিষ্ট্য যা AI এবং ML-কে ত্বরান্বিত করে। 16-বিট ফ্লোটিং পয়েন্ট উপলব্ধ থাকে যখন হার্ডওয়্যার এটিকে সমর্থন করে এবং Chrome সমস্ত ডিভাইসে প্যাকড ইন্টিজার ডট পণ্যগুলি প্রয়োগ করে৷
আপনি আরও ভাল পারফরম্যান্স অর্জন করতে আজই Chrome Stable-এ এই বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন৷
প্রস্তাবিত বৈশিষ্ট্য
সামনের দিকে তাকিয়ে, আমরা আরও দুটি বৈশিষ্ট্য অনুসন্ধান করছি: উপগোষ্ঠী এবং সমবায় ম্যাট্রিক্স গুন।
সাবগ্রুপ বৈশিষ্ট্যটি SIMD-স্তরের সমান্তরালতাকে যোগাযোগ করতে বা সমষ্টিগত গণিত ক্রিয়াকলাপ সম্পাদন করতে সক্ষম করে, যেমন 16টির বেশি সংখ্যার জন্য একটি যোগফল। এটি দক্ষ ক্রস-থ্রেড ডেটা ভাগ করে নেওয়ার অনুমতি দেয়। সাবগ্রুপগুলি আধুনিক GPUs API-এ সমর্থিত, বিভিন্ন নাম সহ এবং সামান্য ভিন্ন আকারে।
আমরা সাধারণ সেটটিকে একটি প্রস্তাবে পাতিয়েছি যা আমরা WebGPU মানককরণ গ্রুপে নিয়েছি। এবং, আমরা একটি পরীক্ষামূলক পতাকার পিছনে Chrome-এ উপগোষ্ঠীগুলিকে প্রোটোটাইপ করেছি এবং আমাদের প্রাথমিক ফলাফলগুলিকে আলোচনায় নিয়ে এসেছি৷ মূল বিষয় হল কিভাবে পোর্টেবল আচরণ নিশ্চিত করা যায়।
কোঅপারেটিভ ম্যাট্রিক্স মাল্টিপ্লাই হল GPU-তে সাম্প্রতিক সংযোজন। একটি বড় ম্যাট্রিক্স গুণকে একাধিক ছোট ম্যাট্রিক্স গুণে ভাগ করা যেতে পারে। সমবায় ম্যাট্রিক্স গুন একক যৌক্তিক ধাপে এই ছোট স্থির-আকারের ব্লকগুলিতে গুণন সম্পাদন করে। সেই ধাপের মধ্যে, থ্রেডের একটি গ্রুপ ফলাফল গণনা করতে দক্ষতার সাথে সহযোগিতা করে।
আমরা অন্তর্নিহিত GPU API-এ সমর্থন জরিপ করেছি , এবং WebGPU মানককরণ গ্রুপের কাছে একটি প্রস্তাব উপস্থাপন করার পরিকল্পনা করেছি। সাবগ্রুপগুলির মতো, আমরা আশা করি যে বেশিরভাগ আলোচনা পোর্টেবিলিটির চারপাশে কেন্দ্রীভূত হবে।
সাবগ্রুপ ক্রিয়াকলাপগুলির কার্যকারিতা মূল্যায়ন করার জন্য, একটি বাস্তব অ্যাপ্লিকেশনে, আমরা MediaPipe-এ সাবগ্রুপগুলির জন্য পরীক্ষামূলক সমর্থনকে একীভূত করেছি এবং সাবগ্রুপ অপারেশনগুলির জন্য Chrome এর প্রোটোটাইপের সাথে এটি পরীক্ষা করেছি৷
আমরা বড় ভাষা মডেলের প্রিফিল ফেজের GPU কার্নেলে সাবগ্রুপ ব্যবহার করেছি, তাই আমি শুধুমাত্র প্রিফিল ফেজের জন্য স্পিডআপ রিপোর্ট করছি। একটি ইন্টেল জিপিইউতে, আমরা দেখতে পাই যে সাবগ্রুপগুলি বেসলাইনের চেয়ে আড়াই গুণ দ্রুত কাজ করে। যাইহোক, এই উন্নতিগুলি বিভিন্ন GPU তে সামঞ্জস্যপূর্ণ নয়।

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

GPU অপ্টিমাইজেশান কঠিন
শেষ পর্যন্ত, আপনার GPU অপ্টিমাইজ করার সর্বোত্তম উপায় ক্লায়েন্ট কি GPU অফার করে তার উপর নির্ভর করে। অভিনব নতুন GPU বৈশিষ্ট্যগুলি ব্যবহার করা সর্বদা আপনি যেভাবে আশা করতে পারেন সেভাবে অর্থ প্রদান করে না, কারণ এতে অনেক জটিল কারণ জড়িত থাকতে পারে। একটি জিপিইউতে সেরা অপ্টিমাইজেশন কৌশল অন্য জিপিইউতে সেরা কৌশল নাও হতে পারে।
আপনি GPU-এর কম্পিউটিং থ্রেডগুলি সম্পূর্ণরূপে ব্যবহার করার সময় মেমরি ব্যান্ডউইথ কমাতে চান।
মেমরি অ্যাক্সেস প্যাটার্ন সত্যিই গুরুত্বপূর্ণ হতে পারে, খুব. কম্পিউট থ্রেডগুলি হার্ডওয়্যারের জন্য সর্বোত্তম প্যাটার্নে মেমরি অ্যাক্সেস করার সময় জিপিইউগুলি আরও ভাল পারফর্ম করে। গুরুত্বপূর্ণ: আপনি বিভিন্ন GPU হার্ডওয়্যারে বিভিন্ন কর্মক্ষমতা বৈশিষ্ট্য আশা করা উচিত। আপনাকে GPU এর উপর নির্ভর করে বিভিন্ন অপ্টিমাইজেশন চালানোর প্রয়োজন হতে পারে।
নিম্নলিখিত চার্টে, আমরা একই ম্যাট্রিক্স মাল্টিপ্লাই অ্যালগরিদম নিয়েছি, কিন্তু বিভিন্ন অপ্টিমাইজেশান কৌশলের প্রভাব এবং বিভিন্ন GPU তে জটিলতা এবং ভিন্নতা আরও প্রদর্শন করতে আরেকটি মাত্রা যোগ করেছি। আমরা এখানে একটি নতুন কৌশল প্রবর্তন করেছি, যাকে আমরা "Swizzle" বলব। সুইজল হার্ডওয়্যারের জন্য আরও অনুকূল হতে মেমরি অ্যাক্সেস প্যাটার্নগুলিকে অপ্টিমাইজ করে।
আপনি দেখতে পারেন যে মেমরি সুইজল একটি উল্লেখযোগ্য প্রভাব আছে; এটি কখনও কখনও উপগোষ্ঠীর চেয়েও বেশি প্রভাবশালী। GPU 6-এ, swizzle একটি 12x স্পিডআপ প্রদান করে, যখন সাবগ্রুপগুলি একটি 13x স্পিডআপ প্রদান করে। একত্রিত, তাদের একটি অবিশ্বাস্য 26x গতি আছে। অন্যান্য জিপিইউগুলির জন্য, কখনও কখনও সুইজল এবং সাবগ্রুপগুলি একত্রিত একটির চেয়ে ভাল পারফর্ম করে। এবং অন্যান্য জিপিইউতে, একচেটিয়াভাবে সুইজল ব্যবহার করা সর্বোত্তম কার্য সম্পাদন করে।

হার্ডওয়্যারের প্রতিটি অংশে ভালভাবে কাজ করার জন্য GPU অ্যালগরিদম টিউনিং এবং অপ্টিমাইজ করার জন্য অনেক দক্ষতার প্রয়োজন হতে পারে। কিন্তু সৌভাগ্যক্রমে মিডিয়াপিপ , Transformers.js , Apache TVM , ONNX রানটাইম ওয়েব এবং আরও অনেক কিছুর মতো উচ্চ স্তরের লাইব্রেরি ফ্রেমওয়ার্কগুলিতে প্রচুর প্রতিভাবান কাজ চলছে৷
লাইব্রেরি এবং ফ্রেমওয়ার্কগুলি বিভিন্ন জিপিইউ আর্কিটেকচার পরিচালনার জটিলতা এবং প্ল্যাটফর্ম-নির্দিষ্ট কোড তৈরি করার জন্য ভাল অবস্থানে রয়েছে যা ক্লায়েন্টে ভালভাবে চলবে।
Takeaways
ক্রোম টিম মেশিন লার্নিং ওয়ার্কলোডের জন্য ওয়েব প্ল্যাটফর্ম উন্নত করতে WebAssembly এবং WebGPU স্ট্যান্ডার্ড তৈরি করতে সাহায্য করে চলেছে। আমরা দ্রুত কম্পিউট প্রাইমিটিভে বিনিয়োগ করছি, ওয়েব স্ট্যান্ডার্ড জুড়ে আরও ভাল ইন্টারপ, এবং নিশ্চিত করছি যে বড় এবং ছোট উভয় মডেলই ডিভাইস জুড়ে দক্ষতার সাথে চলতে সক্ষম।
আমাদের লক্ষ্য হল প্ল্যাটফর্মের ক্ষমতাকে সর্বাধিক করা এবং ওয়েবের সেরাটি ধরে রাখা: এটির নাগাল, ব্যবহারযোগ্যতা এবং বহনযোগ্যতা। এবং আমরা একা এই কাজ করছি না. আমরা W3C-এ অন্যান্য ব্রাউজার বিক্রেতা এবং অনেক ডেভেলপমেন্ট পার্টনারদের সাথে সহযোগিতায় কাজ করছি।
আমরা আশা করি আপনি WebAssembly এবং WebGPU এর সাথে কাজ করার সময় নিম্নলিখিতটি মনে রাখবেন:
- AI অনুমান এখন ওয়েবে, ডিভাইস জুড়ে উপলব্ধ। এটি ক্লায়েন্ট ডিভাইসে চালানোর সুবিধা নিয়ে আসে, যেমন সার্ভারের কম খরচ, কম লেটেন্সি এবং বর্ধিত গোপনীয়তা।
- যদিও আলোচিত অনেক বৈশিষ্ট্য প্রাথমিকভাবে ফ্রেমওয়ার্ক লেখকদের জন্য প্রাসঙ্গিক, আপনার অ্যাপ্লিকেশনগুলি খুব বেশি ওভারহেড ছাড়াই উপকৃত হতে পারে।
- ওয়েব মান তরল, এবং বিকশিত, এবং আমরা সবসময় প্রতিক্রিয়া খুঁজছি. WebAssembly এবং WebGPU-এর জন্য আপনার শেয়ার করুন।
স্বীকৃতি
আমরা Intel ওয়েব গ্রাফিক্স টিমকে ধন্যবাদ জানাতে চাই, যারা WebGPU f16 এবং প্যাকড ইন্টিজার ডট প্রোডাক্ট ফিচার চালানোর ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করেছিল। আমরা অন্যান্য ব্রাউজার বিক্রেতাদের সহ W3C-তে WebAssembly এবং WebGPU ওয়ার্কিং গ্রুপের অন্যান্য সদস্যদের ধন্যবাদ জানাতে চাই।
অবিশ্বাস্য অংশীদার হওয়ার জন্য Google এবং ওপেন সোর্স সম্প্রদায় উভয়েই AI এবং ML টিমকে ধন্যবাদ৷ এবং অবশ্যই, আমাদের সব সতীর্থ যারা এই সব সম্ভব করে তোলে।
,এই ডকুমেন্টটি হল ওয়েব অ্যাসেম্বলি এবং ওয়েবজিপিইউ বর্ধিতকরণের একটি ধারাবাহিকতা দ্রুততর ওয়েব এআই, পার্ট 1 । আমরা আপনাকে এই পোস্টটি পড়ার পরামর্শ দিচ্ছি বা চালিয়ে যাওয়ার আগে IO 24 এ আলোচনাটি দেখুন ৷
ওয়েবজিপিইউ
WebGPU দক্ষ, উচ্চ-সমান্তরাল গণনা সম্পাদন করতে ক্লায়েন্টের GPU হার্ডওয়্যারে ওয়েব অ্যাপ্লিকেশনগুলিকে অ্যাক্সেস দেয়। Chrome-এ WebGPU চালু করার পর থেকে, আমরা ওয়েবে কৃত্রিম বুদ্ধিমত্তা (AI) এবং মেশিন লার্নিং (ML) এর অবিশ্বাস্য ডেমো দেখেছি।
উদাহরণস্বরূপ, ওয়েব স্টেবল ডিফিউশন দেখিয়েছে যে সরাসরি ব্রাউজারে টেক্সট থেকে ইমেজ তৈরি করতে AI ব্যবহার করা সম্ভব। এই বছরের শুরুর দিকে, Google এর নিজস্ব Mediapipe টিম বৃহৎ ভাষার মডেল অনুমানের জন্য পরীক্ষামূলক সমর্থন প্রকাশ করেছে।
নিচের অ্যানিমেশনটি Gemma , Google-এর ওপেন সোর্স লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) দেখায়, যা সম্পূর্ণরূপে Chrome-এ ডিভাইসে চলে, বাস্তব সময়ে৷
মেটার সেগমেন্ট এনিথিং মডেলের নিম্নলিখিত আলিঙ্গন মুখের ডেমোটি সম্পূর্ণরূপে ক্লায়েন্টের উপর উচ্চ মানের অবজেক্ট মাস্ক তৈরি করে।
এগুলি কয়েকটি আশ্চর্যজনক প্রকল্প যা AI এবং ML-এর জন্য WebGPU-এর শক্তি প্রদর্শন করে৷ WebGPU এই মডেলগুলি এবং অন্যদেরকে CPU-তে যতটা সম্ভব তার চেয়ে উল্লেখযোগ্যভাবে দ্রুত চালানোর অনুমতি দেয়।
টেক্সট এম্বেডিংয়ের জন্য হাগিং ফেসের ওয়েবজিপিইউ বেঞ্চমার্ক একই মডেলের একটি সিপিইউ বাস্তবায়নের তুলনায় অসাধারণ গতি প্রদর্শন করে। একটি Apple M1 Max ল্যাপটপে, WebGPU 30 গুণ বেশি দ্রুত ছিল। অন্যরা রিপোর্ট করেছেন যে WebGPU বেঞ্চমার্ককে 120 গুণের বেশি ত্বরান্বিত করে।
AI এবং ML এর জন্য WebGPU বৈশিষ্ট্য উন্নত করা
WebGPU AI এবং ML মডেলগুলির জন্য দুর্দান্ত, যার বিলিয়ন প্যারামিটার থাকতে পারে, কম্পিউট শেডারগুলির সমর্থনের জন্য ধন্যবাদ৷ কম্পিউট শেডারগুলি GPU-তে চলে এবং বৃহৎ পরিমাণ ডেটাতে সমান্তরাল অ্যারে অপারেশন চালাতে সাহায্য করে।
গত বছরে WebGPU-তে অসংখ্য উন্নতির মধ্যে, আমরা ওয়েবে ML এবং AI পারফরম্যান্স উন্নত করার জন্য আরও ক্ষমতা যোগ করা অব্যাহত রেখেছি। সম্প্রতি, আমরা দুটি নতুন বৈশিষ্ট্য চালু করেছি: 16-বিট ফ্লোটিং পয়েন্ট এবং প্যাকড ইন্টিজার ডট পণ্য।
16-বিট ফ্লোটিং পয়েন্ট
মনে রাখবেন, এমএল ওয়ার্কলোডের নির্ভুলতার প্রয়োজন হয় না । shader-f16
হল একটি বৈশিষ্ট্য যা ওয়েবজিপিইউ শেডিং ভাষায় f16 টাইপ ব্যবহার করতে সক্ষম করে। এই ফ্লোটিং পয়েন্ট টাইপ স্বাভাবিক 32 বিটের পরিবর্তে 16 বিট নেয়। f16 এর একটি ছোট পরিসর রয়েছে এবং এটি কম সুনির্দিষ্ট, তবে অনেক ML মডেলের জন্য এটি যথেষ্ট।
এই বৈশিষ্ট্যটি কয়েকটি উপায়ে দক্ষতা বাড়ায়:
হ্রাসকৃত মেমরি : f16 উপাদান সহ টেনসরগুলি অর্ধেক স্থান নেয়, যা অর্ধেক মেমরির ব্যবহারকে হ্রাস করে। জিপিইউ কম্পিউটেশনগুলি প্রায়ই মেমরি ব্যান্ডউইথের উপর বাধাগ্রস্ত হয়, তাই অর্ধেক মেমরি প্রায়শই শেডারগুলিকে দ্বিগুণ দ্রুত চালানোর অর্থ হতে পারে। প্রযুক্তিগতভাবে, মেমরি ব্যান্ডউইথ সংরক্ষণ করতে আপনার f16 এর প্রয়োজন নেই। কম-নির্ভুলতা বিন্যাসে ডেটা সংরক্ষণ করা সম্ভব, এবং তারপর গণনার জন্য শেডারে এটিকে সম্পূর্ণ f32-এ প্রসারিত করুন। কিন্তু, GPU ডেটা প্যাক এবং আনপ্যাক করতে অতিরিক্ত কম্পিউটিং শক্তি ব্যয় করে।
হ্রাসকৃত ডেটা রূপান্তর : f16 ডেটা রূপান্তর হ্রাস করে কম গণনা ব্যবহার করে। কম নির্ভুলতা ডেটা সংরক্ষণ করা যেতে পারে এবং তারপরে রূপান্তর ছাড়াই সরাসরি ব্যবহার করা যেতে পারে।
বর্ধিত সমান্তরালতা : আধুনিক জিপিইউগুলি জিপিইউ-এর এক্সিকিউশন ইউনিটগুলিতে একই সাথে আরও মান ফিট করতে সক্ষম, এটিকে আরও বেশি সংখ্যক সমান্তরাল গণনা করতে দেয়। উদাহরণস্বরূপ, একটি জিপিইউ যা প্রতি সেকেন্ডে 5 ট্রিলিয়ন f32 ফ্লোটিং-পয়েন্ট অপারেশন সমর্থন করে প্রতি সেকেন্ডে 10 ট্রিলিয়ন f16 ফ্লোটিং-পয়েন্ট অপারেশন সমর্থন করতে পারে।

shader-f16
এর সাথে, টেক্সট এম্বেডিং বেঞ্চমার্কের জন্য Hugging Face-এর WebGPU বেঞ্চমার্ক Apple M1 Max ল্যাপটপে f32 এর চেয়ে 3 গুণ দ্রুত বেঞ্চমার্ক চালায়।ওয়েবলএলএম একটি প্রকল্প যা একাধিক বৃহত ভাষার মডেল চালাতে পারে। এটি অ্যাপাচি টিভিএম ব্যবহার করে, একটি ওপেন সোর্স মেশিন লার্নিং সংকলক কাঠামো।
আমি ওয়েবলএলএমকে লামা 3 আট-বিলিয়ন প্যারামিটার মডেল ব্যবহার করে প্যারিসে ভ্রমণের পরিকল্পনা করতে বলেছিলাম। ফলাফলগুলি দেখায় যে মডেলের প্রিফিল পর্বের সময়, F16 F32 এর চেয়ে 2.1 গুণ দ্রুত। ডিকোড পর্বের সময়, এটি 1.3 গুণ বেশি দ্রুত।
অ্যাপ্লিকেশনগুলি অবশ্যই প্রথমে নিশ্চিত করতে হবে যে জিপিইউ অ্যাডাপ্টার F16 সমর্থন করে এবং যদি এটি উপলব্ধ থাকে তবে জিপিইউ ডিভাইসের অনুরোধ করার সময় স্পষ্টভাবে এটি সক্ষম করুন। যদি F16 সমর্থিত না হয় তবে আপনি requiredFeatures
অ্যারেতে এটি অনুরোধ করতে পারবেন না।
// main.js
const adapter = await navigator.gpu.requestAdapter();
const supportsF16 = adapter.features.has('shader-f16');
if (supportsF16) {
// Use f16.
const device = await adapter.requestDevice({
requiredFeatures: ['shader-f16'],
});
initApp(device);
}
তারপরে, আপনার ওয়েবজিপিইউ শেডারে, আপনাকে অবশ্যই শীর্ষে F16 সক্ষম করতে হবে। এর পরে, আপনি অন্য কোনও ফ্লোট ডেটা টাইপের মতো শেডারের মধ্যে এটি ব্যবহার করতে পারেন।
// my-shader.wgsl
enable f16;
struct Data {
values : array<vec4<f16>>
}
@group(0) @binding(0) var<storage, read> data : Data;
@compute @workgroup_size(64) fn main(@builtin(global_invocation_id) gid : vec3u) {
let value : vec4<f16> = data.values[gid.x];
...
}
প্যাকড পূর্ণসংখ্যা ডট পণ্য
অনেক মডেল এখনও মাত্র 8 বিট নির্ভুলতার সাথে ভাল কাজ করে (এফ 16 এর অর্ধেক)। এটি বিভাজন এবং অবজেক্টের স্বীকৃতির জন্য এলএলএম এবং চিত্রের মডেলগুলির মধ্যে জনপ্রিয়। এটি বলেছিল, মডেলগুলির জন্য আউটপুট গুণমান কম নির্ভুলতার সাথে হ্রাস পায়, সুতরাং 8-বিট কোয়ান্টাইজেশন প্রতিটি অ্যাপ্লিকেশনটির জন্য উপযুক্ত নয়।
তুলনামূলকভাবে কয়েকটি জিপিইউ স্থানীয়ভাবে 8-বিট মানগুলিকে সমর্থন করে। এখানেই প্যাকযুক্ত পূর্ণসংখ্যা ডট পণ্যগুলি আসে We আমরা ক্রোম 123 এ ডিপি 4 এ প্রেরণ করেছি।
আধুনিক জিপিইউগুলিতে দুটি 32-বিট পূর্ণসংখ্যা নেওয়ার জন্য বিশেষ নির্দেশাবলী রয়েছে, তাদের প্রত্যেককে টানা 4-বিট পূর্ণসংখ্যার হিসাবে ব্যাখ্যা করুন এবং তাদের উপাদানগুলির মধ্যে বিন্দু পণ্যটি গণনা করুন।
এটি এআই এবং মেশিন লার্নিংয়ের জন্য বিশেষভাবে কার্যকর কারণ ম্যাট্রিক্স গুণক কার্নেলগুলি অনেকগুলি, অনেক বিন্দু পণ্য দ্বারা গঠিত।
উদাহরণস্বরূপ, আসুন একটি 8 x 1 ভেক্টরের সাথে একটি 4 x 8 ম্যাট্রিক্সকে গুণ করি। এটি গণনা করা আউটপুট ভেক্টরের প্রতিটি মান গণনা করতে 4 টি বিন্দু পণ্য গ্রহণের সাথে জড়িত; এ, বি, সি, এবং ডি।
এই আউটপুটগুলির প্রতিটি গণনা করার প্রক্রিয়া একই; আমরা এর মধ্যে একটি গণনার সাথে জড়িত পদক্ষেপগুলি দেখব। কোনও গণনার আগে, আমাদের প্রথমে 8-বিট পূর্ণসংখ্যার ডেটা এমন এক ধরণের রূপান্তর করতে হবে যা আমরা F16 এর মতো গাণিতিক সম্পাদন করতে পারি। তারপরে, আমরা একটি উপাদান-ভিত্তিক গুণ পরিচালনা করি এবং শেষ পর্যন্ত সমস্ত পণ্য একসাথে যুক্ত করি। মোট, পুরো ম্যাট্রিক্স-ভেক্টর গুণনের জন্য, আমরা ডেটা আনপ্যাক করতে, 32 ভাসমান গুণগুলি এবং 28 টি ভাসমান সংযোজনগুলি আনপ্যাক করতে 40 টি পূর্ণসংখ্যা সঞ্চালন করি।
আরও অপারেশন সহ বৃহত্তর ম্যাট্রিকগুলির জন্য, প্যাকযুক্ত পূর্ণসংখ্যা ডট পণ্যগুলি কাজের পরিমাণ হ্রাস করতে সহায়তা করতে পারে।
ফলাফল ভেক্টরের প্রতিটি আউটপুটগুলির জন্য, আমরা ওয়েবজিপিইউ শেডিং ল্যাঙ্গুয়েজ বিল্ট-ইন dot4U8Packed
ব্যবহার করে দুটি প্যাকড ডট পণ্য ক্রিয়াকলাপ সম্পাদন করি এবং তারপরে ফলাফলগুলি একসাথে যুক্ত করি। মোট, পুরো ম্যাট্রিক্স-ভেক্টর গুণনের জন্য, আমরা কোনও ডেটা রূপান্তর সম্পাদন করি না। আমরা 8 টি প্যাকড ডট পণ্য এবং 4 টি পূর্ণসংখ্যা সংযোজন সম্পাদন করি।
আমরা বিভিন্ন ভোক্তা জিপিইউতে 8-বিট ডেটা সহ প্যাকড পূর্ণসংখ্যা ডট পণ্যগুলি পরীক্ষা করেছি। 16-বিট ভাসমান পয়েন্টের সাথে তুলনা করে আমরা দেখতে পাচ্ছি যে 8-বিট 1.6 থেকে 2.8 গুণ দ্রুত। যখন আমরা অতিরিক্তভাবে প্যাকড ইন্টিজার ডট পণ্যগুলি ব্যবহার করি তখন পারফরম্যান্স আরও ভাল। এটি 1.7 থেকে 2.9 গুণ দ্রুত।

wgslLanguageFeatures
যদি জিপিইউ স্থানীয়ভাবে প্যাকড ডট পণ্যগুলিকে সমর্থন করে না, তবে ব্রাউজারটি নিজস্ব বাস্তবায়নকে পলিফিল করে।
// main.js
if (navigator.gpu.wgslLanguageFeatures.has('packed_4x8_integer_dot_product')) {
// Use dot4U8Packed, dot4I8Packed builtin
// functions in the shaders.
}
নিম্নলিখিত কোড স্নিপেট ডিফ (পার্থক্য) একটি ওয়েবজিপিইউ শেডারে প্যাকড পূর্ণসংখ্যা পণ্যগুলি ব্যবহার করার জন্য প্রয়োজনীয় পরিবর্তনগুলি হাইলাইট করে।
এর আগে - একটি ওয়েবজিপিইউ শেডার যা আংশিক বিন্দু পণ্যগুলি ভেরিয়েবল `সমষ্টিতে জমে` লুপের শেষে, `যোগফল একটি ভেক্টর এবং ইনপুট ম্যাট্রিক্সের একটি সারি মধ্যে সম্পূর্ণ বিন্দু পণ্য ধারণ করে।
// my-dot-product.wgsl @compute @workgroup_size(64) fn main(@builtin(global_invocation_id) gid : vec3u) { var sum : f16; let start = gid.x * uniforms.dim; for (var i = 0u; i < uniforms.dim; i++) { let v1 : vec4<f16> = vector.values[i]; let v2 : vec4<f16> = matrix.values[start + i]; sum += dot(v1, v2); } }
এর পরে - প্যাকড ইন্টিজার ডট পণ্যগুলি ব্যবহার করার জন্য একটি ওয়েবজিপিইউ শেডার লেখা। মূল পার্থক্যটি হ'ল ভেক্টর এবং ম্যাট্রিক্সের বাইরে 4 টি ভাসমান মান লোড করার পরিবর্তে এই শেডারটি একটি একক 32-বিট পূর্ণসংখ্যা লোড করে। এই 32-বিট পূর্ণসংখ্যার চারটি 8-বিট পূর্ণসংখ্যার মানগুলির ডেটা ধারণ করে। তারপরে, আমরা দুটি মানের ডট পণ্য গণনা করতে dot4U8Packed
কল করি।
// my-dot-product.wgsl
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) gid : vec3u) {
var sum : f32;
let start = gid.x * uniforms.dim;
for (var i = 0u; i < uniforms.dim; i++) {
let v1 : u32 = vector.values[i];
let v2 : u32 = matrix.values[start + i];
sum += dot4U8Packed(v1, v2);
}
}
উভয় 16-বিট ফ্লোটিং পয়েন্ট এবং প্যাকড ইন্টিজার ডট পণ্যগুলি ক্রোমে শিপড বৈশিষ্ট্য যা এআই এবং এমএলকে ত্বরান্বিত করে। হার্ডওয়্যার এটি সমর্থন করার সময় 16-বিট ভাসমান পয়েন্টটি উপলব্ধ এবং ক্রোম সমস্ত ডিভাইসে পূর্ণসংখ্যা ডট পণ্যগুলি প্যাক করা হয়।
আপনি আরও ভাল পারফরম্যান্স অর্জন করতে আজ ক্রোম স্থিতিতে এই বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন।
প্রস্তাবিত বৈশিষ্ট্য
প্রত্যাশায়, আমরা আরও দুটি বৈশিষ্ট্য অনুসন্ধান করছি: উপগোষ্ঠী এবং সমবায় ম্যাট্রিক্স গুণ।
উপগোষ্ঠী বৈশিষ্ট্যগুলি সিমড-স্তরের সমান্তরালতা যোগাযোগ করতে বা সম্মিলিত গণিত ক্রিয়াকলাপগুলি সম্পাদন করতে সক্ষম করে, যেমন 16 টিরও বেশি সংখ্যার জন্য যোগফল। এটি দক্ষ ক্রস-থ্রেড ডেটা ভাগ করে নেওয়ার অনুমতি দেয়। উপগোষ্ঠীগুলি আধুনিক জিপিইউ এপিআইগুলিতে বিভিন্ন নাম এবং কিছুটা ভিন্ন আকারে সমর্থিত।
আমরা ওয়েবজিপিইউ স্ট্যান্ডার্ডাইজেশন গ্রুপে নিয়েছি এমন একটি প্রস্তাবের মধ্যে সাধারণ সেটটি নিঃসৃত করেছি। এবং, আমরা একটি পরীক্ষামূলক পতাকার পিছনে ক্রোমে প্রোটোটাইপড সাবগ্রুপগুলি করেছি এবং আমাদের প্রাথমিক ফলাফলগুলি আলোচনায় নিয়ে এসেছি। মূল সমস্যাটি কীভাবে বহনযোগ্য আচরণ নিশ্চিত করা যায়।
সমবায় ম্যাট্রিক্স গুণটি জিপিইউগুলির আরও সাম্প্রতিক সংযোজন। একটি বৃহত ম্যাট্রিক্স গুণকে একাধিক ছোট ম্যাট্রিক্স গুণে বিভক্ত করা যেতে পারে। সমবায় ম্যাট্রিক্স গুণক একক যৌক্তিক পদক্ষেপে এই ছোট স্থির আকারের ব্লকগুলিতে গুণগুলি সম্পাদন করে। এই পদক্ষেপের মধ্যে, থ্রেডগুলির একটি গ্রুপ ফলাফলটি গণনা করতে দক্ষতার সাথে সহযোগিতা করে।
আমরা অন্তর্নিহিত জিপিইউ এপিআইগুলিতে সমর্থন সমীক্ষা করেছি এবং ওয়েবজিপিইউ স্ট্যান্ডার্ডাইজেশন গ্রুপে একটি প্রস্তাব উপস্থাপনের পরিকল্পনা করছি। উপগোষ্ঠীগুলির মতো, আমরা আশা করি যে আলোচনার বেশিরভাগ অংশ বহনযোগ্যতার আশেপাশে থাকবে।
সাবগ্রুপ অপারেশনগুলির কার্যকারিতা মূল্যায়নের জন্য, একটি বাস্তব অ্যাপ্লিকেশনটিতে, আমরা মিডিয়াপাইপে সাবগ্রুপগুলির জন্য পরীক্ষামূলক সমর্থনকে সংহত করেছি এবং এটি সাবগ্রুপ অপারেশনগুলির জন্য ক্রোমের প্রোটোটাইপ দিয়ে পরীক্ষা করেছি।
আমরা বড় ভাষার মডেলের প্রিফিল পর্বের জিপিইউ কার্নেলগুলিতে সাবগ্রুপগুলি ব্যবহার করেছি, তাই আমি কেবল প্রিফিল পর্বের জন্য স্পিডআপের প্রতিবেদন করছি। একটি ইন্টেল জিপিইউতে, আমরা দেখতে পাই যে উপগোষ্ঠীগুলি বেসলাইনের চেয়ে আড়াই গুণ দ্রুত সম্পাদন করে। তবে এই উন্নতিগুলি বিভিন্ন জিপিইউ জুড়ে সামঞ্জস্যপূর্ণ নয়।

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

জিপিইউ অপ্টিমাইজেশন কঠিন
শেষ পর্যন্ত, আপনার জিপিইউকে অনুকূল করার সর্বোত্তম উপায়টি ক্লায়েন্ট কী জিপিইউ দেয় তার উপর নির্ভরশীল। অভিনব নতুন জিপিইউ বৈশিষ্ট্যগুলি ব্যবহার করা সর্বদা আপনার প্রত্যাশা করতে পারে না, কারণ এখানে প্রচুর জটিল কারণ জড়িত থাকতে পারে। একটি জিপিইউতে সেরা অপ্টিমাইজেশন কৌশলটি অন্য জিপিইউতে সেরা কৌশল নাও হতে পারে।
জিপিইউর কম্পিউটিং থ্রেডগুলি পুরোপুরি ব্যবহার করার সময় আপনি মেমরি ব্যান্ডউইথকে হ্রাস করতে চান।
মেমরি অ্যাক্সেস নিদর্শনগুলিও সত্যই গুরুত্বপূর্ণ হতে পারে। জিপিইউগুলি যখন হার্ডওয়্যারটির জন্য অনুকূল একটি প্যাটার্নে গণনা থ্রেডগুলি মেমরি অ্যাক্সেস করে তখন আরও ভাল পারফর্ম করে। গুরুত্বপূর্ণ: আপনার বিভিন্ন জিপিইউ হার্ডওয়্যারটিতে বিভিন্ন পারফরম্যান্স বৈশিষ্ট্য আশা করা উচিত। জিপিইউর উপর নির্ভর করে আপনার বিভিন্ন অপ্টিমাইজেশন চালানোর প্রয়োজন হতে পারে।
নিম্নলিখিত চার্টে, আমরা একই ম্যাট্রিক্স গুণিত অ্যালগরিদম নিয়েছি, তবে বিভিন্ন অপ্টিমাইজেশন কৌশলগুলির প্রভাব এবং বিভিন্ন জিপিইউ জুড়ে জটিলতা এবং বৈকল্পিকতা আরও প্রদর্শনের জন্য আরও একটি মাত্রা যুক্ত করেছি। আমরা এখানে একটি নতুন কৌশল চালু করেছি, যা আমরা "সুইজল" বলব। সুইজল হার্ডওয়্যারটির জন্য আরও অনুকূল হতে মেমরি অ্যাক্সেসের নিদর্শনগুলিকে অনুকূল করে।
আপনি দেখতে পাচ্ছেন যে মেমরি সুইজলটির একটি উল্লেখযোগ্য প্রভাব রয়েছে; এটি কখনও কখনও উপগোষ্ঠীর চেয়ে আরও বেশি কার্যকর হয়। জিপিইউ 6 এ, সুইজল একটি 12x স্পিডআপ সরবরাহ করে, যখন সাবগ্রুপগুলি একটি 13x স্পিডআপ সরবরাহ করে। সম্মিলিত, তাদের একটি অবিশ্বাস্য 26x স্পিডআপ রয়েছে। অন্যান্য জিপিইউগুলির জন্য, কখনও কখনও সুইজল এবং উপগোষ্ঠী সম্মিলিত একাই একের চেয়ে ভাল পারফর্ম করে। এবং অন্যান্য জিপিইউগুলিতে, একচেটিয়াভাবে সুইজল ব্যবহার করে সেরাটি সম্পাদন করে।

হার্ডওয়ারের প্রতিটি টুকরোতে ভাল কাজ করার জন্য জিপিইউ অ্যালগরিদমগুলিকে টিউন করা এবং অনুকূলকরণ করা, প্রচুর দক্ষতার প্রয়োজন হতে পারে। তবে ধন্যবাদ, মিডিয়াপাইপ , ট্রান্সফর্মারস.জেএস , অ্যাপাচি টিভিএম , ওএনএনএক্স রানটাইম ওয়েব এবং আরও অনেক কিছুর মতো উচ্চ স্তরের লাইব্রেরি ফ্রেমওয়ার্কগুলিতে প্রচুর পরিমাণে প্রতিভাবান কাজ চলছে।
বিভিন্ন জিপিইউ আর্কিটেকচার পরিচালনার জটিলতা পরিচালনা করতে এবং ক্লায়েন্টের উপর ভালভাবে চলবে এমন প্ল্যাটফর্ম-নির্দিষ্ট কোড তৈরি করার জটিলতা পরিচালনা করতে গ্রন্থাগার এবং ফ্রেমওয়ার্কগুলি ভালভাবে অবস্থানে রয়েছে।
Takeaways
ক্রোম টিম মেশিন লার্নিং ওয়ার্কলোডগুলির জন্য ওয়েব প্ল্যাটফর্মটি উন্নত করতে ওয়েবসাম্বলি এবং ওয়েবজিপিইউ মানগুলি বিকশিত করতে সহায়তা করে চলেছে। আমরা দ্রুত গণনা আদিমগুলিতে বিনিয়োগ করছি, ওয়েব স্ট্যান্ডার্ডগুলিতে আরও ভাল ইন্টারপ এবং বৃহত্তর এবং ছোট উভয় মডেলই ডিভাইসগুলিতে দক্ষতার সাথে চালাতে সক্ষম হয়েছে তা নিশ্চিত করছি।
আমাদের লক্ষ্য হ'ল ওয়েবের সেরাটি ধরে রাখার সময় প্ল্যাটফর্মের সক্ষমতা সর্বাধিক করা: এটি পৌঁছনো, ব্যবহারযোগ্যতা এবং বহনযোগ্যতা। এবং আমরা একা এটি করছি না। আমরা ডাব্লু 3 সি -তে অন্যান্য ব্রাউজার বিক্রেতাদের এবং অনেক উন্নয়ন অংশীদারদের সাথে সহযোগিতায় কাজ করছি।
আমরা আশা করি আপনি নিম্নলিখিতগুলি মনে রাখবেন, আপনি যেমন ওয়েবসেম্বলি এবং ওয়েবগিপিইউ দিয়ে কাজ করেন:
- এআই অনুমান এখন ওয়েবে, ডিভাইসগুলি জুড়ে উপলব্ধ। এটি ক্লায়েন্ট ডিভাইসগুলিতে চলার সুবিধা নিয়ে আসে যেমন হ্রাস সার্ভার ব্যয়, কম বিলম্ব এবং বর্ধিত গোপনীয়তা।
- যদিও আলোচিত অনেকগুলি বৈশিষ্ট্য মূলত ফ্রেমওয়ার্ক লেখকদের সাথে প্রাসঙ্গিক, আপনার অ্যাপ্লিকেশনগুলি খুব বেশি ওভারহেড ছাড়াই উপকৃত হতে পারে।
- ওয়েব স্ট্যান্ডার্ডগুলি তরল এবং বিকশিত হয় এবং আমরা সর্বদা প্রতিক্রিয়া খুঁজছি। ওয়েবসেম্বলি এবং ওয়েবজিপিইউর জন্য আপনার ভাগ করুন।
স্বীকৃতি
আমরা ইন্টেল ওয়েব গ্রাফিক্স টিমকে ধন্যবাদ জানাতে চাই, যারা ওয়েবজিপিইউ এফ 16 এবং প্যাকড ইন্টিগার ডট পণ্য বৈশিষ্ট্যগুলি চালানোর ক্ষেত্রে সহায়ক ভূমিকা পালন করেছিল। আমরা অন্যান্য ব্রাউজার বিক্রেতাদের সহ ডাব্লু 3 সি -তে ওয়েবসেম্বলি এবং ওয়েবজিপিইউ ওয়ার্কিং গ্রুপগুলির অন্যান্য সদস্যদের ধন্যবাদ জানাতে চাই।
অবিশ্বাস্য অংশীদার হওয়ার জন্য গুগল এবং ওপেন সোর্স সম্প্রদায়ের উভয়ই এআই এবং এমএল দলগুলিকে ধন্যবাদ। এবং অবশ্যই, আমাদের সমস্ত সতীর্থ যারা এই সমস্ত কিছু সম্ভব করে তোলে।
,এই দস্তাবেজটি দ্রুত ওয়েব এআই, পার্ট 1 এর জন্য ওয়েবসেম্বলি এবং ওয়েবজিপিইউ বর্ধনের একটি ধারাবাহিকতা। আমরা আপনাকে এই পোস্টটি পড়ার পরামর্শ দিচ্ছি বা চালিয়ে যাওয়ার আগে আইও 24 এ আলাপটি দেখার পরামর্শ দিচ্ছি।
ওয়েবজিপিইউ
ওয়েবজিপিইউ দক্ষ, উচ্চ-সমান্তরাল গণনা সম্পাদনের জন্য ওয়েব অ্যাপ্লিকেশনগুলিকে ক্লায়েন্টের জিপিইউ হার্ডওয়্যারগুলিতে অ্যাক্সেস দেয়। ক্রোমে ওয়েবজিপিইউ চালু করার পর থেকে আমরা ওয়েবে কৃত্রিম বুদ্ধিমত্তার (এআই) এবং মেশিন লার্নিং (এমএল) এর অবিশ্বাস্য ডেমো দেখেছি।
উদাহরণস্বরূপ, ওয়েব স্থিতিশীল প্রসারণ প্রমাণ করেছে যে সরাসরি ব্রাউজারে পাঠ্য থেকে চিত্র তৈরি করতে এআই ব্যবহার করা সম্ভব। এই বছরের শুরুর দিকে, গুগলের নিজস্ব মিডিয়াপাইপ দল বৃহত ভাষার মডেল অনুমানের জন্য পরীক্ষামূলক সমর্থন প্রকাশ করেছে।
নিম্নলিখিত অ্যানিমেশনটি গুগলের ওপেন সোর্স লার্জ ল্যাঙ্গুয়েজ মডেল (এলএলএম) জেমমা দেখায়, ক্রোমে পুরোপুরি অন-ডিভাইস, রিয়েল টাইমে চলছে।
নিম্নলিখিত আলিঙ্গন ফেসের ডেমো মেটা বিভাগের যে কোনও মডেল ক্লায়েন্টের উপর পুরোপুরি উচ্চ মানের অবজেক্ট মাস্ক তৈরি করে।
এগুলি কেবলমাত্র কয়েকটি আশ্চর্যজনক প্রকল্প যা এআই এবং এমএল এর জন্য ওয়েবজিপিইউর শক্তি প্রদর্শন করে। ওয়েবজিপিইউ এই মডেলগুলি এবং অন্যদের সিপিইউতে তাদের তুলনায় উল্লেখযোগ্যভাবে দ্রুত চালানোর অনুমতি দেয়।
টেক্সট এম্বেডিংয়ের জন্য আলিঙ্গন ফেসের ওয়েবজিপিইউ বেঞ্চমার্ক একই মডেলের সিপিইউ বাস্তবায়নের তুলনায় অসাধারণ স্পিডআপগুলি প্রদর্শন করে। একটি অ্যাপল এম 1 ম্যাক্স ল্যাপটপে, ওয়েবজিপিইউ 30 গুণ বেশি দ্রুত ছিল। অন্যরা রিপোর্ট করেছেন যে ওয়েবজিপিইউ 120 বার বেঞ্চমার্ককে ত্বরান্বিত করে।
এআই এবং এমএল এর জন্য ওয়েবজিপিইউ বৈশিষ্ট্যগুলি উন্নত করা
ওয়েবজিপিইউ এআই এবং এমএল মডেলের জন্য দুর্দান্ত, যা গণনা শেডারদের সমর্থন করার জন্য ধন্যবাদ কোটি কোটি প্যারামিটার থাকতে পারে। গণনা শেডারগুলি জিপিইউতে চালিত হয় এবং বড় পরিমাণে ডেটা সমান্তরাল অ্যারে অপারেশনগুলি চালাতে সহায়তা করে।
গত এক বছরে ওয়েবজিপিইউতে অসংখ্য উন্নতির মধ্যে আমরা ওয়েবে এমএল এবং এআই পারফরম্যান্স উন্নত করতে আরও ক্ষমতা যুক্ত করে চলেছি। সম্প্রতি, আমরা দুটি নতুন বৈশিষ্ট্য চালু করেছি: 16-বিট ফ্লোটিং পয়েন্ট এবং প্যাকড ইন্টিজার ডট পণ্য।
16-বিট ফ্লোটিং পয়েন্ট
মনে রাখবেন, এমএল কাজের চাপগুলির জন্য নির্ভুলতার প্রয়োজন হয় না । shader-f16
এমন একটি বৈশিষ্ট্য যা ওয়েবজিপিইউ শেডিং ভাষায় F16 প্রকারের ব্যবহার সক্ষম করে। এই ভাসমান পয়েন্ট টাইপটি সাধারণ 32 বিটের পরিবর্তে 16 বিট নেয়। F16 এর একটি ছোট পরিসীমা রয়েছে এবং এটি কম সুনির্দিষ্ট, তবে অনেকগুলি এমএল মডেলের জন্য এটি যথেষ্ট।
এই বৈশিষ্ট্যটি কয়েকটি উপায়ে দক্ষতা বৃদ্ধি করে:
হ্রাস মেমরি : এফ 16 উপাদানগুলির সাথে টেনারগুলি অর্ধেক স্থান গ্রহণ করে, যা অর্ধেক মেমরির ব্যবহারকে কেটে দেয়। জিপিইউ গণনাগুলি প্রায়শই মেমরি ব্যান্ডউইথের উপর বাধাযুক্ত থাকে, তাই অর্ধেক মেমরিটির অর্থ প্রায়শই শেডারগুলি দ্বিগুণ দ্রুত চালিত হয়। প্রযুক্তিগতভাবে, মেমরি ব্যান্ডউইথ সংরক্ষণ করতে আপনার F16 দরকার নেই। কম-নির্ভুলতা বিন্যাসে ডেটা সংরক্ষণ করা সম্ভব এবং তারপরে এটি গণনার জন্য শেডারে সম্পূর্ণ F32 এ প্রসারিত করা সম্ভব। তবে, জিপিইউ ডেটা প্যাক এবং আনপ্যাক করতে অতিরিক্ত কম্পিউটিং শক্তি ব্যয় করে।
হ্রাস করা ডেটা রূপান্তর : F16 ডেটা রূপান্তরকে হ্রাস করে কম গণনা ব্যবহার করে। কম নির্ভুলতার ডেটা সংরক্ষণ করা যায় এবং তারপরে সরাসরি রূপান্তর ছাড়াই ব্যবহার করা যেতে পারে।
বর্ধিত সমান্তরালতা : আধুনিক জিপিইউগুলি জিপিইউর এক্সিকিউশন ইউনিটগুলিতে একই সাথে আরও মান ফিট করতে সক্ষম হয়, এটি এটিকে আরও বেশি সংখ্যক সমান্তরাল গণনা সম্পাদন করতে দেয়। উদাহরণস্বরূপ, একটি জিপিইউ যা প্রতি সেকেন্ডে 5 ট্রিলিয়ন এফ 32 ভাসমান-পয়েন্ট অপারেশনগুলিকে সমর্থন করে তা প্রতি সেকেন্ডে 10 ট্রিলিয়ন এফ 16 ভাসমান-পয়েন্ট অপারেশনগুলিকে সমর্থন করতে পারে।

shader-f16
এর সাথে, টেক্সট এম্বেডিং বেঞ্চমার্কের জন্য ফেসের ওয়েবজিপিইউ বেঞ্চমার্কটি অ্যাপল এম 1 ম্যাক্স ল্যাপটপে এফ 32 এর চেয়ে 3 গুণ দ্রুত বেঞ্চমার্ক চালায়।ওয়েবলএলএম একটি প্রকল্প যা একাধিক বৃহত ভাষার মডেল চালাতে পারে। এটি অ্যাপাচি টিভিএম ব্যবহার করে, একটি ওপেন সোর্স মেশিন লার্নিং সংকলক কাঠামো।
আমি ওয়েবলএলএমকে লামা 3 আট-বিলিয়ন প্যারামিটার মডেল ব্যবহার করে প্যারিসে ভ্রমণের পরিকল্পনা করতে বলেছিলাম। ফলাফলগুলি দেখায় যে মডেলের প্রিফিল পর্বের সময়, F16 F32 এর চেয়ে 2.1 গুণ দ্রুত। ডিকোড পর্বের সময়, এটি 1.3 গুণ বেশি দ্রুত।
অ্যাপ্লিকেশনগুলি অবশ্যই প্রথমে নিশ্চিত করতে হবে যে জিপিইউ অ্যাডাপ্টার F16 সমর্থন করে এবং যদি এটি উপলব্ধ থাকে তবে জিপিইউ ডিভাইসের অনুরোধ করার সময় স্পষ্টভাবে এটি সক্ষম করুন। যদি F16 সমর্থিত না হয় তবে আপনি requiredFeatures
অ্যারেতে এটি অনুরোধ করতে পারবেন না।
// main.js
const adapter = await navigator.gpu.requestAdapter();
const supportsF16 = adapter.features.has('shader-f16');
if (supportsF16) {
// Use f16.
const device = await adapter.requestDevice({
requiredFeatures: ['shader-f16'],
});
initApp(device);
}
তারপরে, আপনার ওয়েবজিপিইউ শেডারে, আপনাকে অবশ্যই শীর্ষে F16 সক্ষম করতে হবে। এর পরে, আপনি অন্য কোনও ফ্লোট ডেটা টাইপের মতো শেডারের মধ্যে এটি ব্যবহার করতে পারেন।
// my-shader.wgsl
enable f16;
struct Data {
values : array<vec4<f16>>
}
@group(0) @binding(0) var<storage, read> data : Data;
@compute @workgroup_size(64) fn main(@builtin(global_invocation_id) gid : vec3u) {
let value : vec4<f16> = data.values[gid.x];
...
}
প্যাকড পূর্ণসংখ্যা ডট পণ্য
অনেক মডেল এখনও মাত্র 8 বিট নির্ভুলতার সাথে ভাল কাজ করে (এফ 16 এর অর্ধেক)। এটি বিভাজন এবং অবজেক্টের স্বীকৃতির জন্য এলএলএম এবং চিত্রের মডেলগুলির মধ্যে জনপ্রিয়। এটি বলেছিল, মডেলগুলির জন্য আউটপুট গুণমান কম নির্ভুলতার সাথে হ্রাস পায়, সুতরাং 8-বিট কোয়ান্টাইজেশন প্রতিটি অ্যাপ্লিকেশনটির জন্য উপযুক্ত নয়।
তুলনামূলকভাবে কয়েকটি জিপিইউ স্থানীয়ভাবে 8-বিট মানগুলিকে সমর্থন করে। এখানেই প্যাকযুক্ত পূর্ণসংখ্যা ডট পণ্যগুলি আসে We আমরা ক্রোম 123 এ ডিপি 4 এ প্রেরণ করেছি।
আধুনিক জিপিইউগুলিতে দুটি 32-বিট পূর্ণসংখ্যা নেওয়ার জন্য বিশেষ নির্দেশাবলী রয়েছে, তাদের প্রত্যেককে টানা 4-বিট পূর্ণসংখ্যার হিসাবে ব্যাখ্যা করুন এবং তাদের উপাদানগুলির মধ্যে বিন্দু পণ্যটি গণনা করুন।
এটি এআই এবং মেশিন লার্নিংয়ের জন্য বিশেষভাবে কার্যকর কারণ ম্যাট্রিক্স গুণক কার্নেলগুলি অনেকগুলি, অনেক বিন্দু পণ্য দ্বারা গঠিত।
উদাহরণস্বরূপ, আসুন একটি 8 x 1 ভেক্টরের সাথে একটি 4 x 8 ম্যাট্রিক্সকে গুণ করি। এটি গণনা করা আউটপুট ভেক্টরের প্রতিটি মান গণনা করতে 4 টি বিন্দু পণ্য গ্রহণের সাথে জড়িত; এ, বি, সি, এবং ডি।
এই আউটপুটগুলির প্রতিটি গণনা করার প্রক্রিয়া একই; আমরা এর মধ্যে একটি গণনার সাথে জড়িত পদক্ষেপগুলি দেখব। কোনও গণনার আগে, আমাদের প্রথমে 8-বিট পূর্ণসংখ্যার ডেটা এমন এক ধরণের রূপান্তর করতে হবে যা আমরা F16 এর মতো গাণিতিক সম্পাদন করতে পারি। তারপরে, আমরা একটি উপাদান-ভিত্তিক গুণ পরিচালনা করি এবং শেষ পর্যন্ত সমস্ত পণ্য একসাথে যুক্ত করি। মোট, পুরো ম্যাট্রিক্স-ভেক্টর গুণনের জন্য, আমরা ডেটা আনপ্যাক করতে, 32 ভাসমান গুণগুলি এবং 28 টি ভাসমান সংযোজনগুলি আনপ্যাক করতে 40 টি পূর্ণসংখ্যা সঞ্চালন করি।
আরও অপারেশন সহ বৃহত্তর ম্যাট্রিকগুলির জন্য, প্যাকযুক্ত পূর্ণসংখ্যা ডট পণ্যগুলি কাজের পরিমাণ হ্রাস করতে সহায়তা করতে পারে।
ফলাফল ভেক্টরের প্রতিটি আউটপুটগুলির জন্য, আমরা ওয়েবজিপিইউ শেডিং ল্যাঙ্গুয়েজ বিল্ট-ইন dot4U8Packed
ব্যবহার করে দুটি প্যাকড ডট পণ্য ক্রিয়াকলাপ সম্পাদন করি এবং তারপরে ফলাফলগুলি একসাথে যুক্ত করি। মোট, পুরো ম্যাট্রিক্স-ভেক্টর গুণনের জন্য, আমরা কোনও ডেটা রূপান্তর সম্পাদন করি না। আমরা 8 টি প্যাকড ডট পণ্য এবং 4 টি পূর্ণসংখ্যা সংযোজন সম্পাদন করি।
আমরা বিভিন্ন ভোক্তা জিপিইউতে 8-বিট ডেটা সহ প্যাকড পূর্ণসংখ্যা ডট পণ্যগুলি পরীক্ষা করেছি। 16-বিট ভাসমান পয়েন্টের সাথে তুলনা করে আমরা দেখতে পাচ্ছি যে 8-বিট 1.6 থেকে 2.8 গুণ দ্রুত। যখন আমরা অতিরিক্তভাবে প্যাকড ইন্টিজার ডট পণ্যগুলি ব্যবহার করি তখন পারফরম্যান্স আরও ভাল। এটি 1.7 থেকে 2.9 গুণ দ্রুত।

wgslLanguageFeatures
যদি জিপিইউ স্থানীয়ভাবে প্যাকড ডট পণ্যগুলিকে সমর্থন করে না, তবে ব্রাউজারটি নিজস্ব বাস্তবায়নকে পলিফিল করে।
// main.js
if (navigator.gpu.wgslLanguageFeatures.has('packed_4x8_integer_dot_product')) {
// Use dot4U8Packed, dot4I8Packed builtin
// functions in the shaders.
}
নিম্নলিখিত কোড স্নিপেট ডিফ (পার্থক্য) একটি ওয়েবজিপিইউ শেডারে প্যাকড পূর্ণসংখ্যা পণ্যগুলি ব্যবহার করার জন্য প্রয়োজনীয় পরিবর্তনগুলি হাইলাইট করে।
এর আগে - একটি ওয়েবজিপিইউ শেডার যা আংশিক বিন্দু পণ্যগুলি ভেরিয়েবল `সমষ্টিতে জমে` লুপের শেষে, `যোগফল একটি ভেক্টর এবং ইনপুট ম্যাট্রিক্সের একটি সারি মধ্যে সম্পূর্ণ বিন্দু পণ্য ধারণ করে।
// my-dot-product.wgsl @compute @workgroup_size(64) fn main(@builtin(global_invocation_id) gid : vec3u) { var sum : f16; let start = gid.x * uniforms.dim; for (var i = 0u; i < uniforms.dim; i++) { let v1 : vec4<f16> = vector.values[i]; let v2 : vec4<f16> = matrix.values[start + i]; sum += dot(v1, v2); } }
এর পরে - প্যাকড ইন্টিজার ডট পণ্যগুলি ব্যবহার করার জন্য একটি ওয়েবজিপিইউ শেডার লেখা। মূল পার্থক্যটি হ'ল ভেক্টর এবং ম্যাট্রিক্সের বাইরে 4 টি ভাসমান মান লোড করার পরিবর্তে এই শেডারটি একটি একক 32-বিট পূর্ণসংখ্যা লোড করে। এই 32-বিট পূর্ণসংখ্যার চারটি 8-বিট পূর্ণসংখ্যার মানগুলির ডেটা ধারণ করে। তারপরে, আমরা দুটি মানের ডট পণ্য গণনা করতে dot4U8Packed
কল করি।
// my-dot-product.wgsl
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) gid : vec3u) {
var sum : f32;
let start = gid.x * uniforms.dim;
for (var i = 0u; i < uniforms.dim; i++) {
let v1 : u32 = vector.values[i];
let v2 : u32 = matrix.values[start + i];
sum += dot4U8Packed(v1, v2);
}
}
উভয় 16-বিট ফ্লোটিং পয়েন্ট এবং প্যাকড ইন্টিজার ডট পণ্যগুলি ক্রোমে শিপড বৈশিষ্ট্য যা এআই এবং এমএলকে ত্বরান্বিত করে। হার্ডওয়্যার এটি সমর্থন করার সময় 16-বিট ভাসমান পয়েন্টটি উপলব্ধ এবং ক্রোম সমস্ত ডিভাইসে পূর্ণসংখ্যা ডট পণ্যগুলি প্যাক করা হয়।
আপনি আরও ভাল পারফরম্যান্স অর্জন করতে আজ ক্রোম স্থিতিতে এই বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন।
প্রস্তাবিত বৈশিষ্ট্য
প্রত্যাশায়, আমরা আরও দুটি বৈশিষ্ট্য অনুসন্ধান করছি: উপগোষ্ঠী এবং সমবায় ম্যাট্রিক্স গুণ।
উপগোষ্ঠী বৈশিষ্ট্যগুলি সিমড-স্তরের সমান্তরালতা যোগাযোগ করতে বা সম্মিলিত গণিত ক্রিয়াকলাপগুলি সম্পাদন করতে সক্ষম করে, যেমন 16 টিরও বেশি সংখ্যার জন্য যোগফল। এটি দক্ষ ক্রস-থ্রেড ডেটা ভাগ করে নেওয়ার অনুমতি দেয়। উপগোষ্ঠীগুলি আধুনিক জিপিইউ এপিআইগুলিতে বিভিন্ন নাম এবং কিছুটা ভিন্ন আকারে সমর্থিত।
আমরা ওয়েবজিপিইউ স্ট্যান্ডার্ডাইজেশন গ্রুপে নিয়েছি এমন একটি প্রস্তাবের মধ্যে সাধারণ সেটটি নিঃসৃত করেছি। এবং, আমরা একটি পরীক্ষামূলক পতাকার পিছনে ক্রোমে প্রোটোটাইপড সাবগ্রুপগুলি করেছি এবং আমাদের প্রাথমিক ফলাফলগুলি আলোচনায় নিয়ে এসেছি। মূল সমস্যাটি কীভাবে বহনযোগ্য আচরণ নিশ্চিত করা যায়।
সমবায় ম্যাট্রিক্স গুণটি জিপিইউগুলির আরও সাম্প্রতিক সংযোজন। একটি বৃহত ম্যাট্রিক্স গুণকে একাধিক ছোট ম্যাট্রিক্স গুণে বিভক্ত করা যেতে পারে। সমবায় ম্যাট্রিক্স গুণক একক যৌক্তিক পদক্ষেপে এই ছোট স্থির আকারের ব্লকগুলিতে গুণগুলি সম্পাদন করে। এই পদক্ষেপের মধ্যে, থ্রেডগুলির একটি গ্রুপ ফলাফলটি গণনা করতে দক্ষতার সাথে সহযোগিতা করে।
আমরা অন্তর্নিহিত জিপিইউ এপিআইগুলিতে সমর্থন সমীক্ষা করেছি এবং ওয়েবজিপিইউ স্ট্যান্ডার্ডাইজেশন গ্রুপে একটি প্রস্তাব উপস্থাপনের পরিকল্পনা করছি। উপগোষ্ঠীগুলির মতো, আমরা আশা করি যে আলোচনার বেশিরভাগ অংশ বহনযোগ্যতার আশেপাশে থাকবে।
সাবগ্রুপ অপারেশনগুলির কার্যকারিতা মূল্যায়নের জন্য, একটি বাস্তব অ্যাপ্লিকেশনটিতে, আমরা মিডিয়াপাইপে সাবগ্রুপগুলির জন্য পরীক্ষামূলক সমর্থনকে সংহত করেছি এবং এটি সাবগ্রুপ অপারেশনগুলির জন্য ক্রোমের প্রোটোটাইপ দিয়ে পরীক্ষা করেছি।
আমরা বড় ভাষার মডেলের প্রিফিল পর্বের জিপিইউ কার্নেলগুলিতে সাবগ্রুপগুলি ব্যবহার করেছি, তাই আমি কেবল প্রিফিল পর্বের জন্য স্পিডআপের প্রতিবেদন করছি। একটি ইন্টেল জিপিইউতে, আমরা দেখতে পাই যে উপগোষ্ঠীগুলি বেসলাইনের চেয়ে আড়াই গুণ দ্রুত সম্পাদন করে। তবে এই উন্নতিগুলি বিভিন্ন জিপিইউ জুড়ে সামঞ্জস্যপূর্ণ নয়।

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

জিপিইউ অপ্টিমাইজেশন কঠিন
শেষ পর্যন্ত, আপনার জিপিইউকে অনুকূল করার সর্বোত্তম উপায়টি ক্লায়েন্ট কী জিপিইউ দেয় তার উপর নির্ভরশীল। অভিনব নতুন জিপিইউ বৈশিষ্ট্যগুলি ব্যবহার করা সর্বদা আপনার প্রত্যাশা করতে পারে না, কারণ এখানে প্রচুর জটিল কারণ জড়িত থাকতে পারে। একটি জিপিইউতে সেরা অপ্টিমাইজেশন কৌশলটি অন্য জিপিইউতে সেরা কৌশল নাও হতে পারে।
জিপিইউর কম্পিউটিং থ্রেডগুলি পুরোপুরি ব্যবহার করার সময় আপনি মেমরি ব্যান্ডউইথকে হ্রাস করতে চান।
মেমরি অ্যাক্সেস নিদর্শনগুলিও সত্যই গুরুত্বপূর্ণ হতে পারে। জিপিইউগুলি যখন হার্ডওয়্যারটির জন্য অনুকূল একটি প্যাটার্নে গণনা থ্রেডগুলি মেমরি অ্যাক্সেস করে তখন আরও ভাল পারফর্ম করে। গুরুত্বপূর্ণ: আপনার বিভিন্ন জিপিইউ হার্ডওয়্যারটিতে বিভিন্ন পারফরম্যান্স বৈশিষ্ট্য আশা করা উচিত। জিপিইউর উপর নির্ভর করে আপনার বিভিন্ন অপ্টিমাইজেশন চালানোর প্রয়োজন হতে পারে।
নিম্নলিখিত চার্টে, আমরা একই ম্যাট্রিক্স গুণিত অ্যালগরিদম নিয়েছি, তবে বিভিন্ন অপ্টিমাইজেশন কৌশলগুলির প্রভাব এবং বিভিন্ন জিপিইউ জুড়ে জটিলতা এবং বৈকল্পিকতা আরও প্রদর্শনের জন্য আরও একটি মাত্রা যুক্ত করেছি। আমরা এখানে একটি নতুন কৌশল চালু করেছি, যা আমরা "সুইজল" বলব। সুইজল হার্ডওয়্যারটির জন্য আরও অনুকূল হতে মেমরি অ্যাক্সেসের নিদর্শনগুলিকে অনুকূল করে।
আপনি দেখতে পাচ্ছেন যে মেমরি সুইজলটির একটি উল্লেখযোগ্য প্রভাব রয়েছে; এটি কখনও কখনও উপগোষ্ঠীর চেয়ে আরও বেশি কার্যকর হয়। জিপিইউ 6 এ, সুইজল একটি 12x স্পিডআপ সরবরাহ করে, যখন সাবগ্রুপগুলি একটি 13x স্পিডআপ সরবরাহ করে। সম্মিলিত, তাদের একটি অবিশ্বাস্য 26x স্পিডআপ রয়েছে। অন্যান্য জিপিইউগুলির জন্য, কখনও কখনও সুইজল এবং উপগোষ্ঠী সম্মিলিত একাই একের চেয়ে ভাল পারফর্ম করে। এবং অন্যান্য জিপিইউগুলিতে, একচেটিয়াভাবে সুইজল ব্যবহার করে সেরাটি সম্পাদন করে।

হার্ডওয়ারের প্রতিটি টুকরোতে ভাল কাজ করার জন্য জিপিইউ অ্যালগরিদমগুলিকে টিউন করা এবং অনুকূলকরণ করা, প্রচুর দক্ষতার প্রয়োজন হতে পারে। তবে ধন্যবাদ, মিডিয়াপাইপ , ট্রান্সফর্মারস.জেএস , অ্যাপাচি টিভিএম , ওএনএনএক্স রানটাইম ওয়েব এবং আরও অনেক কিছুর মতো উচ্চ স্তরের লাইব্রেরি ফ্রেমওয়ার্কগুলিতে প্রচুর পরিমাণে প্রতিভাবান কাজ চলছে।
বিভিন্ন জিপিইউ আর্কিটেকচার পরিচালনার জটিলতা পরিচালনা করতে এবং ক্লায়েন্টের উপর ভালভাবে চলবে এমন প্ল্যাটফর্ম-নির্দিষ্ট কোড তৈরি করার জটিলতা পরিচালনা করতে গ্রন্থাগার এবং ফ্রেমওয়ার্কগুলি ভালভাবে অবস্থানে রয়েছে।
Takeaways
ক্রোম টিম মেশিন লার্নিং ওয়ার্কলোডগুলির জন্য ওয়েব প্ল্যাটফর্মটি উন্নত করতে ওয়েবসাম্বলি এবং ওয়েবজিপিইউ মানগুলি বিকশিত করতে সহায়তা করে চলেছে। আমরা দ্রুত গণনা আদিমগুলিতে বিনিয়োগ করছি, ওয়েব স্ট্যান্ডার্ডগুলিতে আরও ভাল ইন্টারপ এবং বৃহত্তর এবং ছোট উভয় মডেলই ডিভাইসগুলিতে দক্ষতার সাথে চালাতে সক্ষম হয়েছে তা নিশ্চিত করছি।
আমাদের লক্ষ্য হ'ল ওয়েবের সেরাটি ধরে রাখার সময় প্ল্যাটফর্মের সক্ষমতা সর্বাধিক করা: এটি পৌঁছনো, ব্যবহারযোগ্যতা এবং বহনযোগ্যতা। এবং আমরা একা এটি করছি না। আমরা ডাব্লু 3 সি -তে অন্যান্য ব্রাউজার বিক্রেতাদের এবং অনেক উন্নয়ন অংশীদারদের সাথে সহযোগিতায় কাজ করছি।
আমরা আশা করি আপনি নিম্নলিখিতগুলি মনে রাখবেন, আপনি যেমন ওয়েবসেম্বলি এবং ওয়েবগিপিইউ দিয়ে কাজ করেন:
- এআই অনুমান এখন ওয়েবে, ডিভাইসগুলি জুড়ে উপলব্ধ। এটি ক্লায়েন্ট ডিভাইসগুলিতে চলার সুবিধা নিয়ে আসে যেমন হ্রাস সার্ভার ব্যয়, কম বিলম্ব এবং বর্ধিত গোপনীয়তা।
- যদিও আলোচিত অনেকগুলি বৈশিষ্ট্য মূলত ফ্রেমওয়ার্ক লেখকদের সাথে প্রাসঙ্গিক, আপনার অ্যাপ্লিকেশনগুলি খুব বেশি ওভারহেড ছাড়াই উপকৃত হতে পারে।
- ওয়েব স্ট্যান্ডার্ডগুলি তরল এবং বিকশিত হয় এবং আমরা সর্বদা প্রতিক্রিয়া খুঁজছি। ওয়েবসেম্বলি এবং ওয়েবজিপিইউর জন্য আপনার ভাগ করুন।
স্বীকৃতি
আমরা ইন্টেল ওয়েব গ্রাফিক্স টিমকে ধন্যবাদ জানাতে চাই, যারা ওয়েবজিপিইউ এফ 16 এবং প্যাকড ইন্টিগার ডট পণ্য বৈশিষ্ট্যগুলি চালানোর ক্ষেত্রে সহায়ক ভূমিকা পালন করেছিল। আমরা অন্যান্য ব্রাউজার বিক্রেতাদের সহ ডাব্লু 3 সি -তে ওয়েবসেম্বলি এবং ওয়েবজিপিইউ ওয়ার্কিং গ্রুপগুলির অন্যান্য সদস্যদের ধন্যবাদ জানাতে চাই।
অবিশ্বাস্য অংশীদার হওয়ার জন্য গুগল এবং ওপেন সোর্স সম্প্রদায়ের উভয়ই এআই এবং এমএল দলগুলিকে ধন্যবাদ। এবং অবশ্যই, আমাদের সমস্ত সতীর্থ যারা এই সমস্ত কিছু সম্ভব করে তোলে।