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 टेस्ट सुइट का हिस्सा हैं. ज़्यादा जानकारी के लिए, पुष्टि करना लेख पढ़ें.