LiteRT.js দিয়ে শুরু করুন

এটি একটি এন্ড-টু-এন্ড LiteRT.js নির্দেশিকা যা WebGPU ত্বরণের মাধ্যমে ব্রাউজারে চালানোর জন্য PyTorch মডেলকে রূপান্তর করার প্রক্রিয়াটি কভার করে। এই উদাহরণে ভিশন মডেলের জন্য ResNet18 এবং প্রি- এবং পোস্ট-প্রসেসিংয়ের জন্য TensorFlow.js ব্যবহার করা হয়েছে।

নির্দেশিকাটিতে নিম্নলিখিত ধাপগুলি অন্তর্ভুক্ত থাকবে:

  1. AI Edge Torch ব্যবহার করে আপনার PyTorch মডেলটিকে LiterRT তে রূপান্তর করুন। 1. আপনার ওয়েব অ্যাপে LiterRT প্যাকেজটি যোগ করুন।
  2. মডেলটি লোড করুন।
  3. প্রি- এবং পোস্ট-প্রসেসিং লজিক লিখ।

LiterRT তে রূপান্তর করুন

PyTorch মডেলটিকে উপযুক্ত .tflite ফর্ম্যাটে রূপান্তর করতে PyTorch কনভার্টার নোটবুক ব্যবহার করুন। আপনি কী ধরণের ত্রুটির সম্মুখীন হতে পারেন এবং কীভাবে সেগুলি ঠিক করবেন সে সম্পর্কে বিস্তারিত নির্দেশিকা পেতে, AI Edge Torch Converter README দেখুন।

আপনার মডেলটি অবশ্যই torch.export.export এর সাথে সামঞ্জস্যপূর্ণ হতে হবে, যার অর্থ এটি TorchDynamo এর সাথে রপ্তানিযোগ্য হতে হবে। অতএব, এতে এমন কোনও পাইথন কন্ডিশনাল ব্রাঞ্চ থাকা উচিত নয় যা টেনসরের মধ্যে রানটাইম মানের উপর নির্ভর করে। যদি আপনি torch.export.export এর সময় নিম্নলিখিত ত্রুটিগুলি দেখতে পান, তাহলে আপনার মডেলটি torch.export.export এর সাথে রপ্তানিযোগ্য নয়। আপনার মডেলের টেনসরগুলিতে কোনও গতিশীল ইনপুট বা আউটপুট মাত্রা থাকা উচিত নয়। এর মধ্যে ব্যাচ মাত্রা অন্তর্ভুক্ত।

আপনি একটি TensorRT-সামঞ্জস্যপূর্ণ বা ONNX-রপ্তানিযোগ্য PyTorch মডেল দিয়েও শুরু করতে পারেন:

  • একটি মডেলের একটি TensorRT-সামঞ্জস্যপূর্ণ সংস্করণ একটি ভালো সূচনা বিন্দু হতে পারে, কারণ কিছু ধরণের TensorRT রূপান্তরের জন্য মডেলগুলিকে TorchDynamo রপ্তানিযোগ্য হতে হবে। আপনি যদি মডেলটিতে কোনও NVIDIA / CUDA অপশন ব্যবহার করেন, তাহলে আপনাকে সেগুলিকে স্ট্যান্ডার্ড PyTorch অপশন দিয়ে প্রতিস্থাপন করতে হবে।

  • একটি ONNX-রপ্তানিযোগ্য PyTorch মডেল একটি ভালো সূচনা বিন্দু হতে পারে, যদিও কিছু ONNX মডেল রপ্তানির জন্য TorchDynamo-এর পরিবর্তে TorchScript ব্যবহার করে, এই ক্ষেত্রে মডেলটি TorchDynamo-রপ্তানিযোগ্য নাও হতে পারে (যদিও এটি সম্ভবত মূল মডেল কোডের চেয়ে কাছাকাছি)।

আরও তথ্যের জন্য, PyTorch মডেলগুলিকে LiterRT তে রূপান্তর করুন দেখুন।

LiterRT প্যাকেজ যোগ করুন

npm থেকে @litertjs/core প্যাকেজটি ইনস্টল করুন:

npm install @litertjs/core

প্যাকেজটি আমদানি করুন এবং এর Wasm ফাইলগুলি লোড করুন:

import {loadLiteRt} from '@litertjs/core';

// Load the LiteRT.js Wasm files from a CDN.
await loadLiteRt('https://cdn.jsdelivr.net/npm/@litertjs/core/wasm/')
// Alternatively, host them from your server.
// They are located in node_modules/@litertjs/core/wasm/
await loadLiteRt(`your/path/to/wasm/`);

মডেলটি লোড করুন

LiteRT.js এবং LiteRT-TFJS রূপান্তর ইউটিলিটিগুলি আমদানি এবং আরম্ভ করুন। LiteRT.js-এ টেনসর পাস করার জন্য আপনাকে TensorFlow.jsও আমদানি করতে হবে।

import {CompileOptions, loadAndCompile, loadLiteRt, getWebGpuDevice} from '@litertjs/core';
import {runWithTfjsTensors} from '@litertjs/tfjs-interop';

// TensorFlow.js imports
import * as tf from '@tensorflow/tfjs';
import '@tensorflow/tfjs-backend-webgpu';
import {WebGPUBackend} from '@tensorflow/tfjs-backend-webgpu';

async function main() {
  // Initialize TensorFlow.js WebGPU backend
  await tf.setBackend('webgpu');

  // Initialize LiteRT.js's Wasm files
  await loadLiteRt('your/path/to/wasm/');

  // Make TFJS use the same GPU device as LiteRT.js (for tensor conversion)
  const device = await getWebGpuDevice();
  tf.removeBackend('webgpu');
  tf.registerBackend('webgpu', () => new WebGPUBackend(device, device.adapterInfo));
  await tf.setBackend('webgpu');
  // ...
}

main();

রূপান্তরিত LiterRT মডেলটি লোড করুন:

const model = await loadAndCompile('path_to_model.tflite', {
  accelerator: 'webgpu', // or 'wasm'
});

মডেল পাইপলাইনটি লিখ।

আপনার অ্যাপের সাথে মডেলটি সংযুক্ত করে এমন প্রি- এবং পোস্ট-প্রসেসিং লজিক লিখুন। প্রি- এবং পোস্ট-প্রসেসিংয়ের জন্য TensorFlow.js ব্যবহার করা বাঞ্ছনীয়, তবে যদি এটি TensorFlow.js-এ লেখা না থাকে, তাহলে আপনি ArrayBuffer হিসেবে মান পেতে await tensor.data কল করতে পারেন অথবা একটি স্ট্রাকচার্ড JS অ্যারে পেতে await tensor.array কল করতে পারেন।

ResNet18 এর জন্য এন্ড-টু-এন্ড পাইপলাইনের একটি উদাহরণ নিচে দেওয়া হল:

// Wrap in a tf.tidy call to automatically clean up intermediate TensorFlow.js tensors.
// (Note: tidy only supports synchronous functions).
const imageData = tf.tidy(() => {
  // Get RGB data values from an image element and convert it to range [0, 1).
  const image = tf.browser.fromPixels(dogs, 3).div(255);

  // These preprocessing steps come from https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py#L315
  // The mean and standard deviation for the image normalization come from https://github.com/pytorch/vision/blob/main/torchvision/transforms/_presets.py#L38
  return image.resizeBilinear([224, 224])
    .sub([0.485, 0.456, 0.406])
    .div([0.229, 0.224, 0.225])
    .reshape([1, 224, 224, 3])
    .transpose([0, 3, 1, 2]);
});

// Run the model
const outputs = await runWithTfjsTensors(model, [imageData]);
const probabilities = outputs[0];

// Get the top five classes.
const top5 = tf.topk(probabilities, 5);

const values = await top5.values.data();
const indices = await top5.indices.data();

// Clean up TFJS tensors
tf.dispose(outputs);
tf.dispose(top5);
tf.dispose(imageData);

// Print the top five classes.
const classes = ... // Class names are loaded from a JSON file in the demo.
for (let i = 0; i < 5; ++i) {
  const text = `${classes[indices[i]]}: ${values[i]}`;
  console.log(text);
}

পরীক্ষা এবং সমস্যা সমাধান

আপনার আবেদন পরীক্ষা করার এবং ত্রুটিগুলি পরিচালনা করার উপায় সম্পর্কে নিম্নলিখিত বিভাগগুলি পড়ুন।

জাল ইনপুট দিয়ে পরীক্ষা করা হচ্ছে

একটি মডেল লোড করার পর, প্রথমে নকল ইনপুট দিয়ে মডেলটি পরীক্ষা করা ভালো। এটি আপনার মডেল পাইপলাইনের জন্য প্রি এবং পোস্ট প্রসেসিং লজিক লেখার সময় ব্যয় করার আগে যেকোনো রানটাইম ত্রুটি ধরা পড়বে। এটি পরীক্ষা করার জন্য, আপনি LiteRT.js মডেল টেস্টার ব্যবহার করতে পারেন অথবা ম্যানুয়ালি পরীক্ষা করতে পারেন।

Litert.js মডেল পরীক্ষক

LiteRT.js মডেল পরীক্ষক আপনার মডেলটি GPU এবং CPU-তে র‍্যান্ডম ইনপুট ব্যবহার করে চালায় যাতে যাচাই করা যায় যে মডেলটি GPU-তে সঠিকভাবে চলছে। এটি নিম্নলিখিতগুলি পরীক্ষা করে:

  • ইনপুট এবং আউটপুট ডেটা টাইপগুলি সমর্থিত কিনা।
  • GPU তে সকল অপারেশন উপলব্ধ কিনা।
  • GPU আউটপুটগুলি রেফারেন্স CPU আউটপুটগুলির সাথে কতটা ঘনিষ্ঠভাবে মেলে।
  • GPU অনুমানের কর্মক্ষমতা।

LiteRT.js মডেল টেস্টার চালানোর জন্য, npm i @litertjs/model-tester এবং তারপর npx model-tester চালান। এটি আপনার মডেল চালানোর জন্য একটি ব্রাউজার ট্যাব খুলবে।

ম্যানুয়াল মডেল পরীক্ষা

যদি আপনি LiteRT.js মডেল টেস্টার ( @litertjs/model-tester ) ব্যবহার করার পরিবর্তে মডেলটি ম্যানুয়ালি পরীক্ষা করতে পছন্দ করেন, তাহলে আপনি নকল ইনপুট তৈরি করতে পারেন এবং runWithTfjsTensors দিয়ে মডেলটি চালাতে পারেন।

নকল ইনপুট তৈরি করতে, আপনাকে ইনপুট টেনসরের নাম এবং আকার জানতে হবে। LiteRT.js-এ model.getInputDetails অথবা model.getOutputDetails কল করে এগুলি পাওয়া যাবে। বিকল্পভাবে, Model Explorer ব্যবহার করুন।

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

// Imports, initialization, and model loading...
// Create fake inputs for the model
const fakeInputs = model.getInputDetails().map(
    ({shape, dtype}) => tf.ones(shape, dtype));

// Run the model
const outputs = await runWithTfjsTensors(model, fakeInputs);
console.log(outputs);

ত্রুটির ধরণ

কিছু LiterRT মডেল LiteRT.js দ্বারা সমর্থিত নাও হতে পারে। ত্রুটিগুলি সাধারণত এই বিভাগগুলিতে পড়ে:

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

অপারেশন সমর্থিত নয়

এর অর্থ হল যে ব্যবহৃত ব্যাকএন্ডটি মডেলের কোনও একটি অপারেশনকে সমর্থন করে না। এই অপারেশন এড়াতে আপনাকে মূল PyTorch মডেলটি পুনর্লিখন করতে হবে এবং এটি পুনরায় রূপান্তর করতে হবে, অথবা আপনি CPU তে মডেলটি চালাতে সক্ষম হতে পারেন।

BROADCAST_TO এর ক্ষেত্রে, মডেলের প্রতিটি ইনপুট টেনসরের জন্য ব্যাচ ডাইমেনশন একই করে এটি সমাধান করা যেতে পারে। অন্যান্য ক্ষেত্রে আরও জটিল হতে পারে।

অসমর্থিত টেনসর প্রকার

LiteRT.js মডেলের ইনপুট এবং আউটপুটের জন্য শুধুমাত্র int32 এবং float32 টেনসর সমর্থন করে।

মডেল খুব বড়

এটি সাধারণত Aborted() এ কল বা মডেল-লোডিং সময় মেমরি বরাদ্দ ব্যর্থতার মতো দেখায়। LiteRT.js এর লোড হতে পারে এমন মডেলের আকার সীমিত, তাই আপনি যদি এটি দেখতে পান তবে আপনার মডেলটি খুব বড় হতে পারে। আপনি ai-edge-quantizer দিয়ে ওজন পরিমাপ করার চেষ্টা করতে পারেন, তবে গণনা float32 বা float16 এ রাখুন, এবং মডেল ইনপুট এবং আউটপুট float32 বা int32 হিসাবে রাখুন।