कंट्रोल फ़्लो

Android 11 और उसके बाद के वर्शन में, एनएनएपीआई में दो कंट्रोल फ़्लो ऑपरेशन, IF और WHILE शामिल हैं. ये अन्य मॉडल को आर्ग्युमेंट के तौर पर लेते हैं और उन्हें शर्तों के साथ (IF) या बार-बार (WHILE) एक्ज़ीक्यूट करते हैं. इससे ऐसे मॉडल बनाए जा सकते हैं जो इनपुट वैल्यू के आधार पर अलग-अलग कार्रवाइयां करते हैं या बिना रोल आउट किए कई बार कार्रवाइयां करते हैं. यह डाइनैमिक RNN और seq2seq जैसे इस्तेमाल के उदाहरणों के लिए ज़रूरी है.

NN HAL 1.3 में, मॉडल में कई सबग्राफ़ शामिल किए गए हैं. इनमें मुख्य सबग्राफ़ भी शामिल है, जिसका इस्तेमाल किसी एक्ज़ीक्यूशन के इनपुट और आउटपुट की जानकारी देने के लिए किया जाता है. सबग्राफ़, SUBGRAPH टाइप के ऑपरेंड का इस्तेमाल करके दूसरे सबग्राफ़ का रेफ़रंस दे सकता है. फ़्रेमवर्क, ऐक्सेलरेटर को कंट्रोल फ़्लो ऑपरेशन सिर्फ़ तभी भेज सकता है, जब ऐक्सेलरेटर उस कंट्रोल फ़्लो ऑपरेशन के बताए गए सभी सबग्राफ़ में सभी कार्रवाइयों को सपोर्ट करता हो.

HAL इंटरफ़ेस

NN HAL 1.3 में, कंट्रोल फ़्लो से जुड़ी परिभाषाएं types.hal में दी गई हैं.

  • IF और WHILE ऑपरेशन के टाइप
  • SUBGRAPH ऑपरैंड टाइप और उससे जुड़े SUBGRAPH ऑपरेशन का लाइफ़टाइम
  • Model ऐसा स्ट्रक्चर जिसमें मुख्य सबग्राफ़ और रेफ़र किए गए सबग्राफ़ की सूची शामिल होती है
  • Capabilities ऐसा स्ट्रक्चर जिसमें ifPerformance और whilePerformance शामिल हो

IDevice.hal में IDevice शामिल है, जिसके तरीके getSupportedOperations_1_3() में IF और WHILE को अन्य ऑपरेशन की तुलना में अलग तरीके से मेज़र किया जाना चाहिए.

IPreparedModel.hal में IPreparedModel शामिल है, जिसके तरीके execute_1_3(), executeSynchronously_1_3(), और executeFenced() वैकल्पिक loopTimeoutDuration तर्क को स्वीकार करते हैं.

ड्राइवर को लागू करना

सैंपल ऑपरेशन लागू करने के लिए, CpuExecutor::executeIfOperation और CpuExecutor::executeWhileOperation देखें. सैंपल ऑपरेशन की पुष्टि करने वाले लॉजिक के लिए, validateIfOperation() और validateWhileOperation() देखें.

ध्यान दें कि 1 आकार के TENSOR_INT32 ऑपरेंड के हिसाब से अंकगणित और उनकी तुलना वाली कार्रवाइयों का इस्तेमाल करना ज़रूरी है. ऐसा इसलिए, क्योंकि इनका इस्तेमाल लूप काउंटर के तौर पर किया जा सकता है. इसी तरह, 1 आकार के TENSOR_BOOL8 ऑपरेंड को बनाने वाली कार्रवाइयों का इस्तेमाल, IF और WHILE शर्तों के साथ किया जाना चाहिए.

WHILE लूप एक्ज़ीक्यूशन का समय खत्म हुआ

इनफ़ाइनाइट लूप से बचने के लिए, अगर WHILE लूप IPreparedModel::execute_1_3(), IPreparedModel::executeSynchronously_1_3() या IPreparedModel::executeFenced() (या अगर छूट गया है, तो डिफ़ॉल्ट वैल्यू) को पास की गई loopTimeoutDuration वैल्यू से ज़्यादा समय लेता है, तो एक्ज़ीक्यूशन को रद्द करना ज़रूरी है.

पुष्टि करें

कंट्रोल फ़्लो टेस्ट, सीटीएस और वीटीएस टेस्ट सुइट का हिस्सा हैं. ज़्यादा जानकारी के लिए, पुष्टि करना लेख पढ़ें.