كتابة العمليات والنواة والتدرجات المخصصة في TensorFlow.js

ملخص

يوضح هذا الدليل آليات تحديد العمليات المخصصة (ops) والنواة والتدرجات في TensorFlow.js. ويهدف إلى تقديم نظرة عامة على المفاهيم والمؤشرات الرئيسية للتعليمات البرمجية التي توضح المفاهيم أثناء العمل.

من هو هذا الدليل؟

يعد هذا دليلًا متقدمًا إلى حد ما ويتناول بعض الأجزاء الداخلية لـ TensorFlow.js، وقد يكون مفيدًا بشكل خاص للمجموعات التالية من الأشخاص:

  • المستخدمون المتقدمون لـ TensorFlow.js المهتمين بتخصيص سلوك العمليات الرياضية المختلفة (مثل الباحثين الذين يتجاوزون تطبيقات التدرج الموجودة أو المستخدمين الذين يحتاجون إلى تصحيح الوظائف المفقودة في المكتبة)
  • يقوم المستخدمون بإنشاء مكتبات تعمل على توسيع TensorFlow.js (على سبيل المثال، مكتبة جبر خطي عامة مبنية على أعلى عناصر TensorFlow.js الأولية أو واجهة TensorFlow.js الخلفية الجديدة).
  • المستخدمون المهتمون بالمساهمة بعمليات جديدة في Tensorflow.js والذين يرغبون في الحصول على نظرة عامة حول كيفية عمل هذه الآليات.

هذا ليس دليلاً للاستخدام العام لـ TensorFlow.js لأنه يدخل في آليات التنفيذ الداخلية. لا تحتاج إلى فهم هذه الآليات لاستخدام TensorFlow.js

يجب أن تكون مرتاحًا (أو ترغب في تجربة) قراءة كود مصدر TensorFlow.js لتحقيق أقصى استفادة من هذا الدليل.

المصطلح

بالنسبة لهذا الدليل، من المفيد وصف بعض المصطلحات الأساسية مقدمًا.

العمليات (Ops) - عملية رياضية على موتر واحد أو أكثر تنتج موترًا واحدًا أو أكثر كمخرجات. العمليات عبارة عن كود "عالي المستوى" ويمكنها استخدام عمليات أخرى لتحديد منطقها.

Kernel - تنفيذ محدد لعملية مرتبطة بقدرات أجهزة/منصة محددة. النواة "منخفضة المستوى" ومخصصة للواجهة الخلفية. تحتوي بعض العمليات على تعيين واحد لواحد من العملية إلى النواة بينما تستخدم العمليات الأخرى حبات متعددة.

Gradient / GradFunc - تعريف "الوضع الخلفي" للمرجع/النواة الذي يحسب مشتق تلك الوظيفة فيما يتعلق ببعض المدخلات. التدرجات عبارة عن كود "عالي المستوى" (ليس مخصصًا للواجهة الخلفية) ويمكنه استدعاء عمليات أو نواة أخرى.

سجل Kernel - خريطة من صف (اسم kernel، اسم الواجهة الخلفية) إلى تطبيق kernel.

سجل التدرج - خريطة من اسم النواة إلى تطبيق التدرج .

تنظيم الكود

يتم تعريف العمليات والتدرجات في tfjs-core .

النواة مخصصة للواجهة الخلفية ويتم تعريفها في مجلدات الواجهة الخلفية الخاصة بها (على سبيل المثال tfjs-backend-cpu ).

لا يلزم تعريف العمليات والنواة والتدرجات المخصصة داخل هذه الحزم. ولكن غالبًا ما يتم استخدام رموز مماثلة في تنفيذها.

تنفيذ العمليات المخصصة

إحدى الطرق للتفكير في عملية مخصصة هي أنها مجرد وظيفة JavaScript تُرجع بعض مخرجات الموتر، غالبًا مع الموترات كمدخلات.

  • يمكن تعريف بعض العمليات بشكل كامل من حيث العمليات الموجودة، ويجب فقط استيراد هذه الوظائف واستدعاءها مباشرةً. هنا مثال .
  • يمكن أيضًا أن يتم إرسال تنفيذ العملية إلى نواة خلفية محددة. يتم ذلك عبر Engine.runKernel وسيتم شرحه بشكل أكبر في قسم "تنفيذ النوى المخصصة". هنا مثال .

تنفيذ النواة المخصصة

تسمح تطبيقات kernel الخاصة بالواجهة الخلفية بالتنفيذ الأمثل للمنطق الخاص بعملية معينة. يتم استدعاء النواة بواسطة العمليات التي تستدعي tf.engine().runKernel() . يتم تعريف تطبيقات النواة بأربعة أشياء

  • اسم النواة.
  • الواجهة الخلفية التي يتم تنفيذ النواة فيها.
  • المدخلات: وسيطات الموتر لوظيفة kernel.
  • السمات: وسيطات غير موتر لوظيفة kernel.

هنا مثال على تنفيذ النواة . تعتبر الاتفاقيات المستخدمة للتنفيذ خاصة بالواجهة الخلفية ويمكن فهمها بشكل أفضل من خلال النظر في تنفيذ وتوثيق كل واجهة خلفية معينة.

بشكل عام، تعمل النواة عند مستوى أقل من الموترات وبدلاً من ذلك تقرأ وتكتب مباشرة إلى الذاكرة التي سيتم تغليفها في النهاية في الموترات بواسطة tfjs-core.

بمجرد تنفيذ النواة، يمكن تسجيلها في TensorFlow.js باستخدام وظيفة registerKernel من tfjs-core. يمكنك تسجيل نواة لكل واجهة خلفية تريد أن تعمل فيها النواة. بمجرد التسجيل، يمكن استدعاء النواة باستخدام tf.engine().runKernel(...) وسيتأكد TensorFlow.js من إرساله إلى التنفيذ في الخلفية النشطة الحالية

تنفيذ التدرجات المخصصة

يتم تعريف التدرجات بشكل عام لنواة معينة (يتم تعريفها بنفس اسم النواة المستخدم في استدعاء tf.engine().runKernel(...) ). يسمح هذا لـ tfjs-core باستخدام السجل للبحث عن تعريفات التدرج لأي نواة في وقت التشغيل.

يعد تنفيذ التدرجات المخصصة مفيدًا لما يلي:

  • إضافة تعريف التدرج الذي قد لا يكون موجودا في المكتبة
  • تجاوز تعريف التدرج الموجود لتخصيص حساب التدرج لنواة معينة.

يمكنك مشاهدة أمثلة لتطبيقات التدرج هنا .

بمجرد تنفيذ التدرج اللوني لمكالمة معينة، يمكن تسجيله في TensorFlow.js باستخدام وظيفة registerGradient من tfjs-core.

الطريقة الأخرى لتطبيق التدرجات المخصصة التي تتجاوز سجل التدرج (وبالتالي تسمح بحساب التدرجات للوظائف العشوائية بطرق عشوائية هي استخدام tf.customGrad .

فيما يلي مثال على عملية داخل المكتبة لاستخدام customGrad