استخدام وحدات معالجة الموتّرات في Coral Edge لتشغيل نماذج TFlite في Node باستخدام TensorFlow.js

1. مقدمة

54e81d02971f53e8.png

تاريخ آخر تعديل: 11/04/2022

في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية تدريب نموذج لتصنيف الصور باستخدام "أداة تعليم الآلة" (Teachable Machine) وتنفيذه من خلال ميزة تسريع أجهزة Coral باستخدام TensorFlow.js، وهي مكتبة فعّالة ومرنة لتعلُّم الآلة بلغة JavaScript. أنت تنشئ تطبيق Electron يعرض الصور من كاميرا ويب ويصنفها باستخدام وحدة معالجة الموتّرات من Coral Edge. يتوفّر إصدار صالح بشكل كامل من هذا الدرس التطبيقي حول الترميز في مستودع sig-tfjs GitHub.

هل أحتاج إلى جهاز مرجاني؟

لا، يمكنك تجربة هذا الدرس التطبيقي حول الترميز بدون استخدام جهاز مرجاني، مع الحصول على أداء جيد على أجهزة الكمبيوتر المكتبي من خلال استخدام مسرِّع WebNN بدلاً من ذلك.

ما الذي ستنشئه

في هذا الدرس التطبيقي حول الترميز، يمكنك إنشاء تطبيق Electron الذي يصنِّف الصور. تطبيقك:

  • لتصنيف الصور من كاميرا الويب إلى الفئات المحددة في النموذج الذي تدربت عليه.
  • استخدام مسرِّعة للشعاب المرجانية لتحسين الأداء، في حال توفّره
  • يتم استخدام WebNN لرفع الأداء إذا كان متاحًا على نظامك الأساسي.

المعلومات التي ستطّلع عليها

  • كيفية تثبيت وإعداد حزمة NPM tfjs-tflite-node لتشغيل نماذج TFLite في Node.js
  • كيفية تثبيت مكتبة وقت تشغيل Edge TPU لتشغيل الطُرز على جهاز Coral.
  • كيفية تسريع استنتاج النموذج باستخدام وحدة معالجة الموتّرات ضِمن حافة الشعاب المرجانية
  • كيفية تسريع استنتاج النموذج باستخدام WebNN

يركّز هذا الدرس التطبيقي حول الترميز على TFLite في Node.js. يتم إخفاء المفاهيم غير ذات الصلة وكتل الرموز البرمجية، ويتم توفيرها لك لنسخها ولصقها ببساطة.

المتطلبات

لإكمال هذا الدرس التطبيقي حول الترميز، ستحتاج إلى ما يلي:

  • جهاز كمبيوتر مزوَّد بكاميرا ويب.
  • بالنسبة إلى تقنية Coral، ننصح باستخدام جهاز Raspberry Pi الذي يعمل بنظام Rspberry Pi OS (64 بت) مع سطح المكتب.
  • بالنسبة إلى WebNN، ننصح باستخدام جهاز Intel x86-64 يعمل بنظام التشغيل Ubuntu 20.04 أو Windows 10.
  • الإصدار Node.js >= 12.
  • الإلمام بJavaScript.
  • (يُنصح به) مسرِّع USB للشعاب المرجانية لتسريع النموذج.

2. الإعداد

الحصول على الرمز

لقد وضعنا كل التعليمات البرمجية التي تحتاجها لهذا المشروع في مستودع Git. للبدء، احصل على الرمز وافتحه في بيئة تطوير البرامج المفضّلة لديك. في هذا الدرس التطبيقي حول الترميز، ننصحك باستخدام جهاز Raspberry Pi الذي يعمل بنظام Rspberry Pi OS (64 بت) على أجهزة الكمبيوتر المكتبي. وهذا يسهِّل الربط بمسرِّعة للشعاب المرجانية.

إجراء ننصح به بشدة: استخدام Git لنسخ المستودع على جهاز Raspberry Pi

للحصول على الرمز، افتح نافذة طرفية جديدة وانسخ المستودع:

git clone https://github.com/tensorflow/sig-tfjs.git

جميع الملفات التي تحتاج إلى تعديلها في الدرس التطبيقي حول الترميز متوفّرة في دليل tfjs-tflite-node-codelab (ضمن sig-tfjs). وفي هذا الدليل، ستعثر على أدلة فرعية باسم starter_code وcpu_inference_working وcoral_inference_working وwebnn_inference_working. هذه نقاط مرجعية لخطوات هذا الدرس التطبيقي حول الترميز.

من بين الملفات الأخرى المتوفرة في المستودع حزم NPM التي يعتمد عليها tfjs-tflite-node-codelab. لن تحتاج إلى تعديل أي من هذه الملفات، ولكن عليك إجراء بعض اختباراتها للتأكّد من إعداد بيئتك بشكل صحيح.

تثبيت مكتبة وقت تشغيل Edge TPU

تتطلب أجهزة Coral تثبيت مكتبة وقت تشغيل Edge TPU قبل الاستخدام. ثبِّته باتّباع التعليمات الخاصة بالنظام الأساسي الذي تستخدمه.

على نظام التشغيل Linux أو Raspberry Pi

وفي نظام التشغيل Linux، تتوفّر المكتبة من اتفاقية شراء الطاقة لدى Google على شكل حزمة Debian وlibedgetpu1-std للبُنى الأساسية x86-64 و Armv8 (64 بت). إذا كان معالج البيانات يستخدم بنية مختلفة، ستحتاج إلى تجميعها من المصدر.

شغِّل هذا الأمر لإضافة Coral PPA من Google وتثبيت مكتبة Edge TPU Runtime.

# None of this is needed on Coral boards
# This repo is needed for almost all packages below
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
# This repo is needed for only python3-coral-cloudiot and python3-coral-enviro
echo "deb https://packages.cloud.google.com/apt coral-cloud-stable main" | sudo tee /etc/apt/sources.list.d/coral-cloud.list

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get update
sudo apt-get install libedgetpu1-std

على نظام التشغيل Windows أو أنظمة التشغيل الأخرى

تتوفر البرامج الثنائية التي تم تجميعها مسبقًا لإصدارات x86-64 من MacOS وWindows ويمكن تثبيتها عن طريق تشغيل البرنامج النصي install.sh أو install.bat في الأرشيف بعد تنزيله.

إعادة تشغيل الجهاز

بعد تثبيت Edge TPU Runtime، أعِد تشغيل الجهاز لتفعيل قاعدة Coral Udev الجديدة التي أضافها المثبِّت.

التأكّد من أنّه تم رصد جهاز Coral الخاص بك

للتأكّد من أنّه تم رصد جهاز Coral الخاص بك وأنّه يعمل، عليك إجراء اختبارات الدمج لحزمة coral-tflite-delegate. توجد هذه الحزمة في الدليل الجذر للمستودع. لإجراء اختبارات الدمج، أدخِل مسرِّعة Coal في تطبيقك وشغِّل هذه الأوامر في دليل الحزمة:

npx yarn
npx yarn build-deps
npx yarn test-integration

من المفترض أن تظهر لك نتيجة على النحو التالي:

yarn run v1.22.17
$ yarn build && yarn test-integration-dev
$ tsc
$ jasmine --config=jasmine-integration.json
Platform node has already been set. Overwriting the platform with node.
Randomized with seed 78904
Started

============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
WARNING: converting 'int32' to 'uint8'
.


1 spec, 0 failures
Finished in 2.777 seconds
Randomized with seed 78904 (jasmine --random=true --seed=78904)
Done in 6.36s.

لا داعي للقلق بشأن تثبيت @tensorflow/tfjs-node, كما هو مذكور في السجلّات، لأنّك ستستخدم النموذج بتنسيق TFLite.

إذا كانت النتيجة تحتوي على Encountered unresolved custom op: edgetpu-custom-op بدلاً من ذلك، هذا يعني أنّه لم يتم رصد جهاز Coral. تأكَّد من تثبيت مكتبة وقت تشغيل TPU على الحافة وتوصيل جهاز Coral بجهاز الكمبيوتر. يمكنك أيضًا اتباع دليل الخطوات الأولى لـ Coral لاختبار إصدار بايثون من روابط المرجان. إذا كان إصدار Python يعمل ولكن لم تنجح هذه الاختبارات، يُرجى إخبارنا من خلال تقديم تقرير خطأ.

تشغيل رمز إجراء التفعيل

وقد أصبحت الآن جاهزًا لتشغيل رمز إجراء التفعيل. اتّبِع الخطوات التالية للبدء.

  1. انتقِل إلى الدليل starter_code ضمن الدليل tfjs-tflite-node-codelab.
  2. تشغيل npm install لتثبيت الموارد التابعة.
  3. عليك تشغيل "npm start" لإطلاق المشروع. من المفترض أن يتم فتح تطبيق يعرض خلاصة فيديو من كاميرا الويب الخاصة بالكمبيوتر.

ما هي نقطة البداية؟

نقطة البداية هي تطبيق كاميرا Electron الأساسي المصمَّم لهذا الدرس التطبيقي حول الترميز. تم تبسيط الرمز البرمجي لعرض المفاهيم في الدرس التطبيقي حول الترميز، وهو لا يحتاج إلى معالجة أخطاء قليلة. إذا اخترت إعادة استخدام أيّ من الرموز البرمجية في تطبيق علني، احرص على معالجة أي أخطاء واختبِر كل الرموز بالكامل.

تطبيق إلكتروني أساسي مزوّد بخلاصة مباشرة لكاميرا الجهاز.

التعرّف على رمز إجراء التفعيل

هناك الكثير من الملفات في رمز التفعيل هذا، ولكن الملف الوحيد الذي يجب تعديله هو renderer.js. حيث تتحكم هذه الأداة في ما يظهر على الصفحة، بما في ذلك خلاصة الفيديو وعناصر HTML، وهي المكان الذي تضيف فيه نموذج تعلم الآلة إلى التطبيق. يتوفر ملف index.html ضمن الملفات الأخرى، ولكن كل ما يفعله هو تحميل ملف renderer.js. هناك أيضًا ملف main.js، وهو نقطة الدخول إلى Electron. فهي تتحكّم في دورة حياة التطبيق، بما في ذلك ما يجب عرضه عند فتحه وما يجب فعله عند إغلاقه، ولكن لن تحتاج إلى إجراء أي تغييرات عليه.

فتح برنامج تصحيح الأخطاء

قد تحتاج إلى تصحيح أخطاء تطبيقك أثناء متابعتك لهذا الدرس التطبيقي حول الترميز. بما أنّ هذا التطبيق يعتمد على Electron، فإنّه يتضمّن أداة تصحيح أخطاء Chrome المدمجة. على معظم الأنظمة الأساسية، يمكنك فتحه باستخدام Ctrl + Shift + i. انقر على علامة التبويب وحدة التحكّم للاطّلاع على السجلّات ورسائل الخطأ من التطبيق.

لن تطّلِع هنا على الكثير من التفاصيل الأخرى، لذا سنتدرّب على أداة تصنيف الصور.

3- تدريب مصنِّف صور

في هذا القسم، تقوم بتدريب إصدارات TFLite وCoal من نموذج تصنيف صور مخصص.

تدريب المصنِّف

يأخذ "مصنِّف الصور" الصور المدخلة ويعيّن تصنيفات لها. في هذا الدرس التطبيقي حول الترميز، يمكنك استخدام أداة تعليم الآلة لتدريب نموذج في المتصفّح. لتسريع التدريب على هذا القسم، يمكنك استخدام جهاز كمبيوتر مكتبي أو كمبيوتر محمول بدلاً من Raspberry Pi، ولكن سيكون عليك نسخ الملفات الناتجة إلى Pi.

أنت الآن جاهز لتدريب نموذج. إذا لم تكن متأكّدًا من نوع النموذج الذي يجب تدريبه، يمكنك الاستعانة بنموذج سهل التطبيق لتدريبه، وهو جهاز يرصد ما إذا كان هناك شخص داخل الإطار.

  1. افتح صفحة "تدريب الآلة" في علامة تبويب جديدة.
  2. انقر على مشروع الصور، ثم نموذج صورة عادي.
  3. أضِف نماذج صور لكل صف. ويعد استخدام إدخال كاميرا الويب أسهل طريقة لإجراء ذلك. يمكنك أيضًا إعادة تسمية الصفوف.
  4. عند الانتهاء من جمع بيانات كافية لكل فئة (عادة ما تكون 50 عينة كافية)، اضغط على نموذج القطار.

عند انتهاء تدريب النموذج، من المفترض أن تظهر لك معاينة لمخرجات النموذج.

يتم تدريب النموذج على الصور من فئتين،

جرِّب إدخال مدخلات مختلفة للنموذج. إذا وجدت مدخلاً تم تصنيفه بشكل غير صحيح، فأضفه إلى بيانات التدريب وأعد تدريب النموذج.

  1. عندما تصل إلى دقة النموذج، انقر على تصدير النموذج. ستحتاج إلى تنزيل نسختين منفصلتين من النموذج.
  2. يمكنك تصدير نموذجك كنموذج النقاط العائمة في Tensorflow Lite. يؤدي هذا الإجراء إلى تنزيل ملف باسم "converted_tflite.zip". الذي يعمل على وحدة المعالجة المركزية (CPU).
  3. يمكنك تصدير نموذجك كنموذج Tensorflow Lite EdgeTPU. يؤدي هذا الإجراء إلى تنزيل ملف باسم converted_edgetpu.zip يتم تشغيله على وحدة معالجة الموتّرات Coral Edge TPU.

4. تشغيل طراز وحدة المعالجة المركزية (CPU) في تطبيقك

الآن وبعد تدريب أحد النماذج، حان الوقت لإضافته إلى تطبيقك. في نهاية هذا القسم، سيتمكّن التطبيق من تشغيل طرازك باستخدام وحدة المعالجة المركزية (CPU) للجهاز.

إضافة ملف النموذج إلى التطبيق

احرص على فك ضغط ملف النموذج converted_tflite.zip الذي نزّلته عند تدريب المصنِّف. هناك ملفان في الأرشيف. model_uquant.tflite هو نموذج TFLite المحفوظ، بما في ذلك الرسم البياني للنموذج والأوزان. يحتوي labels.txt على التصنيفات التي يمكن للإنسان فهمها للفئات التي يتوقّعها النموذج. ضَع كلا الملفين في modeldirectory.

تثبيت الاعتماديات

يتطلب تحميل النموذج والإدخالات التي تتم معالجتها مسبقًا بعض التبعيات من TensorFlow.js:

  • tfjs-tflite-node: حزمة TensorFlow.js لتشغيل نماذج TFLite في Node.js.
  • @tensorflow/tfjs: الحزمة الرئيسية لمنصة TensorFlow.js.

سبق أن تم تثبيت @tensorflow/tfjs، ولكن عليك تثبيت tfjs-tflite-node باستخدام الأمر التالي:

npm install --save tfjs-tflite-node

بعد التثبيت، أضِفه إلى التطبيق في أعلى renderer.js:

الجزء 1 من CODELAB: استيراد tfjs-tflite-node

const {loadTFLiteModel} = require('tfjs-tflite-node');

تحميل النموذج

أنت الآن جاهز لتحميل النموذج. وتوفر tfjs-tflite-node الدالة loadTFLiteModel لإجراء ذلك. يمكنها تحميل نماذج من مسار ملف أو من ArrayBuffer أو عنوان URL لـ TFHub. لتحميل النموذج وأوزانه، أضِف ذلك إلى الدالة main:

الجزء 1 من برنامج CODELAB: تحميل النموذج هنا

const modelPath = './model/model_unquant.tflite';
const model = await loadTFLiteModel(modelPath);
const labels = fs.readFileSync('./model/labels.txt', 'utf8')
      .split('\n');

تشغيل النموذج

يتطلب تشغيل النموذج ثلاث خطوات. أولاً، عليك سحب إطار إدخال ومعالجته مسبقًا من كاميرا الويب. بعد ذلك، تقوم بتشغيل النموذج على هذا الإطار وتحصل على تنبؤ. بعد ذلك، يمكنك عرض التوقع على الصفحة.

المعالجة المسبقة لإدخال كاميرا الويب

في الوقت الحالي، كاميرا الويب هي مجرد عنصر HTML، والإطارات التي تعرضها غير متاحة لملف JavaScript Renderer.js. لسحب الإطارات من كاميرا الويب، توفّر TensorFlow.js حِزمة tf.data.webcam التي توفّر طريقة capture() سهلة الاستخدام لالتقاط الإطارات من الكاميرا.

ولاستخدامه، يُرجى إضافة رمز الإعداد هذا إلى main():

CODELAB الجزء 1: إعداد tf.data.webcam هنا.

const tensorCam = await tf.data.webcam(webcam);

بعد ذلك، لالتقاط صورة في كل إطار، أضِف ما يلي إلى "run()":

CODELAB الجزء 1: التقط إطارات كاميرا الويب هنا.

const image = await tensorCam.capture();

تحتاج أيضًا إلى إجراء معالجة مسبقة لكل إطار ليكون متوافقًا مع النموذج. إنّ النموذج الذي يستخدمه هذا الدرس التطبيقي حول الترميز له شكل إدخال ( 1, 224, 224, 3]، لذا فهو يتوقع صورة بنموذج أحمر أخضر أزرق بحجم 224 x 224 بكسل). يتخذ tensorCam.capture() شكل [224، 224، 3]، لذا يجب إضافة بُعد إضافي في مقدمة العشرات باستخدام tf.expandDims. بالإضافة إلى ذلك، يتوقّع طراز وحدة المعالجة المركزية إدخال Float32 من -1 إلى 1، لكن كاميرا الويب تلتقط القيم من 0 إلى 255. يمكنك قسمة متصِل الإدخال على 127 لتغيير نطاقه من [0، 255] إلى [0، ~2]، ثم طرح 1 للحصول على النطاق المطلوب [-1، ~1]. أضِف هذه الأسطر إلى tf.tidy() في الدالة run() لإجراء ذلك:

الجزء 1 من برنامج CODELAB: المعالجة المسبقة لإطارات كاميرا الويب هنا

const expanded = tf.expandDims(image, 0);
const divided = tf.div(expanded, tf.scalar(127));
const normalized = tf.sub(divided, tf.scalar(1));

من المهم التخلص من مبدلات التوتر بعد استخدامها. يُجري tf.tidy() هذا الإجراء تلقائيًا للرمز البرمجي المضمّن في عملية الاستدعاء، لكنه لا يتيح دوال غير متزامنة. يجب التخلص يدويًا من أداة عرض الصور التي أنشأتها سابقًا من خلال استدعاء طريقة dispose().

CODELAB الجزء 1: التخلص من إطارات كاميرا الويب هنا.

image.dispose();

تنفيذ النموذج وعرض النتائج

لتشغيل النموذج على الإدخال الذي تمّت معالجته مسبقًا، يمكنك استدعاء model.predict() على موصّل النص الذي تمت تسويته. يكون ناتج هذه الطريقة مترابطًا أحادي البعد يتضمن الاحتمالية المتوقعة لكل تصنيف. يمكنك ضرب هذه الاحتمالية في 100 للحصول على النسبة المئوية لكل تصنيف، واستخدام الدالة showPrediction المضمَّنة في رمز إجراء التفعيل لعرض عبارات البحث المقترحة الخاصة بالنموذج على الشاشة.

يستخدم هذا الرمز أيضًا stats.js لتحديد المدة التي يستغرقها التوقع من خلال إجراء استدعاءات إلى stats.begin وstats.end في حوالي model.predict.

CODELAB الجزء 1: تشغيل النموذج وعرض النتائج هنا.

stats.begin();
const prediction = model.predict(normalized);
stats.end();
const percentage = tf.mul(prediction, tf.scalar(100));
showPrediction(percentage.dataSync(), labels);

شغِّل التطبيق مرة أخرى باستخدام yarn start، ومن المفترض أن تظهر لك التصنيفات من نموذجك.

يعمل نموذج وحدة المعالجة المركزية TFLite في تطبيق Electron. يصنف الصور من كاميرا الويب ويعرض قيم الثقة لكل فئة أدناه.

الأداء

بما أنّه تم إعداده حاليًا، يعمل النموذج على وحدة المعالجة المركزية (CPU). وهذا أمر جيد لأجهزة الكمبيوتر المكتبية ومعظم أجهزة الكمبيوتر المحمولة، ولكن قد لا يكون مرغوبًا فيه في حال تشغيله على جهاز Raspberry Pi أو جهاز آخر منخفض الطاقة. على جهاز Raspberry Pi 4، ستظهر لك على الأرجح حوالي 10 لقطات في الثانية، وهي قد لا تكون سريعة بما يكفي لبعض التطبيقات. للحصول على أداء أفضل بدون استخدام جهاز أسرع، يمكنك استخدام وحدة معالجة الموتّرات الخاصة بالتطبيقات على هيئة Coral Edge TPU.

5- تشغيل نموذج Coral في تطبيقك

إذا لم يكن لديك جهاز Coral، فيمكنك تخطي هذا القسم.

تستند هذه الخطوة من الدرس التطبيقي حول الترميز إلى الرمز الذي كتبته في القسم الأخير، ولكن يمكنك استخدام النقطة المرجعية cpu_inference_working بدلاً من ذلك إذا كنت تريد البدء بقائمة فارغة.

خطوات تشغيل نموذج الشعاب المرجانية شبه مطابقة تقريبًا لخطوات تشغيل نموذج وحدة المعالجة المركزية. الاختلاف الرئيسي هو تنسيق النموذج. ونظرًا لأن الشعاب المرجانية لا تدعم سوى متواتس uint8، فإن النموذج محدد كمي. ويؤثر هذا في مُعادِلات الإدخال التي يتمّ تمريرها إلى النموذج ومقادير الإخراج التي تُرجعها. يتمثل الاختلاف الآخر في أن النماذج يجب تجميعها باستخدام المحول البرمجي لـ Edge TPU لتشغيلها على Coral TPU. سبق أن أكملت TeachableMachine هذه الخطوة، ولكن يمكنك التعرّف على كيفية تنفيذ ذلك في نماذج أخرى من خلال الانتقال إلى وثائق Coral.

إضافة ملف نموذج Coral إلى التطبيق

احرص على فك ضغط ملف النموذج converted_edgetpu.zip الذي نزّلته عند تدريب المصنِّف. هناك ملفان متضمَّنان في الأرشيف. model_edgetpu.tflite هو نموذج TFLite المحفوظ، بما في ذلك الرسم البياني للنموذج والأوزان. يحتوي labels.txt على التصنيفات التي يمكن للإنسان فهمها للفئات التي يتوقّعها النموذج. ضَع ملف النموذج في الدليل coral_model.

تثبيت الاعتماديات

يتطلب تشغيل نماذج Coral توفُّر مكتبة وقت تشغيل Edge TPU. تأكَّد من تثبيته من خلال اتّباع تعليمات الإعداد قبل المتابعة.

يتم الوصول إلى أجهزة "المرجان" كمفوَّضين من TFLite. للوصول إليها من خلال JavaScript، عليك تثبيت الحزمة coral-tflite-delegate:

npm install --save coral-tflite-delegate

بعد ذلك، استورِد المفوَّض من خلال إضافة هذا السطر إلى أعلى ملف renderer.js:

الجزء 2 من CODELAB: استيراد المفوَّض من هنا

const {CoralDelegate} = require('coral-tflite-delegate');

تحميل النموذج

أنت الآن جاهز لتحميل نموذج الشعاب المرجانية. يمكنك إجراء ذلك بالطريقة نفسها المتّبَعة في نموذج وحدة المعالجة المركزية، إلا أنّك تمرِّر الآن الخيارات إلى دالة loadTFLiteModel لتحميل تفويض Coral.

الجزء 2 من CODELAB: تحميل نموذج التفويض هنا

const coralModelPath = './coral_model/model_edgetpu.tflite';
const options = {delegates: [new CoralDelegate()]};
const coralModel = await loadTFLiteModel(coralModelPath, options);

ولا تحتاج إلى تحميل التصنيفات لأنها متطابقة مع طراز وحدة المعالجة المركزية (CPU).

إضافة زر للتبديل بين وحدة المعالجة المركزية (CPU) وتقنية Coral

يمكنك إضافة نموذج الشعاب المرجانية إلى جانب نموذج وحدة المعالجة المركزية الذي أضفته في القسم الأخير. يؤدي تشغيلهما معًا في نفس الوقت إلى صعوبة رؤية الاختلافات في الأداء، لذلك يقوم زر التبديل بالتبديل بين تنفيذ Coral ووحدة المعالجة المركزية (CPU).

أضِف الزر الذي يحتوي على هذا الرمز:

الجزء 2 من CODELAB: أنشِئ زر التفويض هنا.

let useCoralDelegate = false;
const toggleCoralButton = document.createElement('button');
function toggleCoral() {
  useCoralDelegate = !useCoralDelegate;
  toggleCoralButton.innerText = useCoralDelegate
      ? 'Using Coral. Press to switch to CPU.'
      : 'Using CPU. Press to switch to Coral.';
}
toggleCoralButton.addEventListener('click', toggleCoral);
toggleCoral();
document.body.appendChild(toggleCoralButton);

لنربط هذا الشرط في الدالة run(). عندما تكون السياسة useCoralDelegate "خطأ"، من المفترض أن تعمل على تشغيل إصدار وحدة المعالجة المركزية (CPU). بخلاف ذلك، يشغِّل إصدار Coral (ولكن في الوقت الحالي، لن يفعل أي شيء). أتلف الرمز من تشغيل طراز وحدة المعالجة المركزية (CPU) في عبارة if. يُرجى العِلم أنّه يتم استبعاد متوتر expanded من عبارة if لأنّ نموذج الشعاب المرجانية يستخدمه.

الجزء 2 من CODELAB: تحقّق مما إذا كنت تريد استخدام المفوَّض هنا.

// NOTE: Don't just copy-paste this code into the app.
// You'll need to edit the code from the CPU section.
const expanded = tf.expandDims(image, 0);
if (useCoralDelegate) {
  // CODELAB part 2: Run Coral prediction here.
} else {
  const divided = tf.div(expanded, tf.scalar(127));
  const normalized = tf.sub(divided, tf.scalar(1));
  stats.begin();
  const prediction = model.predict(normalized);
  stats.end();
  const percentage = tf.mul(prediction, tf.scalar(100));
  showPrediction(percentage.dataSync(), labels);
}

تشغيل النموذج

يتوقع إصدار الشعاب المرجانية من النموذج عشرات uint8 من 0 إلى 255، لذلك لا يلزم تسوية المدخلات. ومع ذلك، يكون الناتج أيضًا متوتر uint8 في النطاق من 0 إلى 255. ويجب تحويله إلى عدد عشري من 0 إلى 100 قبل عرضه.

CODELAB الجزء 2: تشغيل التنبؤ بالشعاب المرجانية هنا. (هذا جزء من مقتطف الرمز أعلاه)

stats.begin();
const prediction = coralModel.predict(expanded);
stats.end();
const percentage = tf.div(tf.mul(prediction, tf.scalar(100)), tf.scalar(255));
showPrediction(percentage.dataSync(), labels);

يُرجى تشغيل التطبيق مرة أخرى باستخدام yarn start، ومن المفترض أن يعرض التصنيفات من مسرِّعة Coral.

يعمل نموذجا وحدة المعالجة المركزية (CPU) والشعاب المرجانية في التطبيق واحدًا تلو الآخر، ويتنقل زر بينهما. يحصل نموذج وحدة المعالجة المركزية على حوالي 20 لقطة في الثانية ويصل نموذج الشعاب المرجانية إلى حوالي 45.

يمكنك التبديل بين استنتاج "الشعاب المرجانية" و"وحدة المعالجة المركزية" بالضغط على الزر. قد تلاحظ أن تصنيفات الثقة لنموذج الشعاب المرجانية أقل دقة من طراز وحدة المعالجة المركزية، وعادة ما تنتهي بعلامة عشرية زوجية. هذا النقص في الدقة هو المقايضة عند تشغيل نموذج كمي على Coral. لا يهم عادةً من الناحية العملية، ولكن النقاط يجب مراعاتها.

ملاحظة حول الأداء

يتضمن عدد اللقطات في الثانية الذي يظهر لك كلاً من المعالجة المسبقة والمعالجة اللاحقة، ولذلك لا يمثل الميزات التي بإمكان أجهزة Coral استخدامها. يمكنك الحصول على فكرة أفضل عن الأداء من خلال النقر على مقياس عدد اللقطات في الثانية إلى أن يعرض وقت الاستجابة (بالمللي ثانية)، الذي يقيس فقط الاتصال بـ model.predict. ومع ذلك، لا يزال ذلك يشمل الوقت المستغرق لنقل Tensors إلى روابط TFLite الأصلية ثم إلى جهاز Coral، لذا فهو ليس قياسًا مثاليًا. للحصول على مقاييس أداء أكثر دقة تمت كتابتها بلغة C++ ، يُرجى الاطّلاع على صفحة قياس أداء EdgeTPU.

وتجدر الإشارة أيضًا إلى أنّه تم تسجيل الفيديو على كمبيوتر محمول بدلاً من جهاز Raspberry Pi، لذا قد تلاحظ اختلافًا في عدد اللقطات في الثانية.

تسريع المعالجة المسبقة للشعاب المرجانية

في بعض الحالات، يمكنك تسريع المعالجة المسبقة من خلال تبديل خلفيات TFJS. الواجهة الخلفية التلقائية هي WebGL، وهي جيدة للعمليات الكبيرة والمتوازية، إلا أنّ هذا التطبيق لا ينفّذ الكثير من ذلك في مرحلة المعالجة المسبقة (العملية الوحيدة التي يستخدمها هي expandDims، وهي ليست موازية). يمكنك التبديل إلى الواجهة الخلفية لوحدة المعالجة المركزية (CPU) لتجنُّب زيادة وقت الاستجابة لنقل ملفات العشرات من وحدة معالجة الرسومات وإليها من خلال إضافة هذا السطر بعد عمليات الاستيراد في أعلى الملف.

tf.setBackend(cpu');

ويؤثر ذلك أيضًا في المعالجة المسبقة لطراز وحدة المعالجة المركزية TFLite، والذي يتم بالتوازي، لذلك يعمل النموذج بشكل أبطأ بكثير مع هذا التغيير.

6- تسريع نموذج وحدة المعالجة المركزية باستخدام WebNN

إذا لم يكن لديك مسرِّعة للشعاب المرجانية، أو إذا كنت تريد تجربة طريقة أخرى لتسريع النموذج، يمكنك استخدام WebNN TFLite. يستخدم هذا المفوَّض أجهزة تعلُّم الآلة المضمَّنة في معالجات Intel لتسريع استنتاج النموذج باستخدام مجموعة أدوات OpenVINO. وبالتالي، لها متطلبات إضافية لم يتم تناولها في قسم الإعداد الخاص بهذا الدرس التطبيقي حول الترميز، وستحتاج إلى تثبيت مجموعة أدوات OpenVINO. قبل المتابعة، تأكَّد من توافق عملية الإعداد مع أنظمة التشغيل المستهدفة للنظام الأساسي (Target System)، ولكن يُرجى العلم أنّ جهة التفويض WebNN لا تتوافق مع نظام التشغيل macOS بعد.

تثبيت مجموعة أدوات OpenVINO

تستخدم مجموعة أدوات OpenVINO أجهزة تعلُّم الآلة المضمَّنة في معالجات Intel لتسريع أداء النماذج. يمكنك تنزيل إصدار مجمّع مسبقًا من Intel أو إنشائه من المصدر. هناك عدة طرق لتثبيت OpenVINO، ولكن لأغراض هذا الدرس التطبيقي حول الترميز، ننصحك باستخدام النص البرمجي لأداة التثبيت على نظام التشغيل Windows أو Linux. احرص على تثبيت إصدار وقت التشغيل 2021.4.2 LTS، لأنّ الإصدارات الأخرى قد تكون غير متوافقة. بعد تشغيل أداة التثبيت، تأكَّد من ضبط متغيّرات بيئة الواجهة على النحو الموضَّح في تعليمات التثبيت لنظام التشغيل Linux أو Windows ( الحل الدائم) أو من خلال تشغيل الأمر setupvars.sh (نظام التشغيل Linux) أو setupvars.bat (Windows) المتوفّر في الدليل webnn-tflite-delegate.

التحقّق من عمل تفويض WebNN

للتحقّق من عمل مفوَّض WebNN بشكل صحيح، يمكنك إجراء اختبارات الدمج لحزمة webnn-tflite-delegate المتوفّرة في الدليل الجذري للمستودع. لإجراء اختبارات الدمج، شغِّل هذه الأوامر في دليل الحزمة:

# In webnn-tflite-delegate/
npx yarn
npx yarn test-integration

من المفترض أن تظهر لك نتيجة على النحو التالي:

WebNN delegate: WebNN device set to 0.
INFO: Created TensorFlow Lite WebNN delegate for device Default and power Default.

============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
label: wine bottle
score:  0.934505045413971
.


1 spec, 0 failures
Finished in 0.446 seconds
Randomized with seed 58441 (jasmine --random=true --seed=58441)
Done in 8.07s.

إذا ظهرت لك نتيجة مثل هذه، فإنها تشير إلى خطأ في الإعداد:

Platform node has already been set. Overwriting the platform with node.
Randomized with seed 05938
Started
error Command failed with exit code 3221225477.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

يعني هذا على الأرجح أنك لم تضبط متغيرات بيئة OpenVINO. في الوقت الحالي، يمكنك إعداد هذه الخيارات من خلال تشغيل الأمر setupvars.sh (نظام التشغيل Linux) أو setupvars.bat (نظام التشغيل Windows)، ولكنك قد تحتاج إلى ضبطها بشكل دائم من خلال اتّباع تعليمات نظام التشغيل Linux أو Windows ( الحل الدائم). إذا كنت تستخدم نظام التشغيل Windows، فيمكنك

setupvars.bat

لا يتوافق الأمر مع Git bash، لذا احرص على تشغيله بالإضافة إلى الأوامر الأخرى من هذا الدرس التطبيقي حول الترميز من خلال موجّه الأوامر في نظام التشغيل Windows.

تثبيت تفويض WebNN

بعد تثبيت OpenVINO، يمكنك الآن تسريع نموذج وحدة المعالجة المركزية باستخدام WebNN. يعتمد هذا القسم من الدرس التطبيقي حول الترميز على الرمز الذي كتبته في القسم "تشغيل نموذج وحدة المعالجة المركزية في تطبيقك". . يمكنك استخدام الرمز الذي كتبته في هذه الخطوة، ولكن إذا كنت قد أكملت قسم "الشعاب المرجانية"، استخدم النقطة المرجعية cpu_inference_working بدلاً من ذلك حتى تبدأ بقائمة فارغة.

يتم توزيع جزء Node.js من تفويض WebNN على npmjs. لتثبيت التطبيق، شغِّل الأمر التالي:

npm install --save webnn-tflite-delegate

بعد ذلك، استورِد المفوَّض من خلال إضافة هذا السطر إلى أعلى ملف renderer.js:

الجزء 2 من CODELAB: استيراد المفوَّض من هنا

const {WebNNDelegate, WebNNDevice} = require('webnn-tflite-delegate');

يتيح تفويض WebNN التشغيل على وحدة المعالجة المركزية (CPU) أو وحدة معالجة الرسومات (GPU). يتيح لك WebNNDevice اختيار الجهاز الذي تريد استخدامه.

تحميل النموذج

أصبحت جاهزًا الآن لتحميل النموذج مع تفعيل تفويض WebNN. بالنسبة إلى Coral، كان عليك تحميل ملف نموذج مختلف، ولكن WebNN يتوافق مع تنسيق النموذج نفسه مثل TFLite. أضِف WebNNDelegate إلى قائمة المستخدمين المفوَّضين الذين تم تمريرهم إلى النموذج لتفعيله:

الجزء 2 من CODELAB: تحميل نموذج التفويض هنا

let webnnModel = await loadTFLiteModel(modelPath, {
  delegates: [new WebNNDelegate({webnnDevice: WebNNDevice.DEFAULT})],
});

لا تحتاج إلى تحميل التصنيفات مرة أخرى لأن هذا هو النموذج نفسه.

إضافة زر للتبديل بين وحدة المعالجة المركزية TfLite وWebNN

الآن وبعد أن أصبح إصدار WebNN من النموذج جاهزًا، أضِف زرًا للتبديل بين استدلال وحدة المعالجة المركزية WebNN وTfLite. يؤدي تشغيلهما معًا في الوقت نفسه إلى صعوبة رؤية الاختلافات في الأداء.

أضف الزر مع هذه التعليمة البرمجية (لاحظ أنه لن يبدّل النماذج فعليًا بعد):

الجزء 2 من CODELAB: أنشِئ زر التفويض هنا.

let useWebNNDelegate = false;
const divElem = document.createElement('div');
const toggleWebNNButton = document.createElement('button');
function toggleWebNN() {
  useWebNNDelegate = !useWebNNDelegate;
  toggleWebNNButton.innerHTML = useWebNNDelegate
      ? 'Using WebNN. Press to switch to TFLite CPU.'
      : 'Using TFLite CPU. Press to switch to WebNN.';
  divElem.hidden = useWebNNDelegate ? false : true;
}

toggleWebNNButton.addEventListener('click', toggleWebNN);
toggleWebNN();
document.body.appendChild(toggleWebNNButton);
document.body.appendChild(divElem);

يضيف هذا الرمز أيضًا عنصر div الذي تستخدمه لضبط إعدادات WebNN في القسم التالي.

إضافة قائمة منسدلة للتبديل بين أجهزة WebNN

يتوافق WebNN مع وحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات (GPU)، لذا أضِف قائمة منسدلة للتبديل بينهما. أضف هذه التعليمة البرمجية بعد الرمز الذي ينشئ الزر:

// Create elements for WebNN device selection
divElem.innerHTML = '<br/>WebNN Device: ';
const selectElem = document.createElement('select');
divElem.appendChild(selectElem);

const webnnDevices = ['Default', 'GPU', 'CPU'];
// append the options
for (let i = 0; i < webnnDevices.length; i++) {
  var optionElem = document.createElement('option');
  optionElem.value = i;
  optionElem.text = webnnDevices[i];
  selectElem.appendChild(optionElem);
}

إذا شغّلت التطبيق، ستظهر لك قائمة منسدلة تضم "الإعدادات التلقائية" و"وحدة معالجة الرسومات" و"وحدة المعالجة المركزية". لن يؤدي اختيار أحدهم إلى اتخاذ أي إجراء الآن لأنّ القائمة المنسدلة لم يتمّ ربطها بعد. يعرض التطبيق قائمة منسدلة حيث يمكن اختيار جهاز WebNN من الإعدادات التلقائية أو وحدة معالجة الرسومات أو وحدة المعالجة المركزية.

تغيير الجهاز من خلال القائمة المنسدلة

لربط القائمة المنسدلة وتغيير جهاز WebNN المستخدَم، أضِف أداة استماع إلى حدث تغيير لعنصر أداة اختيار القائمة المنسدلة. عند تغيير القيمة المحدّدة، يمكنك إعادة إنشاء نموذج WebNN باستخدام جهاز WebNN المقابل المحدَّد في خيارات التفويض.

أضف التعليمة البرمجية التالية بعد الرمز الذي أضاف القائمة المنسدلة:

selectElem.addEventListener('change', async () => {
  let webnnDevice;
  switch(selectElem.value) {
    case '1':
      webnnDevice = WebNNDevice.GPU;
      break;
    case '2':
      webnnDevice = WebNNDevice.CPU;
      break;
    default:
      webnnDevice = WebNNDevice.DEFAULT;
      break;
  }
  webnnModel = await loadTFLiteModel(modelPath, {
    delegates: [new WebNNDelegate({webnnDevice})],
  });
});

باستخدام هذا التغيير، تنشئ القائمة المنسدلة نموذجًا جديدًا بالإعدادات الصحيحة في كل مرة يتم فيها تغييرها. حان الوقت الآن لربط نموذج WebNN واستخدامه للاستنتاج.

تشغيل نموذج WebNN

إنّ نموذج WebNN جاهز للاستخدام، إلا أنّ زرّ التبديل بين وحدة المعالجة المركزية WebNN وTfLite لا يبدِّل النموذج بعد. لتبديل النموذج، يجب أولاً إعادة تسمية المتغيّر model بدءًا من وقت تحميل نموذج وحدة المعالجة المركزية TfLite في القسم الأول من الدرس التطبيقي حول الترميز.

يُرجى تغيير السطر التالي...

const model = await loadTFLiteModel(modelPath);

...لتتطابق مع هذا السطر.

const cpuModel = await loadTFLiteModel(modelPath);

بعد إعادة تسمية المتغيّر model ليصبح cpuModel، أضِف هذا المتغير إلى الدالة run لاختيار النموذج الصحيح استنادًا إلى حالة الزر:

الجزء 2 من CODELAB: تحقّق مما إذا كنت تريد استخدام المفوَّض هنا.

let model;
if (useWebNNDelegate) {
  model = webnnModel;
} else {
  model = cpuModel;
}

والآن، عند تشغيل التطبيق، يبدِّل الزر بين TfLite CPU وWebNN. يعمل نموذج وحدة المعالجة المركزية TFLite وطرازات وحدة المعالجة المركزية WebNN ووحدة معالجة الرسومات في التطبيق. عندما يكون أحد نماذج WebNN نشطًا، يتم تبديل القائمة المنسدلة بينهما. يحصل طراز وحدة المعالجة المركزية (CPU) على 15 لقطة في الثانية تقريبًا، ويصل معدل وحدة المعالجة المركزية WebNN إلى 40 لقطة تقريبًا.

يمكنك أيضًا التبديل بين وحدة معالجة الرسومات WebNN ووحدة معالجة الرسومات إذا كانت لديك وحدة معالجة رسومات مدمجة من Intel.

ملاحظة حول الأداء

يتضمّن عدد اللقطات في الثانية الذي يظهر لك كلاً من المعالجة المسبقة والمعالجة اللاحقة، ولذلك لا يمثل الميزات التي تستطيع WebNN تنفيذها. يمكنك الحصول على فكرة أفضل عن الأداء من خلال النقر على مقياس عدد اللقطات في الثانية إلى أن يعرض وقت الاستجابة (بالمللي ثانية)، الذي يقيس فقط الاتصال بـ model.predict. ومع ذلك، لا يزال ذلك يشمل الوقت الذي يستغرقه نقل Tensors إلى روابط TFLite الأصلية، لذا فهو ليس قياسًا مثاليًا.

7. تهانينا

تهانينا! لقد أكملت للتو أول مشروع Coral / WebNN باستخدام tfjs-tflite-node في Electron.

جربه واختبره على مجموعة متنوعة من الصور. يمكنك أيضًا تدريب نموذج جديد على TeachableMachine لتصنيف أي شيء مختلف تمامًا.

الملخّص

في هذا الدرس التطبيقي حول الترميز، تعلمتَ ما يلي:

  • كيفية تثبيت وإعداد حزمة npm tfjs-tflite-node لتشغيل نماذج TFLite في Node.js
  • كيفية تثبيت مكتبة وقت تشغيل Edge TPU لتشغيل الطُرز على جهاز Coral.
  • كيفية تسريع استنتاج النموذج باستخدام وحدة معالجة الموتّرات ضِمن حافة الشعاب المرجانية
  • كيفية تسريع استنتاج النموذج باستخدام WebNN

الخطوات التالية

والآن بعد أن أصبح لديك قاعدة عمل يمكنك البدء بها، ما هي الأفكار الإبداعية التي يمكنك التوصل إليها لتوسيع نطاق نموذج التعلم الآلي هذا ليشمل حالة استخدام حقيقية قد تعمل عليها؟ ربما يمكنك إحداث ثورة في الصناعة التي تعمل بها من خلال استنتاج سريع وبأسعار معقولة، أو ربما يمكنك تعديل محمصة الخبز بحيث تتوقف عن التحميص عندما يبدو الخبز مناسبًا. بإمكانك الحصول على خيارات لا تُعدّ ولا تُحصى.

للحصول على مزيد من المعلومات حول الطريقة التي استخدمتها TeachableMachine في تدريب النموذج الذي استخدمته، يمكنك الاطّلاع على الدرس التطبيقي حول الترميز حول نقل التعلّم. إذا كنت تبحث عن نماذج أخرى متوافقة مع تطبيق Coral، مثل التعرّف على الكلام وتقدير الوضعية، يمكنك الاطّلاع على coral.ai/models. يمكنك أيضًا العثور على إصدارات وحدة المعالجة المركزية (CPU) من هذه الطرازات وغيرها على TensorFlow Hub.

مشاركة إبداعاتك معنا

يمكنك بسهولة توسيع نطاق المحتوى الذي صنعته اليوم للاستفادة من حالات استخدام إبداعية أخرى أيضًا، ونشجّعك على مواصلة الابتكار.

ننصحك بالإشارة إلى حسابنا على وسائل التواصل الاجتماعي باستخدام الهاشتاغ #MadeWithTFJS للاستفادة من فرصة عرض مشروعك على مدونة TensorFlow أو حتى الفعاليات المستقبلية. نأمل أن نرى ما يمكنك صنعه.

المواقع الإلكترونية المقترَحة