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

Android 11 से, NNAPI में दो कंट्रोल फ़्लो ऑपरेशन, 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 वैल्यू से ज़्यादा समय लगता है, तो प्रोसेस को रोक दिया जाना चाहिए.

पुष्टि करें

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