LiteRT برای وب با LiteRT.js

LiteRT.js یک محیط اجرایی WebAI با عملکرد بالا از گوگل است که برنامه‌های وب تولیدی را هدف قرار می‌دهد. این محیط، ادامه‌ی پشته‌ی LiteRT است و پشتیبانی از چند فریم‌ورک را تضمین می‌کند و محیط اجرایی اصلی ما را در تمام پلتفرم‌ها یکپارچه می‌سازد.

LiteRT.js از ویژگی‌های اصلی زیر پشتیبانی می‌کند:

  1. استنتاج شتاب‌یافته توسط سخت‌افزار در مرورگر : مدل‌هایی را با عملکرد استثنایی CPU اجرا کنید که توسط XNNPack شتاب‌دهی شده و به WebAssembly سبک (Wasm) نگاشت شده‌اند. برای GPU و مقیاس‌بندی سخت‌افزار اختصاصی (مانند NPUها)، LiteRT.js به صورت بومی هم API WebGPU و هم API نوظهور WebNN را پوشش می‌دهد و بهینه‌سازی دقیق و مختص پلتفرم را امکان‌پذیر می‌سازد.
  2. سازگاری با چند فریم‌ورک : با کامپایل کردن از فریم‌ورک یادگیری ماشین دلخواه خود به صورت بومی: PyTorch، JAX یا TensorFlow، مفاهیم توسعه را ساده کنید.
  3. تکرار روی خطوط لوله موجود : ادغام آماده با معماری‌های موجود TensorFlow.js با تجزیه تنسورهای TensorFlow.js که به صورت بومی پشتیبانی می‌شوند به عنوان ورودی‌ها و خروجی‌های مرزی مستقیم.

نصب

پکیج @litertjs/core را از npm نصب کنید:

npm install @litertjs/core

فایل‌های Wasm در node_modules/@litertjs/core/wasm/ قرار دارند. برای راحتی، کل پوشه wasm/ را کپی و اجرا کنید. سپس، بسته را وارد کرده و فایل‌های 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 از همان فرمت .tflite مانند بقیه اکوسیستم LiteRT استفاده می‌کند و از مدل‌های موجود در Kaggle و Huggingface پشتیبانی می‌کند. اگر مدل PyTorch جدیدی دارید، باید آن را تبدیل کنید.

یک مدل PyTorch را به LiteRT تبدیل کنید

برای تبدیل یک مدل PyTorch به LiteRT، از مبدل litert-torch استفاده کنید.

import litert_torch

# Load your torch model. We're using resnet for this example.
resnet18 = torchvision.models.resnet18(torchvision.models.ResNet18_Weights.IMAGENET1K_V1)

sample_inputs = (torch.randn(1, 3, 224, 224),)

# Convert the model to LiteRT.
edge_model = litert_torch.convert(resnet18.eval(), sample_inputs)

# Export the model.
edge_model.export('resnet.tflite')

اجرای مدل تبدیل‌شده

پس از تبدیل مدل به فایل .tflite ، می‌توانید آن را در مرورگر اجرا کنید.

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

// Load the model hosted from your server. This makes an http(s) request.
const model = await loadAndCompile('/path/to/model.tflite', {
    accelerator: 'webgpu',
    // Can select from 'webnn', 'webgpu', & 'wasm'.
    // Additionally, you can pass an array of accelerators e.g. ['webnn', 'wasm']
    // if you would like to fallback to CPU execution,
    // Note that ONLY cpu fallback is supported for now
    // (i.e. specifying ['webnn', 'webgpu']) will lead to compilation errors
});
// The model can also be loaded from a Uint8Array if you want to fetch it yourself.

// Create image input data
const image = new Float32Array(224 * 224 * 3).fill(0);
const inputTensor = new Tensor(image, /* shape */ [1, 3, 224, 224]);

// Run the model
const outputs = await model.run(inputTensor);
// You can also use `await model.run([inputTensor]);`
// or `await model.run({'input_tensor_name': inputTensor});`

// Clean up and get outputs
inputTensor.delete();
const output = outputs[0];
const outputData = await output.data();
output.delete();

ادغام در خطوط لوله TensorFlow.js موجود

به دلایل زیر باید ادغام LiteRT.js را در خطوط لوله TensorFlow.js خود در نظر بگیرید:

  1. عملکرد استثنایی پردازنده گرافیکی و سخت‌افزار : مدل‌های LiteRT.js از شتاب‌دهی WebGPU برای عملکرد بهینه در معماری‌های مرورگر بهره می‌برند. LiteRT.js با پشتیبانی از WebGPU و WebNN که به زودی عرضه می‌شود، شتاب‌دهی سخت‌افزاری انعطاف‌پذیری را در انواع دستگاه‌های لبه ارائه می‌دهد.
  2. مسیر تبدیل مدل آسان‌تر : مسیر تبدیل LiteRT.js مستقیماً از PyTorch به LiteRT می‌رود. مسیر تبدیل PyTorch به TensorFlow.js به طور قابل توجهی پیچیده‌تر است و شما را ملزم می‌کند که از PyTorch -> ONNX -> TensorFlow -> TensorFlow.js بروید.
  3. ابزارهای اشکال‌زدایی : مسیر تبدیل LiteRT.js با ابزارهای اشکال‌زدایی ارائه می‌شود.

LiteRT.js برای عملکرد در داخل خطوط لوله TensorFlow.js طراحی شده است و با پیش‌پردازش و پس‌پردازش TensorFlow.js سازگار است، بنابراین تنها چیزی که برای مهاجرت نیاز دارید، خود مدل است.

LiteRT.js را با مراحل زیر در خطوط لوله TensorFlow.js ادغام کنید:

  1. مدل اصلی TensorFlow، JAX یا PyTorch خود را به .tflite تبدیل کنید. برای جزئیات بیشتر، به بخش تبدیل مدل مراجعه کنید.
  2. بسته‌های NPM @litertjs/core ‎ و @litertjs/tfjs-interop ‎ را نصب کنید.
  3. بک‌اند WebGPU مربوط به TensorFlow.js را وارد و استفاده کنید. این مورد برای تعامل LiteRT.js با TensorFlow.js ضروری است.
  4. بارگذاری مدل TensorFlow.js را با بارگذاری مدل LiteRT.js جایگزین کنید.
  5. model.predict (inputs) یا model.execute (inputs) در TensorFlow.js را با runWithTfjsTensors (liteRtModel, inputs) جایگزین کنید. runWithTfjsTensors همان تنسورهای ورودی را که مدل‌های TensorFlow.js استفاده می‌کنند، دریافت کرده و تنسورهای TensorFlow.js را در خروجی نمایش می‌دهد.
  6. آزمایش کنید که آیا خط لوله مدل، نتایج مورد انتظار شما را ارائه می‌دهد یا خیر.

استفاده از LiteRT.js به همراه runWithTfjsTensors ممکن است نیاز به تغییرات زیر در ورودی‌های مدل نیز داشته باشد:

  1. تغییر ترتیب ورودی‌ها : بسته به اینکه مبدل چگونه ورودی‌ها و خروجی‌های مدل را مرتب کرده است، ممکن است لازم باشد هنگام ارسال آنها، ترتیب آنها را تغییر دهید.
  2. جابجایی ورودی‌ها : همچنین ممکن است مبدل، طرح‌بندی ورودی‌ها و خروجی‌های مدل را در مقایسه با آنچه TensorFlow.js استفاده می‌کند، تغییر داده باشد. ممکن است لازم باشد ورودی‌های خود را برای مطابقت با مدل و خروجی‌ها را برای مطابقت با بقیه خط لوله، جابجایی کنید .
  3. تغییر نام ورودی‌ها : اگر از ورودی‌های نامگذاری‌شده استفاده می‌کنید، ممکن است نام‌ها نیز تغییر کرده باشند.

شما می‌توانید با استفاده از model.getInputDetails() و model.getOutputDetails() اطلاعات بیشتری در مورد ورودی‌ها و خروجی‌های مدل به دست آورید.