এটি একটি এন্ড-টু-এন্ড LiteRT.js গাইড যা ওয়েবজিপিইউ ত্বরণ সহ ব্রাউজারে চালানোর জন্য একটি PyTorch মডেলকে রূপান্তর করার প্রক্রিয়াকে কভার করে। এই উদাহরণটি ভিশন মডেলের জন্য ResNet18 এবং প্রি- এবং পোস্ট-প্রসেসিংয়ের জন্য TensorFlow.js ব্যবহার করে।
গাইড নিম্নলিখিত পদক্ষেপগুলি কভার করবে:
- AI এজ টর্চ ব্যবহার করে আপনার PyTorch মডেলটিকে LiteRT এ রূপান্তর করুন।
- আপনার ওয়েব অ্যাপে LiteRT প্যাকেজ যোগ করুন।
- মডেল লোড করুন।
- প্রি- এবং পোস্ট-প্রসেসিং লজিক লিখুন।
LiteRT তে রূপান্তর করুন
একটি PyTorch মডেলকে উপযুক্ত .tflite
ফরম্যাটে রূপান্তর করতে PyTorch Converter নোটবুকটি ব্যবহার করুন৷ আপনি যে ধরণের ত্রুটির সম্মুখীন হতে পারেন এবং কীভাবে সেগুলি ঠিক করবেন সে সম্পর্কে গভীরভাবে নির্দেশিকা পেতে, এআই এজ টর্চ কনভার্টার README দেখুন।
আপনার মডেলটি অবশ্যই torch.export.export
এর সাথে সামঞ্জস্যপূর্ণ হতে হবে, যার মানে এটি অবশ্যই TorchDynamo এর সাথে রপ্তানিযোগ্য হতে হবে৷ অতএব, এটিতে টেনসরের মধ্যে রানটাইম মানগুলির উপর নির্ভর করে এমন কোনও পাইথন শর্তাধীন শাখা থাকতে হবে না। আপনি যদি torch.export.export
এর সময় নিম্নলিখিত ত্রুটিগুলি দেখতে পান, তাহলে আপনার মডেল torch.export.export
এর সাথে রপ্তানিযোগ্য নয়৷ আপনার মডেলের টেনসরগুলিতে কোনও গতিশীল ইনপুট বা আউটপুট মাত্রা থাকতে হবে না। এই ব্যাচ মাত্রা অন্তর্ভুক্ত.
আপনি একটি TensorRT-সামঞ্জস্যপূর্ণ বা ONNX-রপ্তানিযোগ্য PyTorch মডেল দিয়েও শুরু করতে পারেন:
একটি মডেলের একটি TensorRT-সামঞ্জস্যপূর্ণ সংস্করণ একটি ভাল সূচনা বিন্দু হতে পারে, যেহেতু কিছু ধরণের TensorRT রূপান্তরের জন্য মডেলগুলিকে TorchDynamo রপ্তানিযোগ্য হতে হবে। আপনি যদি মডেলে কোনো NVIDIA/CUDA অপ্স ব্যবহার করেন, তাহলে আপনাকে সেগুলিকে স্ট্যান্ডার্ড PyTorch ops দিয়ে প্রতিস্থাপন করতে হবে।
একটি ONNX-রপ্তানিযোগ্য PyTorch মডেল একটি ভাল সূচনা পয়েন্ট হতে পারে, যদিও কিছু ONNX মডেল রপ্তানি করতে TorchDynamo-এর পরিবর্তে TorchScript ব্যবহার করে, সেক্ষেত্রে মডেলটি TorchDynamo-রপ্তানিযোগ্য নাও হতে পারে (যদিও এটি সম্ভবত মূল মডেল কোডের চেয়ে কাছাকাছি)।
আরও তথ্যের জন্য, PyTorch মডেলগুলিকে LiteRT তে রূপান্তর করুন দেখুন।
LiteRT প্যাকেজ যোগ করুন
npm থেকে @litertjs/core
প্যাকেজ ইনস্টল করুন:
npm install @litertjs/core
প্যাকেজটি আমদানি করুন এবং এর Wasm ফাইলগুলি লোড করুন:
import {loadLiteRt} from '@litertjs/core';
// They are located in node_modules/@litertjs/core/wasm/
// Serve them statically on your server.
await loadLiteRt(`your/path/to/wasm/`);
মডেল লোড করুন
LiteRT.js এবং LiteRT-TFJS রূপান্তর ইউটিলিটিগুলি আমদানি এবং শুরু করুন৷ LiteRT.js-এ টেনসর পাস করতে আপনাকে TensorFlow.js আমদানি করতে হবে।
import {CompileOptions, loadAndCompile, loadLiteRt, setWebGpuDevice} from '@litertjs/core';
import {runWithTfjsTensors} from '@litertjs/tfjs-interop';
// TensorFlow.js imports
import * as tf from '@tensorflow/tfjs';
import '@tensorflow/tfjs-backend-webgpu'; // Only WebGPU is supported
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 LiteRt use the same GPU device as TFJS (for tensor conversion)
const backend = tf.backend() as WebGPUBackend;
setWebGpuDevice(backend.device);
// ...
}
main();
রূপান্তরিত LiteRT মডেল লোড করুন:
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 top5 = 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
const imageData = 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]);
// You can pass inputs as a single tensor, an array, or a JS Object
// where keys are the tensor names in the TFLite model.
// When passing an Object, the output is also an Object.
// Here, we're passing a single tensor, so the output is an array.
const probabilities = runWithTfjsTensors(model, imageData)[0];
// Get the top five classes.
return tf.topk(probabilities, 5);
});
const values = await top5.values.data();
const indices = await top5.indices.data();
top5.values.dispose(); // Clean up the tfjs tensors.
top5.indices.dispose();
// 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
দিয়ে মডেলটি চালাতে পারেন।
জাল ইনপুট তৈরি করতে, আপনাকে ইনপুট টেনসরগুলির নাম এবং আকারগুলি জানতে হবে। model.getInputDetails
getInputDetails বা model.getOutputDetails
কল করে LiteRT.js এর সাথে এগুলি পাওয়া যাবে। তাদের খুঁজে বের করার একটি সহজ উপায় হল মডেল তৈরি হওয়ার পরে একটি ব্রেকপয়েন্ট সেট করা। বিকল্পভাবে, মডেল এক্সপ্লোরার ব্যবহার করুন।
একবার আপনি ইনপুট এবং আউটপুট আকার এবং নাম জানলে, আপনি একটি জাল ইনপুট দিয়ে মডেলটি পরীক্ষা করতে পারেন। এটি কিছুটা আত্মবিশ্বাস দেয় যে আপনি মেশিন লার্নিং পাইপলাইনের বাকি অংশ লেখার আগে মডেলটি চলবে। এটি পরীক্ষা করবে যে সমস্ত মডেল অপারেশন সমর্থিত। যেমন:
// 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 = runWithTfjsTensors(model, fakeInputs);
console.log(outputs);
ত্রুটির ধরন
কিছু LiteRT মডেল 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 হিসাবে রাখুন৷