‫LiteRT للمواقع الإلكترونية باستخدام LiteRT.js

‫LiteRT.js هي بيئة وقت التشغيل العالية الأداء من Google لتطبيقات WebAI، وهي تستهدف تطبيقات الويب المخصّصة للإنتاج. وهي استمرار لمجموعة LiteRT، ما يضمن توفير إمكانية استخدام أُطر متعددة وتوحيد وقت التشغيل الأساسي على جميع المنصات.

تتيح LiteRT.js الميزات الأساسية التالية:

  1. إتاحة نماذج LiteRT في المتصفّح: يمكنك تشغيل النماذج بأفضل أداء ممكن على وحدة المعالجة المركزية (CPU) مع تسريعها باستخدام XNNPack على WebAssembly (Wasm) ووحدة معالجة الرسومات (GPU) باستخدام واجهة برمجة التطبيقات WebGPU.
  2. التوافق مع أُطر عمل متعددة: استخدِم إطار عمل تعلُّم الآلة المفضّل لديك، مثل PyTorch أو Jax أو TensorFlow.
  3. الاستفادة من خطوط الإنتاج الحالية: يمكنك الدمج مع خطوط إنتاج TensorFlow.js الحالية من خلال إتاحة استخدام TensorFlow.js Tensors كمدخلات ومخرجات.

تثبيت

ثبِّت حزمة @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(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().