LiteRT לאתרים עם LiteRT.js

‫LiteRT.js הוא זמן ריצה של WebAI מבית Google עם ביצועים גבוהים, שמיועד לאפליקציות אינטרנט לייצור. הוא מהווה המשך של חבילת LiteRT, ומבטיח תמיכה במסגרות מרובות ואיחוד של זמן הריצה הבסיסי שלנו בכל הפלטפורמות.

‫LiteRT.js תומך בתכונות הליבה הבאות:

  1. תמיכה בדפדפן במודלים של LiteRT: הפעלת מודלים עם הביצועים הכי טובים בכיתה במעבד, עם האצה באמצעות XNNPack ב-WebAssembly‏ (Wasm) ובמעבד גרפי באמצעות WebGPU API.
  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;

// 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 converter.

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. מתקינים את חבילות ה-NPM‏ @litertjs/core ו-@litertjs/tfjs-interop.
  3. מייבאים את הקצה העורפי של TensorFlow.js WebGPU ומשתמשים בו. הדרישה הזו נחוצה כדי ש-LiteRT.js יפעל עם TensorFlow.js.
  4. מחליפים את טעינת המודל של TensorFlow.js בטעינת המודל של LiteRT.js.
  5. מחליפים את TensorFlow.js model.predict(inputs) או את model.execute(inputs) ב-runWithTfjsTensors(liteRtModel, inputs). ‫runWithTfjsTensors מקבל את אותם טנסורים של קלט שמשמשים במודלים של TensorFlow.js ומחזיר טנסורים של TensorFlow.js.
  6. בודקים שצינור המודל מוציא את התוצאות שאתם מצפים להן.

יכול להיות שיהיה צורך לבצע גם את השינויים הבאים בקלט של המודל כדי להשתמש ב-LiteRT.js עם runWithTfjsTensors:

  1. שינוי הסדר של נתוני הקלט: יכול להיות שתצטרכו לשנות את הסדר של נתוני הקלט כשמעבירים אותם, בהתאם לסדר שבו הכלי להמרת מודלים הציב את נתוני הקלט והפלט של המודל.
  2. החלפת קלט: יכול להיות גם שהממיר שינה את הפריסה של הקלט והפלט של המודל בהשוואה למה שמשמש את TensorFlow.js. יכול להיות שתצטרכו להפוך את הקלט כדי להתאים למודל, ואת הפלט כדי להתאים לשאר צינור הנתונים.
  3. שינוי השם של קלט: אם אתם משתמשים בקלט עם שם, יכול להיות שהשמות השתנו גם כן.

אפשר לקבל מידע נוסף על הקלט והפלט של המודל באמצעות model.getInputDetails() ו-model.getOutputDetails().