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

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

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

  1. پشتیبانی درون مرورگر برای مدل‌های LiteRT : مدل‌هایی را با بهترین عملکرد در کلاس روی CPU اجرا کنید که از طریق XNNPack در WebAssembly (Wasm) و GPU با استفاده از WebGPU API شتاب می‌گیرد.
  2. سازگاری چند فریم ورک : از چارچوب ML ترجیحی خود استفاده کنید: PyTorch، Jax یا TensorFlow.
  3. ساخت بر روی خطوط لوله موجود : با پشتیبانی از TensorFlow.js Tensor به عنوان ورودی و خروجی، با خطوط لوله TensorFlow.js موجود یکپارچه شوید.

نصب و راه اندازی

بسته @litertjs/core را از npm نصب کنید:

npm install @litertjs/core

فایل‌های Wasm در node_modules/@litertjs/core/wasm/ قرار دارند. برای راحتی، کل پوشه wasm/ را کپی و سرو کنید. سپس بسته را وارد کرده و فایل‌های Wasm را بارگذاری کنید:

import {loadLiteRt} from '@litertjs/core;

// Host LiteRT's Wasm files on your server.
await loadLiteRt(`your/path/to/wasm/`);

تبدیل مدل

LiteRT.js از همان قالب .tflite مانند Android و 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 =
    await new Tensor(image, /* shape */ [1, 3, 224, 224]).moveTo('webgpu');

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

// Clean up and get outputs
inputTensor.delete();
const outputTensorCpu = await outputs[0].moveTo('wasm');
const outputData = outputTensorCpu.toTypedArray();
outputTensorCpu.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. بسته های @litertjs/core و @litertjs/tfjs-interop NPM را نصب کنید.
  3. باطن TensorFlow.js WebGPU را وارد کرده و از آن استفاده کنید. این برای LiteRT.js برای تعامل با TensorFlow.js لازم است.
  4. بارگیری مدل TensorFlow.js را با بارگیری مدل LiteRT.js جایگزین کنید.
  5. TensorFlow.js model.predict (ورودی ها) یا model.execute (ورودی ها) را با runWithTfjsTensors (liteRtModel، ورودی ها) جایگزین کنید. runWithTfjsTensors همان تانسورهای ورودی را می گیرد که مدل های TensorFlow.js استفاده می کنند و تانسورهای TensorFlow.js را خروجی می کند.
  6. آزمایش کنید که خط لوله مدل نتایجی را که شما انتظار دارید به دست می آورد.

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

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

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