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

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

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

  1. الاستدلال السريع المستند إلى الأجهزة في المتصفّح: يمكنك تشغيل النماذج بأداء استثنائي لوحدة المعالجة المركزية (CPU) مع تسريعها باستخدام XNNPack المتوافق مع WebAssembly (Wasm) الخفيف الوزن. بالنسبة إلى وحدات معالجة الرسومات (GPU) وأجهزة تسريع الأداء المخصّصة (مثل وحدات معالجة الشبكات العصبية)، تتيح LiteRT.js بشكلٍ أصلي استخدام كلّ من واجهة برمجة التطبيقات WebGPU وواجهة برمجة التطبيقات 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 لتحقيق أداء محسّن على مستوى بنى المتصفحات. من خلال توفير التوافق مع WebGPU وWebNN القادمة، تتيح LiteRT.js تسريع الأجهزة بمرونة على مجموعة متنوعة من الأجهزة الطرفية.
  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().