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

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