সেবার মান

অ্যান্ড্রয়েড ১১ থেকে, NNAPI একটি অ্যাপকে তার মডেলগুলোর আপেক্ষিক অগ্রাধিকার, একটি নির্দিষ্ট মডেল প্রস্তুত হতে প্রত্যাশিত সর্বোচ্চ সময় এবং একটি নির্দিষ্ট এক্সিকিউশন সম্পন্ন হতে প্রত্যাশিত সর্বোচ্চ সময় নির্দেশ করার সুযোগ দিয়ে উন্নততর কোয়ালিটি অফ সার্ভিস (QoS) প্রদান করে। এছাড়াও, অ্যান্ড্রয়েড ১১ অতিরিক্ত NNAPI এরর ভ্যালু যুক্ত করেছে, যা কোনো ব্যর্থতা ঘটলে কী ভুল হয়েছে তা একটি সার্ভিসকে আরও নির্ভুলভাবে নির্দেশ করতে সক্ষম করে, যাতে ক্লায়েন্ট অ্যাপ আরও ভালোভাবে প্রতিক্রিয়া জানাতে এবং পুনরুদ্ধার করতে পারে।

অগ্রাধিকার

অ্যান্ড্রয়েড ১১ বা তার উচ্চতর সংস্করণের জন্য, মডেলগুলোকে NN HAL 1.3-এ একটি অগ্রাধিকারের ভিত্তিতে প্রস্তুত করা হয়। এই অগ্রাধিকারটি একই অ্যাপের মালিকানাধীন অন্যান্য প্রস্তুতকৃত মডেলগুলোর সাপেক্ষে নির্ধারিত হয়। উচ্চ-অগ্রাধিকারের এক্সিকিউশনগুলো নিম্ন-অগ্রাধিকারের এক্সিকিউশনগুলোর চেয়ে বেশি কম্পিউট রিসোর্স ব্যবহার করতে পারে এবং নিম্ন-অগ্রাধিকারের এক্সিকিউশনগুলোকে প্রি-এম্পট বা স্টারভ করতে পারে।

যে NN HAL 1.3 কলটিতে Priority একটি সুস্পষ্ট আর্গুমেন্ট হিসেবে অন্তর্ভুক্ত থাকে, সেটি হলো IDevice::prepareModel_1_3 । উল্লেখ্য যে, IDevice::prepareModelFromCache_1_3 ক্যাশ আর্গুমেন্টগুলোর মধ্যে Priority পরোক্ষভাবে অন্তর্ভুক্ত করে।

চালক ও অ্যাক্সিলারেটরের সক্ষমতার ওপর নির্ভর করে অগ্রাধিকারগুলোকে সমর্থন করার জন্য অনেক সম্ভাব্য কৌশল রয়েছে। নিচে কয়েকটি কৌশল উল্লেখ করা হলো:

  • যেসব ড্রাইভারে বিল্ট-ইন প্রায়োরিটি সাপোর্ট রয়েছে, সেগুলোর ক্ষেত্রে Priority ফিল্ডটি সরাসরি অ্যাক্সিলারেটরে পাঠিয়ে দিন।
  • কোনো এক্সিকিউশন অ্যাক্সিলারেটরে পৌঁছানোর আগেও বিভিন্ন প্রায়োরিটি সমর্থন করার জন্য প্রতিটি অ্যাপের জন্য একটি প্রায়োরিটি কিউ ব্যবহার করুন।
  • উচ্চ-অগ্রাধিকারের মডেলগুলি চালানোর জন্য অ্যাক্সিলারেটরকে মুক্ত করতে, বর্তমানে চলমান নিম্ন-অগ্রাধিকারের মডেলগুলিকে থামান বা বাতিল করুন। এটি করার জন্য, হয় নিম্ন-অগ্রাধিকারের মডেলগুলিতে চেকপয়েন্ট যুক্ত করুন, যেগুলিতে পৌঁছালে বর্তমান এক্সিকিউশনটি নির্ধারিত সময়ের আগেই থামানো উচিত কিনা তা নির্ধারণ করতে একটি ফ্ল্যাগ কোয়েরি করা হয়; অথবা মডেলটিকে সাবমডেলে বিভক্ত করে প্রতিটি সাবমডেল এক্সিকিউশনের মাঝে ফ্ল্যাগটি কোয়েরি করুন। উল্লেখ্য যে, NN HAL 1.3-এর পূর্ববর্তী সংস্করণগুলিতে, অগ্রাধিকারসহ প্রস্তুত করা মডেলগুলিতে চেকপয়েন্ট বা সাবমডেলের ব্যবহার অতিরিক্ত ওভারহেড তৈরি করতে পারে, যা অগ্রাধিকারবিহীন মডেলগুলিতে থাকে না।

    • প্রিএম্পশন সমর্থন করার জন্য, এক্সিকিউশন কনটেক্সট সংরক্ষণ করুন, যার মধ্যে পরবর্তী সম্পাদিতব্য অপারেশন বা সাব-মডেল এবং যেকোনো প্রাসঙ্গিক অন্তর্বর্তী অপারেন্ড ডেটা অন্তর্ভুক্ত থাকবে। পরবর্তীতে এক্সিকিউশন পুনরায় শুরু করতে এই এক্সিকিউশন কনটেক্সট ব্যবহার করুন।
    • সম্পূর্ণ প্রিএম্পশন সাপোর্টের প্রয়োজন নেই, তাই এক্সিকিউশন কনটেক্সট সংরক্ষণ করার দরকার পড়ে না। যেহেতু NNAPI মডেল এক্সিকিউশনগুলো ডিটারমিনিস্টিক, তাই পরবর্তীতে যেকোনো সময় এক্সিকিউশনগুলো একেবারে গোড়া থেকে পুনরায় শুরু করা যেতে পারে।

অ্যান্ড্রয়েড একটি AID (অ্যান্ড্রয়েড UID) ব্যবহারের মাধ্যমে বিভিন্ন কলিং অ্যাপের মধ্যে পার্থক্য করতে পরিষেবাগুলিকে সক্ষম করে। HIDL-এর মধ্যে ::android::hardware::IPCThreadState::getCallingUid পদ্ধতির মাধ্যমে কলিং অ্যাপের UID পুনরুদ্ধার করার জন্য অন্তর্নির্মিত ব্যবস্থা রয়েছে। AID-গুলির একটি তালিকা libcutils/include/cutils/android_filesystem_config.h ফাইলে পাওয়া যাবে।

সময়সীমা

অ্যান্ড্রয়েড ১১ থেকে, মডেল প্রস্তুতি এবং এক্সিকিউশন একটি OptionalTimePoint ডেডলাইন আর্গুমেন্টের মাধ্যমে চালু করা যায়। যে ড্রাইভারগুলো কোনো কাজ শেষ হতে কতক্ষণ সময় লাগবে তা অনুমান করতে পারে, তাদের ক্ষেত্রে এই ডেডলাইনটি কাজটি শুরু হওয়ার আগেই বাতিল করার সুযোগ দেয়, যদি ড্রাইভারের অনুমান অনুযায়ী কাজটি নির্দিষ্ট সময়ের মধ্যে শেষ করা সম্ভব না হয়। একইভাবে, এই ডেডলাইনটি ড্রাইভারকে চলমান কোনো কাজও বাতিল করার সুযোগ দেয়, যদি ড্রাইভারের অনুমান অনুযায়ী কাজটি নির্দিষ্ট সময়ের আগে শেষ না হয়। কাজটি নির্দিষ্ট সময়ের মধ্যে শেষ না হলে বা ডেডলাইন পার হয়ে গেলেও, ডেডলাইন আর্গুমেন্টটি ড্রাইভারকে কাজটি বাতিল করতে বাধ্য করে না। ডেডলাইন আর্গুমেন্টটি ব্যবহার করে ড্রাইভারের ভেতরের কম্পিউট রিসোর্স খালি করা যায় এবং ডেডলাইন ছাড়া যা সম্ভব তার চেয়ে দ্রুত অ্যাপে নিয়ন্ত্রণ ফিরিয়ে দেওয়া যায়।

NN HAL 1.3-এর যে কলগুলোতে আর্গুমেন্ট হিসেবে OptionalTimePoint ডেডলাইন অন্তর্ভুক্ত থাকে, সেগুলো হলো:

  • IDevice::prepareModel_1_3
  • IDevice::prepareModelFromCache_1_3
  • IPreparedModel::execute_1_3
  • IPreparedModel::executeSynchronously_1_3
  • IPreparedModel::executeFenced

উপরোক্ত প্রতিটি মেথডের ডেডলাইন ফিচারের একটি রেফারেন্স ইমপ্লিমেন্টেশন দেখতে, frameworks/ml/nn/driver/sample/SampleDriver.cpp ঠিকানায় অবস্থিত NNAPI স্যাম্পল ড্রাইভারটি দেখুন।

ত্রুটি কোড

এরর রিপোর্টিং উন্নত করার জন্য অ্যান্ড্রয়েড ১১-এর NN HAL 1.3-এ চারটি এরর কোড ভ্যালু অন্তর্ভুক্ত করা হয়েছে, যা ড্রাইভারদের তাদের অবস্থা আরও ভালোভাবে জানাতে এবং অ্যাপগুলোকে আরও সাবলীলভাবে পুনরুদ্ধার করতে সাহায্য করে। এগুলোই হলো ErrorStatus এর এরর কোড ভ্যালুগুলো।

  • MISSED_DEADLINE_TRANSIENT
  • MISSED_DEADLINE_PERSISTENT
  • RESOURCE_EXHAUSTED_TRANSIENT
  • RESOURCE_EXHAUSTED_PERSISTENT

অ্যান্ড্রয়েড ১০ বা তার নিচের সংস্করণগুলোতে, একটি ড্রাইভার শুধুমাত্র GENERAL_FAILURE এরর কোডের মাধ্যমে ব্যর্থতা নির্দেশ করতে পারত। অ্যান্ড্রয়েড ১১ থেকে, দুটি MISSED_DEADLINE এরর কোড ব্যবহার করে বোঝানো যায় যে, ডেডলাইন শেষ হয়ে যাওয়ায় অথবা ড্রাইভারের পূর্বাভাস অনুযায়ী কাজটি ডেডলাইনের মধ্যে সম্পন্ন হবে না বলে বাতিল করা হয়েছে। দুটি RESOURCE_EXHAUSTED এরর কোড ব্যবহার করে বোঝানো যায় যে, ড্রাইভারের অভ্যন্তরীণ রিসোর্স সীমাবদ্ধতার কারণে কাজটি ব্যর্থ হয়েছে, যেমন—কলটির জন্য ড্রাইভারের কাছে পর্যাপ্ত মেমরি না থাকা।

উভয় এররের TRANSIENT সংস্করণটি নির্দেশ করে যে সমস্যাটি অস্থায়ী, এবং অল্প বিলম্বের পর একই টাস্কে ভবিষ্যতের কলগুলো সফল হতে পারে। উদাহরণস্বরূপ, এই এরর কোডটি তখন ফেরত আসা উচিত যখন ড্রাইভারটি পূর্বের দীর্ঘ-চলমান বা রিসোর্স-নিবিড় কাজে ব্যস্ত থাকে, কিন্তু ড্রাইভারটি যদি পূর্বের কাজে ব্যস্ত না থাকত তবে নতুন টাস্কটি সফলভাবে সম্পন্ন হতো। উভয় এররের PERSISTENT সংস্করণটি নির্দেশ করে যে একই টাস্কে ভবিষ্যতের কলগুলো সর্বদা ব্যর্থ হবে বলে আশা করা যায়। উদাহরণস্বরূপ, এই এরর কোডটি তখন ফেরত আসা উচিত যখন ড্রাইভার অনুমান করে যে নিখুঁত পরিস্থিতিতেও টাস্কটি নির্দিষ্ট সময়সীমার মধ্যে সম্পন্ন হবে না, অথবা মডেলটি স্বভাবতই অনেক বড় এবং ড্রাইভারের রিসোর্সকে ছাড়িয়ে যায়।

বৈধতা

NNAPI VTS টেস্ট ( VtsHalNeuralnetworksV1_3Target )-এর মাধ্যমে কোয়ালিটি অফ সার্ভিস কার্যকারিতা পরীক্ষা করা হয়। এর মধ্যে রয়েছে ভ্যালিডেশনের জন্য এক সেট টেস্ট ( TestGenerated/ValidationTest#Test/ ), যা নিশ্চিত করে যে ড্রাইভারটি অবৈধ প্রায়োরিটি প্রত্যাখ্যান করে এবং DeadlineTest ( TestGenerated/DeadlineTest#Test/ ) নামক এক সেট টেস্ট, যা নিশ্চিত করে যে ড্রাইভারটি ডেডলাইন সঠিকভাবে পরিচালনা করে।