איכות השירות

החל מ-Android 11, ‏ NNAPI מציע איכות שירות (QoS) טובה יותר, ומאפשר לאפליקציה לציין את העדיפויות היחסיות של המודלים שלה, את משך הזמן המקסימלי שצפוי להכנת מודל נתון ואת משך הזמן המקסימלי שצפוי להשלמת ביצוע נתון. בנוסף, ב-Android 11 נוספו ערכי שגיאה של NNAPI שמאפשרים לשירות לציין בצורה מדויקת יותר מה השתבש כשמתרחש כשל, כדי שאפליקציית הלקוח תוכל להגיב ולשחזר את הנתונים בצורה טובה יותר.

עדיפות

ב-Android מגרסה 11 ואילך, המודלים מוכנים עם עדיפות ב-NN HAL 1.3. העדיפות הזו היא יחסית למודלים מוכנים אחרים שנמצאים בבעלות אותה אפליקציה. הפעלות עם עדיפות גבוהה יכולות להשתמש ביותר משאבי מחשוב מאשר הפעלות עם עדיפות נמוכה, ויכולות להקדים או להפסיק הפעלות עם עדיפות נמוכה.

הקריאה ל-NN HAL 1.3 שכוללת את Priority כארגומנט מפורש היא IDevice::prepareModel_1_3. שימו לב שהארגומנט IDevice::prepareModelFromCache_1_3 כולל באופן מרומז את Priority בארגומנטים של המטמון.

יש הרבה אסטרטגיות אפשריות לתמיכה בעדיפויות, בהתאם ליכולות של מנהל ההתקן והמאיץ. ריכזנו כאן כמה אסטרטגיות:

  • לנהגים שיש להם תמיכה מובנית בעדיפות, אפשר להעביר ישירות את השדה Priority למאיץ.
  • שימוש בתור עדיפויות לכל אפליקציה כדי לתמוך בעדיפויות שונות עוד לפני שהביצוע מגיע למאיץ.
  • כדי לפנות את המאיץ להרצת מודלים בעדיפות גבוהה, צריך להשהות או לבטל מודלים בעדיפות נמוכה שמופעלים. אפשר לעשות את זה על ידי הוספת נקודות עצירה במודלים עם עדיפות נמוכה, שכשהן מושגות, שולחות שאילתה לדגל כדי לקבוע אם צריך לעצור את ההרצה הנוכחית לפני הזמן, או על ידי חלוקת המודל למודלים משניים ושליחת שאילתה לדגל בין הרצות של מודלים משניים. שימו לב: שימוש בנקודות ביקורת או במודלים משניים במודלים שהוכנו עם עדיפות יכול להוסיף תקורה שלא קיימת במודלים ללא עדיפות בגרסאות נמוכות מ-NN HAL 1.3.

    • כדי לתמוך בקדימות, צריך לשמור את הקשר הביצועי, כולל הפעולה או מודל המשנה הבאים שיבוצעו וכל נתוני האופרנד הרלוונטיים של הביניים. אפשר להשתמש בהקשר הביצוע הזה כדי להמשיך את הביצוע במועד מאוחר יותר.
    • אין צורך בתמיכה מלאה בביטול זמני של תהליכים, ולכן אין צורך לשמור את הקשר הביצועי. מכיוון שהרצת מודלים של NNAPI היא דטרמיניסטית, אפשר להפעיל מחדש את ההרצה מאפס בשלב מאוחר יותר.

‫Android מאפשרת לשירותים להבדיל בין אפליקציות שונות לביצוע שיחות באמצעות AID (מזהה UID של Android). ל-HIDL יש מנגנונים מובנים לאחזור ה-UID של האפליקציה שקוראת באמצעות השיטה ::android::hardware::IPCThreadState::getCallingUid. רשימת כתובות ה-AID זמינה בכתובת libcutils/include/cutils/android_filesystem_config.h.

לוח זמנים

החל מ-Android 11, אפשר להפעיל הכנה של מודלים והרצות שלהם באמצעות ארגומנט של OptionalTimePoint תאריך יעד. לנהגים שיכולים להעריך כמה זמן ייקח לבצע משימה, תאריך היעד הזה מאפשר להם לבטל את המשימה לפני שהיא מתחילה אם הם מעריכים שלא ניתן להשלים אותה לפני תאריך היעד. באופן דומה, מועד היעד מאפשר לנהג לבטל משימה שמתבצעת אם הוא מעריך שהיא לא תושלם לפני מועד היעד. הארגומנט deadline לא מאלץ את מנהל ההתקן להפסיק את הפעולה של משימה אם היא לא הושלמה עד לתאריך האחרון או אם התאריך האחרון חלף. אפשר להשתמש בארגומנט deadline כדי לפנות משאבי מחשוב בתוך מנהל ההתקן ולהחזיר את השליטה לאפליקציה מהר יותר מאשר ללא deadline.

הקריאות ל-NN HAL 1.3 שכוללות את OptionalTimePoint תאריכי היעד כארגומנט הן:

  • IDevice::prepareModel_1_3
  • IDevice::prepareModelFromCache_1_3
  • IPreparedModel::execute_1_3
  • IPreparedModel::executeSynchronously_1_3
  • IPreparedModel::executeFenced

כדי לראות יישום לדוגמה של תכונת התאריך האחרון לכל אחת מהשיטות שלמעלה, אפשר לעיין במנהל ההתקנים לדוגמה של NNAPI בכתובת frameworks/ml/nn/driver/sample/SampleDriver.cpp.

קודי שגיאה

‫Android 11 כולל ארבעה ערכים של קודי שגיאה ב-NN HAL 1.3 כדי לשפר את הדיווח על שגיאות, כך שהמנהלי התקנים יכולים להעביר מידע טוב יותר על המצב שלהם והאפליקציות יכולות להתאושש בצורה חלקה יותר. אלה הערכים של קודי השגיאה ב-ErrorStatus.

  • MISSED_DEADLINE_TRANSIENT
  • MISSED_DEADLINE_PERSISTENT
  • RESOURCE_EXHAUSTED_TRANSIENT
  • RESOURCE_EXHAUSTED_PERSISTENT

ב-Android מגרסה 10 ומטה, מנהל התקן יכול לציין כשל רק באמצעות קוד השגיאה GENERAL_FAILURE. מגרסה Android 11, אפשר להשתמש בשני קודי השגיאה MISSED_DEADLINE כדי לציין שעומס העבודה בוטל כי הגיע מועד היעד או כי מנהל ההתקן חזה שעומס העבודה לא יושלם עד מועד היעד. אפשר להשתמש בשני קודי השגיאה RESOURCE_EXHAUSTED כדי לציין שהמשימה נכשלה בגלל מגבלת משאבים בתוך מנהל ההתקן, למשל אם אין למנהל ההתקן מספיק זיכרון לקריאה.

הגרסה TRANSIENT של שתי השגיאות מציינת שהבעיה היא זמנית, ושיכול להיות שקריאות עתידיות לאותה משימה יצליחו אחרי השהיה קצרה. לדוגמה, קוד השגיאה הזה אמור להיות מוחזר כשהדרייבר עסוק בעבודה קודמת ארוכה או בעבודה שדורשת הרבה משאבים, אבל המשימה החדשה תושלם בהצלחה אם הדרייבר לא היה עסוק בעבודה הקודמת. הגרסה PERSISTENT של שתי השגיאות מציינת ששיחות עתידיות לאותה משימה צפויות להיכשל תמיד. לדוגמה, קוד השגיאה הזה אמור להיות מוחזר אם מנהל ההתקן מעריך שהמשימה לא תושלם עד למועד האחרון גם בתנאים מושלמים, או שהמודל גדול מדי באופן מובנה וחורג מהמשאבים של מנהל ההתקן.

אימות

הפונקציונליות של איכות השירות נבדקת בבדיקות NNAPI VTS‏ (VtsHalNeuralnetworksV1_3Target). הבדיקות כוללות קבוצה של בדיקות אימות (TestGenerated/ValidationTest#Test/) כדי לוודא שהדרייבר דוחה עדיפויות לא חוקיות, וקבוצה של בדיקות שנקראות DeadlineTest (TestGenerated/DeadlineTest#Test/) כדי לוודא שהדרייבר מטפל במועדים האחרונים בצורה נכונה.