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

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

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

  1. پشتیبانی درون مرورگری برای مدل‌های LiteRT : مدل‌هایی را با بهترین عملکرد در کلاس خود روی CPU، شتاب‌یافته توسط XNNPack روی WebAssembly (Wasm) و GPU با استفاده از WebGPU API اجرا کنید.
  2. سازگاری با چند فریم‌ورک : از فریم‌ورک یادگیری ماشین مورد نظر خود استفاده کنید: PyTorch، Jax یا TensorFlow.
  3. ساخت بر روی خطوط لوله موجود : با پشتیبانی از Tensorهای 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 اندروید و iOS استفاده می‌کند و از مدل‌های موجود در Kaggle و Huggingface پشتیبانی می‌کند. اگر مدل PyTorch جدیدی دارید، باید آن را تبدیل کنید.

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

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

import ai_edge_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 = ai_edge_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', // or 'wasm' for XNNPack CPU inference
});
// 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. بهترین عملکرد WebGPU در کلاس خود : مدل‌های تبدیل‌شده که روی LiteRT.js WebGPU اجرا می‌شوند، برای عملکرد مرورگر بهینه شده‌اند و به‌ویژه در مرورگرهای مبتنی بر Chromium سریع هستند.
  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() اطلاعات بیشتری در مورد ورودی‌ها و خروجی‌های مدل به دست آورید.