איכות השירות

החל מ-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 כדי לפנות משאבי מחשוב בתוך מנהל ההתקן ולהחזיר את השליטה לאפליקציה מהר יותר מאשר ללא השימוש בארגומנט הזה.

הקריאות ל-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/) כדי לוודא שהדרייבר מטפל במועדים האחרונים בצורה נכונה.