Android 11 से, NNAPI में दो कंट्रोल फ़्लो ऑपरेशन शामिल हैं: IF
और WHILE
. ये ऑपरेशन, अन्य मॉडल को आर्ग्युमेंट के तौर पर लेते हैं और उन्हें शर्त के हिसाब से (IF
) या बार-बार (WHILE
) लागू करते हैं. इससे ऐसे मॉडल बनाए जा सकते हैं जो इनपुट वैल्यू के आधार पर अलग-अलग ऑपरेशन लागू करते हैं या बिना अनरोल किए कई बार ऑपरेशन लागू करते हैं. यह डाइनैमिक आरएनएन और seq2seq जैसे इस्तेमाल के उदाहरणों के लिए ज़रूरी है.
NN HAL 1.3 में, मॉडल कई सबग्राफ़ शामिल करता है. इनमें मुख्य सबग्राफ़ भी शामिल है. इसका इस्तेमाल, किसी प्रोसेस के इनपुट और आउटपुट तय करने के लिए किया जाता है. कोई सबग्राफ़, SUBGRAPH
टाइप के ऑपरेंड का इस्तेमाल करके दूसरे सबग्राफ़ को रेफ़रंस कर सकता है. फ़्रेमवर्क, कंट्रोल फ़्लो ऑपरेशन को ऐक्सलरेटर पर सिर्फ़ तब भेज सकता है, जब ऐक्सलरेटर, कंट्रोल फ़्लो ऑपरेशन से रेफ़र किए गए सभी सबग्राफ़ में मौजूद सभी ऑपरेशन के साथ काम करता हो.
एचएएल इंटरफ़ेस
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
वैल्यू (या अगर वैल्यू नहीं दी गई है, तो डिफ़ॉल्ट वैल्यू) से ज़्यादा समय लेता है, तो उसे बंद कर देना चाहिए.
Validation
कंट्रोल फ़्लो टेस्ट, CTS और VTS टेस्ट सुइट का हिस्सा होते हैं. ज़्यादा जानकारी के लिए, पुष्टि करना लेख पढ़ें.