مدير وحدة المعالجة العصبية

يتوافق الإصدار 17 من Android والإصدارات الأحدث مع "مدير وحدة المعالجة العصبية" (com.android.npumanager)، الذي ينسّق عملية تخصيص موارد وحدة المعالجة العصبية وجدولتها في خدمات النظام وأحمال عمل التطبيقات. من خلال نقل عملية التحكيم في الموارد من برامج الخلفية المخصّصة التابعة للمورّد إلى نظام Android الأساسي، يزيد "مدير وحدة المعالجة العصبية" من إمكانية التنبؤ، ويمنع نقص الموارد، ويدير الحدود الحرارية، ويحسّن أداء الجهاز بشكل عام.

الخلفية والهدف

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

  • التنافس غير الفعّال على الموارد: تنافست أحمال عمل تعلُّم الآلة الكثيفة (مثل محركات استنتاج النماذج اللغوية الكبيرة أو أنظمة الرؤية على الجهاز فقط) مباشرةً مع أنظمة أخرى ذات أولوية عالية على موارد محدودة لوحدة المعالجة العصبية (مثل ذاكرة الوصول العشوائي الثابتة وذاكرة الأوزان وقنوات التنفيذ).
  • عدم استقرار النظام: يمكن أن تؤدي أحمال العمل غير المنسّقة إلى تقليل السرعة بسبب الحرارة أو أخطاء في صفحات الذاكرة أو برنامج الخلفية Low Memory Killer Daemon (LMKD) إذا تجاوزت الطلبات سعة الأجهزة.
  • تحديد الأولويات غير الفعّال: لا يمكن لخادم النظام تعديل أولوية وحدة المعالجة العصبية استجابةً لتغييرات السياق، مثل تحميل مهمة في الخلفية نموذجًا ضخمًا أثناء تفعيل خط أنابيب الكاميرا أو مساعد المستخدم الذي يتأثر بالمدة الزمنية في المقدّمة.

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

بنية النظام

تم تنفيذ "مدير وحدة المعالجة العصبية" كخدمة تابعة لنظام التشغيل باسم npu تعمل ضمن إطار عمل Android. يفصل "مدير وحدة المعالجة العصبية" التنسيق عالي المستوى لسياسات الجدولة عن تنفيذ برنامج التشغيل منخفض المستوى التابع للمورّد.

يوضّح المخطّط البياني التالي طبقات بيئة "مدير وحدة المعالجة العصبية":

طبقات بيئة "مدير وحدة المعالجة العصبية"

الشكل 1: طبقات بيئة "مدير وحدة المعالجة العصبية"

المكوّنات الرئيسية

  • عميل واجهة برمجة تطبيقات إطار العمل (android.npumanager.NpuManager): نقطة الدخول التي يستخدمها العملاء لطلب حجوزات تحميل النماذج
  • خدمة تابعة لنظام التشغيل (npu): خدمة تابعة لنظام التشغيل تتحكّم في الموافقات على تحميل النماذج وتدير أوامر المقاطعة استنادًا إلى قواعد أولوية الجدولة
  • واجهة برمجة تطبيقات HAL لجدولة وحدة المعالجة العصبية (android.hardware.npu): واجهة مستندة إلى لغة AIDL تنقل معاودة الاتصال الخاصة بأولويات تطبيقات Android بين إطار العمل وبرنامج التشغيل
  • برنامج التشغيل التابع للمورّد: برنامج تشغيل منخفض المستوى يتحكّم في وحدات تنفيذ الأجهزة وينفّذ آليات تحديد الأولويات منخفضة المستوى

حزمة تطوير البرامج (SDK) وواجهة برمجة التطبيقات لإطار العمل

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

طلب تحميل نموذج

يتم تمثيل طلب تحميل النموذج من خلال ModelLoadRequest. يحتوي هذا الكائن على ما يلي:

  • معرّف طلب فريد
  • فئة حجم النموذج المقدَّر، مثل NPU_MODEL_SIZE_LESS_THAN_1GB أو NPU_MODEL_SIZE_GREATER_THAN_2G
  • الأولوية المقصودة، مثل NPU_MODEL_PRIORITY_BACKGROUND أو NPU_MODEL_PRIORITY_NORMAL أو NPU_MODEL_PRIORITY_OPPORTUNISTIC

ينشئ مثال الرمز البرمجي التالي ModelLoadRequest بحدّ أقصى للحجم أكبر من 2 غيغابايت وأولوية تنفيذ عادية:

ModelLoadRequest request = new ModelLoadRequest.Builder(requestId)
        .setSize(NPU_MODEL_SIZE_GREATER_THAN_2G)
        .setPriority(NPU_MODEL_PRIORITY_NORMAL)
        .build();

طلب الموافقة

يستدعي العملاء requestCanLoadModel بشكل غير متزامن:

npuManager.requestCanLoadModel(request, callback, executor);

عند توفّر موارد وحدة المعالجة العصبية، يستجيب إطار العمل باستخدام ModelLoadRequestCallback مع الأحداث التالية:

  • onCanLoadModel(request, status, listener): يتم تنشيطه عند الموافقة على الطلب. يتلقّى العميل رمزًا مميزًا من NpuManager.ModelLoadStatusListener. بعد أن يحمّل العميل النموذج بالكامل في ذاكرة برنامج التشغيل، عليه استدعاء listener.notifyModelLoaded(request).
  • onRequestUnloadModel(request) أو onRequestUnloadModel(request, reason): يتم تنشيطه عندما يواجه النظام ضغطًا على الموارد (مثل طلب وارد في المقدّمة أو ارتفاع في درجة الحرارة) ويطلب من العميل إطلاق النموذج. بعد استعادة موارد وحدة المعالجة العصبية، يستدعي العميل listener.notifyModelUnloaded(request).
  • onModelLoadRequestComplete(request, status): يُعلم العميل بالتغييرات النهائية في دورة حياة الطلب، مثل الإلغاء.

يمكن للعملاء إلغاء الدعوات المعلّقة باستخدام cancelModelLoad(request).

واجهة برمجة تطبيقات HAL وعملية الدمج مع المورّد

لدعم "مدير وحدة المعالجة العصبية"، يجب أن تتوافق عمليات التنفيذ الخاصة بالمورّد على مستوى الجهاز مع واجهات خدمات AIDL في android.hardware.npu.

إعدادات الجدولة

ينقل النظام أولوية التطبيق باستخدام SchedulingConfig AIDL بنية SchedulingConfig AIDL المحدّدة في IScheduling.aidl:

package android.hardware.npu;

@VintfStability
parcelable SchedulingConfig {
    int minPriority;
    int maxPriority;
    int uid;
    int appPriority;
    boolean hasDirectAccess;
    boolean canAttributeOtherUid;
}

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

حالة المهمة ووضع الملف الشخصي

على برامج التشغيل التابعة للمورّد إبلاغ المدير بحالة دورة حياة مجموعات تنفيذ وحدة المعالجة العصبية. WorkInfo تتتبّع المهام (المحدّدة في WorkInfo.aidl):

package android.hardware.npu;

import android.hardware.npu.NpuUuid;

@VintfStability
parcelable WorkInfo {
    int id;
    @nullable NpuUuid groupId;
    int uid;
    int debugPid;
    int originalUid;
    @nullable String debugFeatureId;
    int jobPriority;
    int effectivePriority;
    long timestampMs;
    int deviceNumber;
}

إزالة التكرار من الأحداث

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

يتم الإبلاغ عن حالات دورة حياة معاودة الاتصال على النحو التالي:

  • onWorkRequested: يتم وضع حمل العمل في قائمة الانتظار من قِبل خدمة المورّد.
  • onWorkStarted: يبدأ تنفيذ حمل العمل.
    • NPU_START_REASON_INITIAL: أول عملية تنفيذ
    • NPU_START_REASON_RESUMED: استئناف التنفيذ بعد المقاطعة
  • onWorkEnded: انتهى تنفيذ حمل العمل.
    • NPU_END_REASON_COMPLETED: اكتملت عملية التشغيل بنجاح.
    • NPU_END_REASON_CANCELLED_USER: تم إلغاؤها من قِبل العميل.
    • NPU_END_REASON_CANCELLED_SYSTEM: تم إيقافها من قِبل سياسة النظام.
    • NPU_END_REASON_FAILED: خطأ في التنفيذ أو تعذُّر برنامج التشغيل
    • NPU_END_REASON_PAUSED: تم تعليقها مؤقتًا للمهام ذات الأولوية الأعلى.

جاهزية الجهاز واختباره

تأكَّد من ضبط هذه الإعدادات قبل التحقّق من حالة الجهاز.

بيانات التطبيق

على العملاء الذين يسعون إلى تحديد أولوية جدولة وحدة المعالجة العصبية الإعلان عن ميزة أجهزة وحدة المعالجة العصبية في ملف AndroidManifest.xml:

<uses-feature android:name="android.hardware.npu" android:required="false" />

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

اختبارات الدمج في VTS

يمكن التحقّق من عمليات تنفيذ واجهة برمجة تطبيقات HAL لوحدة المعالجة العصبية باستخدام الاختبارات الوظيفية في VTS، مثلاً VtsHalNpuSchedulingTargetTest.