WebGPU-তে নতুন কি আছে (Chrome 120)

ফ্রাঁসোয়া বিউফোর্ট
François Beaufort

WGSL-এ ১৬-বিট ফ্লোটিং-পয়েন্ট মানের জন্য সমর্থন

WGSL-এ, f16 টাইপ হল IEEE-754 binary16 (অর্ধ-নির্ভুলতা) ফর্ম্যাটের 16-বিট ফ্লোটিং-পয়েন্ট মানের সেট। এর অর্থ হল এটি একটি ফ্লোটিং-পয়েন্ট সংখ্যা উপস্থাপন করতে 16 বিট ব্যবহার করে, যেখানে প্রচলিত একক-নির্ভুলতা ফ্লোটিং-পয়েন্ট ( f32 ) এর জন্য 32 বিট ব্যবহার করা হয়। এই ছোট আকার উল্লেখযোগ্য কর্মক্ষমতা উন্নতির দিকে পরিচালিত করতে পারে, বিশেষ করে যখন প্রচুর পরিমাণে ডেটা প্রক্রিয়াকরণ করা হয়।

তুলনা করার জন্য, একটি Apple M1 Pro ডিভাইসে, WebLLM চ্যাট ডেমোতে ব্যবহৃত Llama2 7B মডেলের f16 বাস্তবায়ন f32 বাস্তবায়নের তুলনায় উল্লেখযোগ্যভাবে দ্রুত, প্রিফিল গতিতে 28% উন্নতি এবং ডিকোডিং গতিতে 41% উন্নতি, যেমনটি নিম্নলিখিত স্ক্রিনশটগুলিতে দেখানো হয়েছে।

f32 এবং f16 Llama2 7B মডেলের WebLLM চ্যাট ডেমোর স্ক্রিনশট।
f32 (বামে) এবং f16 (ডানে) Llama2 7B মডেল সহ WebLLM চ্যাট ডেমো।

সব GPU তে 16-বিট ফ্লোটিং-পয়েন্ট মান থাকে না। যখন "shader-f16" বৈশিষ্ট্যটি GPUAdapter এ উপলব্ধ থাকে, তখন আপনি এখন এই বৈশিষ্ট্য সহ একটি GPUDevice অনুরোধ করতে পারেন এবং একটি WGSL শেডার মডিউল তৈরি করতে পারেন যা অর্ধ-নির্ভুলতা ফ্লোটিং-পয়েন্ট টাইপ f16 এর সুবিধা নেয়। এই ধরণেরটি WGSL শেডার মডিউলে ব্যবহারের জন্য বৈধ, যদি আপনি f16 WGSL এক্সটেনশনটি enable f16; দিয়ে সক্ষম করেন। অন্যথায়, createShaderModule() একটি বৈধতা ত্রুটি তৈরি করবে। নিম্নলিখিত ন্যূনতম উদাহরণটি দেখুন এবং dawn:1510 ইস্যু করুন

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("shader-f16")) {
  throw new Error("16-bit floating-point value support is not available");
}
// Explicitly request 16-bit floating-point value support.
const device = await adapter.requestDevice({
  requiredFeatures: ["shader-f16"],
});

const code = `
  enable f16;

  @compute @workgroup_size(1)
  fn main() {
    const c : vec3h = vec3<f16>(1.0h, 2.0h, 3.0h);
  }
`;

const shaderModule = device.createShaderModule({ code });
// Create a compute pipeline with this shader module
// and run the shader on the GPU...

নিম্নলিখিত স্নিপেটে দেখানো "shader-f16" বৈশিষ্ট্য সমর্থনের উপর নির্ভর করে WGSL শেডার মডিউল কোডে f16 এবং f32 উভয় প্রকারকেই একটি alias দিয়ে সমর্থন করা সম্ভব।

const adapter = await navigator.gpu.requestAdapter();
const hasShaderF16 = adapter.features.has("shader-f16");

const device = await adapter.requestDevice({
  requiredFeatures: hasShaderF16 ? ["shader-f16"] : [],
});

const header = hasShaderF16
  ? `enable f16;
     alias min16float = f16;`
  : `alias min16float = f32;`;

const code = `
  ${header}

  @compute @workgroup_size(1)
  fn main() {
    const c = vec3<min16float>(1.0, 2.0, 3.0);
  }
`;

সীমা অতিক্রম করুন

সমস্ত রঙের সংযুক্তি জুড়ে রেন্ডার পাইপলাইন আউটপুট ডেটার একটি নমুনা (পিক্সেল বা সাবপিক্সেল) ধরে রাখার জন্য ডিফল্টরূপে সর্বাধিক বাইটের সংখ্যা 32 বাইট। এখন maxColorAttachmentBytesPerSample সীমা ব্যবহার করে 64 পর্যন্ত অনুরোধ করা সম্ভব। নিম্নলিখিত উদাহরণটি দেখুন এবং dawn:2036 ইস্যু করুন

const adapter = await navigator.gpu.requestAdapter();

if (adapter.limits.maxColorAttachmentBytesPerSample < 64) {
  // When the desired limit isn't supported, take action to either fall back to
  // a code path that does not require the higher limit or notify the user that
  // their device does not meet minimum requirements.
}

// Request highest limit of max color attachments bytes per sample.
const device = await adapter.requestDevice({
  requiredLimits: { maxColorAttachmentBytesPerSample: 64 },
});

সকল প্ল্যাটফর্মে ইন্টার-স্টেজ যোগাযোগের জন্য ব্যবহৃত maxInterStageShaderVariables এবং maxInterStageShaderComponents সীমা বৃদ্ধি করা হয়েছে। বিস্তারিত জানার জন্য dawn:1448 সংখ্যাটি দেখুন।

প্রতিটি শেডার পর্যায়ে, পাইপলাইন লেআউট জুড়ে বাইন্ড গ্রুপ লেআউট এন্ট্রির সর্বাধিক সংখ্যা, যা স্টোরেজ বাফার, ডিফল্টরূপে 8। এখন maxStorageBuffersPerShaderStage সীমা ব্যবহার করে 10 পর্যন্ত অনুরোধ করা সম্ভব। সমস্যা dawn:2159 দেখুন।

একটি নতুন maxBindGroupsPlusVertexBuffers সীমা যোগ করা হয়েছে। এতে একসাথে ব্যবহৃত সর্বাধিক সংখ্যক বাইন্ড গ্রুপ এবং ভার্টেক্স বাফার স্লট রয়েছে, সর্বোচ্চ সূচকের নীচে যেকোনো খালি স্লট গণনা করা হচ্ছে। এর ডিফল্ট মান হল 24। দেখুন ইস্যু dawn:1849

গভীরতা-স্টেন্সিল অবস্থায় পরিবর্তন

ডেভেলপার অভিজ্ঞতা উন্নত করার জন্য, depth-stencil state depthWriteEnabled এবং depthCompare অ্যাট্রিবিউটগুলি আর সবসময় প্রয়োজন হয় না: depthWriteEnabled শুধুমাত্র depth সহ ফর্ম্যাটের জন্য প্রয়োজন, এবং depthCompare যদি একেবারেই ব্যবহার না করা হয় তবে depth সহ ফর্ম্যাটের জন্য প্রয়োজন হয় না। দেখুন dawn:2132

অ্যাডাপ্টারের তথ্য আপডেট

ব্যবহারকারী যখন chrome://flags/#enable-webgpu-developer-features এ "WebGPU Developer Features" ফ্ল্যাগ সক্রিয় করে তখন requestAdapterInfo() কল করার সময় নন-স্ট্যান্ডার্ড type এবং backend অ্যাডাপ্টার তথ্য বৈশিষ্ট্যগুলি উপলব্ধ হয়। type "discrete GPU", "integrated GPU", "CPU", অথবা "unknown" হতে পারে। backend হয় "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES", অথবা "null"। ইস্যু dawn:2112 এবং ইস্যু dawn:2107 দেখুন।

https://webgpureport.org এর স্ক্রিনশট যেখানে ব্যাকএন্ড রয়েছে এবং অ্যাডাপ্টারের তথ্য টাইপ করুন।
অ্যাডাপ্টারের তথ্য ব্যাকএন্ড এবং টাইপ https://webgpureport.org এ দেখানো হয়েছে।

requestAdapterInfo() থেকে ঐচ্ছিক unmaskHints তালিকা প্যারামিটারটি সরানো হয়েছে। সমস্যাটি দেখুন dawn:1427

টাইমস্ট্যাম্প কোয়েরি কোয়ান্টাইজেশন

টাইমস্ট্যাম্প কোয়েরি অ্যাপ্লিকেশনগুলিকে ন্যানোসেকেন্ড নির্ভুলতার সাথে GPU কমান্ডের কার্যকর সময় পরিমাপ করার অনুমতি দেয়। তবে, WebGPU স্পেসিফিকেশন টাইমিং আক্রমণের উদ্বেগের কারণে টাইমস্ট্যাম্প কোয়েরিগুলিকে ঐচ্ছিক করে তোলে। Chrome টিম বিশ্বাস করে যে টাইমস্ট্যাম্প কোয়েরিগুলির কোয়ান্টাইজিং রেজোলিউশন 100 মাইক্রোসেকেন্ডে কমিয়ে নির্ভুলতা এবং সুরক্ষার মধ্যে একটি ভাল আপস প্রদান করে। দেখুন সমস্যা dawn:1800

Chrome-এ, ব্যবহারকারীরা chrome://flags/#enable-webgpu-developer-features "WebGPU Developer Features" ফ্ল্যাগ সক্রিয় করে টাইমস্ট্যাম্প কোয়ান্টাইজেশন অক্ষম করতে পারেন। মনে রাখবেন যে শুধুমাত্র এই ফ্ল্যাগটি "timestamp-query" বৈশিষ্ট্যটি সক্ষম করে না। এর বাস্তবায়ন এখনও পরীক্ষামূলক এবং তাই chrome://flags/#enable-unsafe-webgpu "Unsafe WebGPU Support" ফ্ল্যাগ প্রয়োজন।

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

wgpu::DawnTogglesDescriptor deviceTogglesDesc = {};

const char* allowUnsafeApisToggle = "allow_unsafe_apis";
deviceTogglesDesc.enabledToggles = &allowUnsafeApisToggle;
deviceTogglesDesc.enabledToggleCount = 1;

const char* timestampQuantizationToggle = "timestamp_quantization";
deviceTogglesDesc.disabledToggles = &timestampQuantizationToggle;
deviceTogglesDesc.disabledToggleCount = 1;

wgpu::DeviceDescriptor desc = {.nextInChain = &deviceTogglesDesc};

// Request a device with no timestamp quantization.
myAdapter.RequestDevice(&desc, myCallback, myUserData);

বসন্ত-পরিষ্কারের বৈশিষ্ট্য

পরীক্ষামূলক "timestamp-query-inside-passes" বৈশিষ্ট্যটির নাম পরিবর্তন করে "chromium-experimental-timestamp-query-inside-passes" করা হয়েছে যাতে ডেভেলপারদের কাছে স্পষ্ট হয়ে যায় যে এই বৈশিষ্ট্যটি পরীক্ষামূলক এবং আপাতত শুধুমাত্র Chromium-ভিত্তিক ব্রাউজারগুলিতে উপলব্ধ। দেখুন dawn:1193

পরীক্ষামূলক "পাইপলাইন-পরিসংখ্যান-কোয়েরি" বৈশিষ্ট্যটি, যা কেবল আংশিকভাবে বাস্তবায়িত হয়েছিল, তা সরানো হয়েছে কারণ এটি আর তৈরি করা হচ্ছে না। সমস্যাটি দেখুন chromium:1177506

এখানে শুধুমাত্র কিছু গুরুত্বপূর্ণ বিষয় অন্তর্ভুক্ত করা হয়েছে। কমিটের সম্পূর্ণ তালিকাটি দেখুন।

WebGPU-তে নতুন কী আছে

" What's New in WebGPU" সিরিজে যা যা আলোচনা করা হয়েছে তার একটি তালিকা।

ক্রোম ১৪২

ক্রোম ১৪১

ক্রোম ১৪০

ক্রোম ১৩৯

ক্রোম ১৩৮

ক্রোম ১৩৭

ক্রোম ১৩৬

ক্রোম ১৩৫

ক্রোম ১৩৪

ক্রোম ১৩৩

ক্রোম ১৩২

ক্রোম ১৩১

ক্রোম ১৩০

ক্রোম ১২৯

ক্রোম ১২৮

ক্রোম ১২৭

ক্রোম ১২৬

ক্রোম ১২৫

ক্রোম ১২৪

ক্রোম ১২৩

ক্রোম ১২২

ক্রোম ১২১

ক্রোম ১২০

ক্রোম ১১৯

ক্রোম ১১৮

ক্রোম ১১৭

ক্রোম ১১৬

ক্রোম ১১৫

ক্রোম ১১৪

ক্রোম ১১৩