LiterRT অ্যাক্সিলারেটর টেস্ট স্যুট (ATS)

LiterRT অ্যাক্সিলারেটর টেস্ট স্যুট (ATS) হল একটি বিস্তৃত টুল যা কার্যকরী সঠিকতা যাচাই করতে এবং LiterRT ফ্রেমওয়ার্কের সাথে একীভূত কাস্টম অ্যাক্সিলারেটর বাস্তবায়নের কর্মক্ষমতা পরিমাপ করতে ব্যবহৃত হয়।

সংক্ষিপ্ত বিবরণ এবং মূল কার্যকারিতা

ATS-এর প্রাথমিক কাজ হল একটি টার্গেট অ্যাক্সিলারেটরের বিরুদ্ধে পূর্বনির্ধারিত মেশিন লার্নিং মডেলগুলি কার্যকর করা এবং LiterRT স্ট্যান্ডার্ড CPU ব্যাকএন্ডের সাথে ফলাফলের তুলনা করা।

  • যাচাইকরণ: স্যুটটি অ্যাক্সিলারেটর দ্বারা উৎপাদিত আউটপুট টেনসর (অ্যাক্টিভেশন) এবং পরিচিত-ভাল CPU ব্যাকএন্ড দ্বারা উৎপাদিত আউটপুট টেনসর (অ্যাক্টিভেশন) তুলনা করে সংখ্যাসূচক যাচাইকরণ সম্পাদন করে। এটি নিশ্চিত করে যে অ্যাক্সিলারেটর বাস্তবায়ন প্রয়োজনীয় নির্ভুলতা এবং সঠিকতা বজায় রাখে।
  • পারফরম্যান্স মেট্রিক্স: এটি স্বয়ংক্রিয়ভাবে গুরুত্বপূর্ণ পারফরম্যান্স বিবরণ ক্যাপচার এবং রেকর্ড করে, যার মধ্যে রয়েছে ল্যাটেন্সি এবং অন্যান্য প্রাসঙ্গিক মেট্রিক্স, যা ব্যবহারকারীর জন্য উপলব্ধ করা হয়।
  • সম্পাদন: পরীক্ষাগুলি সাধারণত একটি লক্ষ্য ডিভাইসে (যেমন, একটি অ্যান্ড্রয়েড ফোন) সম্পাদিত হয় এবং একটি শেল স্ক্রিপ্ট র‍্যাপার দ্বারা পরিচালিত হয় যা adb (অ্যান্ড্রয়েড ডিবাগ ব্রিজ) টুল ব্যবহার করে ফাইল স্থানান্তর এবং সেটআপ পরিচালনা করে।

পরীক্ষার তথ্য (মডেল)

ATS স্যুটটি তার পরীক্ষার তথ্য হিসেবে বহুল ব্যবহৃত .tflite মডেলের একটি সংগ্রহ ব্যবহার করে। ইনপুট তথ্য ডেটা ধরণের উপর ভিত্তি করে এলোমেলোভাবে তৈরি করা হয় এবং প্রয়োজন অনুসারে সিড করা যেতে পারে।

অন্তর্ভুক্ত মডেল

নিম্নলিখিত মডেলগুলি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করা হয় এবং পরীক্ষার জন্য ডাউনলোড করা হয় (পরিবর্তন সাপেক্ষে):

  • hf_all_minilm_l6_v2
  • hf_mobilevit_small
  • qai_hub_midas
  • qai_hub_real_esrgan_x4plus
  • torchvision_mobilenet_v2
  • torchvision_resnet18
  • torchvision_squeezenet1_1
  • u2net_lite
  • whisper_tiny_decoder
  • whisper_tiny_encoder
  • yamnet
  • yolo11n

ম্যানুয়াল মডেল পুনরুদ্ধার

bazel run সময় মডেলগুলি স্বয়ংক্রিয়ভাবে ডাউনলোড হয়ে গেলেও, আপনি wget ব্যবহার করে সম্পূর্ণ মডেল সেটটি ম্যানুয়ালি পুনরুদ্ধার করতে পারেন:

wget -p -O <target_file> https://storage.googleapis.com/litert/ats_models.tar.gz

ব্যাজেল দিয়ে একটি ATS স্যুট সংজ্ঞায়িত করা

তাদের অ্যাক্সিলারেটরের জন্য নির্দিষ্ট একটি ATS টেস্টিং টার্গেট কনফিগার এবং সংজ্ঞায়িত করতে litert_define_ats Bazel ম্যাক্রো ব্যবহার করুন।

ম্যাক্রো স্বয়ংক্রিয়ভাবে দুটি রানযোগ্য লক্ষ্য তৈরি করে:

  1. স্ট্যান্ডার্ড অন-ডিভাইস JIT পরীক্ষা (কার্যকরন এবং বৈধতার জন্য)।
  2. একটি ডেডিকেটেড AOT "শুধুমাত্র কম্পাইল" মোড পরীক্ষা (হোস্ট কম্পাইলেশনের জন্য)।

উদাহরণ litert_define_ats ব্যবহার

উদাহরণটি ব্যাকএন্ড নামের example সহ একটি অ্যাক্সিলারেটরের জন্য example_ats নামের একটি ATS স্যুটকে সংজ্ঞায়িত করে:

# Emits aot-mode and jit-mode test targets, one for running compilation test on host
# and another for running JIT and inference on device
# These targets are named with their respective suffix attribute.
litert_define_ats(
    name = "example_ats",
    backend = "example",
    compile_only_suffix = "_aot",
    do_register = [
        "*mobilenet*",
    ],
    extra_flags = ["--limit=1"],
    jit_suffix = "",
)

মৃত্যুদন্ড

অ্যান্ড্রয়েডের জন্য লক্ষ্যযুক্ত স্ট্যান্ডার্ড পরীক্ষাটি কার্যকর করতে (যা সমস্ত adb ক্রিয়াকলাপ পরিচালনা করে):

# Handles environment setup, and build + push of library and data dependencies to the device,
# executes the suite on the target.
bazel run -c opt --config=android_arm64 :example_ats

AOT সংকলন পরীক্ষা চালানোর জন্য:

# Handle environment setup, and builds library dependencies for host platform.
# Executes the ats compile only flow. The "--compile_mode" flag is already
# bound to the program arguments.
bazel run :example_ats_aot

লিনাক্স এক্সিকিউশন (হোস্ট)

লিনাক্স এক্সিকিউশনের জন্য, যেখানে ATS একই মেশিনে বিল্ড করা হচ্ছে, ব্যবহারকারীদের সরাসরি :ats বাইনারি ব্যবহার করতে হবে:

bazel run -c opt :ats

আইওটি এক্সিকিউশন

IoT কার্যকর করার জন্য, ব্যবহারকারীদের হোস্টে বাইনারি তৈরি করতে হবে এবং ম্যানুয়ালি এটি তাদের ডিভাইসে পুশ করতে হবে।

কমান্ড-লাইন পতাকা

ats এক্সিকিউটেবল পরীক্ষা এবং রিপোর্টিংয়ের উপর গ্রানুলার নিয়ন্ত্রণের জন্য বেশ কয়েকটি পতাকা গ্রহণ করে।

পতাকা আদর্শ বিবরণ
--backend std::string প্রয়োজন। পরীক্ষার অধীনে অ্যাক্সিলারেটর হিসেবে কোন LiterRT ব্যাকএন্ড ব্যবহার করতে হবে ("প্রকৃত")। বিকল্পগুলি হল cpu , npu , অথবা gpu .
--compile_mode bool যদি সত্য হয়, তাহলে ডিভাইসে এক্সিকিউশনের পরিবর্তে ওয়ার্কস্টেশনে AOT কম্পাইলেশন ধাপটি চালায়। দ্রষ্টব্য: এই বিকল্পটি স্বয়ংক্রিয়ভাবে "aot" বিল্ড টার্গেটের সাথে আবদ্ধ হয় এবং স্পষ্টভাবে সেট করার প্রয়োজন হয় না।
--models_out std::string ডিরেক্টরি পাথ যেখানে পার্শ্ব-প্রতিক্রিয়া সিরিয়ালাইজড (সংকলিত) মডেলগুলি সংরক্ষণ করা হয়। শুধুমাত্র AOT বা JIT সংকলনের জন্য প্রাসঙ্গিক।
--dispatch_dir std::string অ্যাক্সিলারেটরের ডিসপ্যাচ লাইব্রেরি ধারণকারী ডিরেক্টরির পথ (NPU-এর জন্য প্রাসঙ্গিক)।
--plugin_dir std::string অ্যাক্সিলারেটরের কম্পাইলার প্লাগইন লাইব্রেরি ধারণকারী ডিরেক্টরির পথ (NPU-এর জন্য প্রাসঙ্গিক)।
--soc_manufacturer std::string AOT সংকলনের জন্য লক্ষ্যবস্তু SOC প্রস্তুতকারক (NPU সংকলনের জন্য প্রাসঙ্গিক)।
--soc_model std::string AOT সংকলনের জন্য লক্ষ্যবস্তু SOC মডেল (NPU সংকলনের জন্য প্রাসঙ্গিক)।
--iters_per_test size_t প্রতিটি পরীক্ষায় চালানোর জন্য পুনরাবৃত্তির সংখ্যা, প্রতিটিতে আলাদা আলাদা র‍্যান্ডমাইজড টেনসর ডেটা থাকবে।
--max_ms_per_test int64_t টাইমআউটের আগে প্রতিটি পরীক্ষা চালানোর সর্বোচ্চ সময় মিলিসেকেন্ডে।
--fail_on_timeout bool এক্সিকিউশনের সময়সীমা শেষ হলে পরীক্ষাটি ব্যর্থ হবে কিনা।
--csv std::string বিস্তারিত প্রতিবেদনটি CSV ফর্ম্যাটে সংরক্ষণ করার জন্য ফাইল পাথ।
--dump_report bool সম্পূর্ণ রিপোর্টের বিবরণ সরাসরি ব্যবহারকারীর কনসোল আউটপুটে ডাম্প করা হবে কিনা।
--data_seed std::ঐচ্ছিক<int> বিশ্বব্যাপী তথ্য উৎপাদনের জন্য একটি একক বীজ।
--do_register std::vector<std::string> নির্দিষ্ট পরীক্ষাগুলি স্পষ্টভাবে অন্তর্ভুক্ত করার জন্য রেজেক্স (গুলি) (যেমন, *mobilenet* )।
--dont_register std::vector<std::string> নির্দিষ্ট পরীক্ষা বাদ দেওয়ার জন্য regex(es)।
--extra_models std::vector<std::string> টেস্ট স্যুটে যোগ করার জন্য ডিরেক্টরি বা মডেল ফাইলের ঐচ্ছিক তালিকা।
--limit int32_t নিবন্ধিত এবং পরিচালিত মোট পরীক্ষার সংখ্যা সীমিত করুন।
--quiet bool পরীক্ষা চালানোর সময় লগিং আউটপুট কমিয়ে দিন।

ATS-এর জন্য litert_device_script বিল্ড ইউটিলিটি ব্যবহার করা

The ATS targets users execute automatically include a shell entry point which handles all of the environment setup, and any pushing of required libraries when the target device differs from the host on which the build was completed (eg adb push ).

এই কার্যকারিতাটি সাধারণভাবে litert_device_script ইউটিলিটিগুলির মাধ্যমে প্রদান করা হয় যা ATS বিল্ডগুলি হুডের নীচে ব্যবহার করে। এই বিল্ড কার্যকারিতা অ্যাক্সেস করার জন্য একটি নিবন্ধন প্রক্রিয়া অ্যাক্সিলারেটরদের করতে হবে। ats সমর্থন করার পাশাপাশি, এই ইউটিলিটিগুলি cc_binary এবং cc_test সিমুলেট করার জন্য একটি স্বতন্ত্র পদ্ধতিতে ব্যবহার করা যেতে পারে যা বিল্ড হোস্ট থেকে ভিন্ন একটি ডিভাইসে চালানো হবে যার জন্য পুশ করা নির্ভরতা প্রয়োজন।

ব্যাকএন্ড নিবন্ধন

litert_device_script (এবং তাই ATS) ব্যবহার করার জন্য একটি নতুন অ্যাক্সিলারেটর সক্ষম করতে, এর প্রয়োজনীয় লাইব্রেরিগুলি litert_device_common.bzl Bazel ফাইলে নিবন্ধিত হতে হবে। নিবন্ধন একটি অনন্য "ব্যাকএন্ড" নামের উপর ভিত্তি করে করা হয় যা LiteRT-এর জন্য সেই অ্যাক্সিলারেটরের সাথে কাজ করার জন্য প্রয়োজনীয় বিল্ডেবল বা প্রাক-সংকলিত লাইব্রেরির একটি সেটের সাথে ম্যাপ করে।

নিবন্ধনের ধাপ

  1. একটি BackendSpec ফাংশন সংজ্ঞায়িত করুন: এমন একটি ফাংশন তৈরি করুন যা আপনার নতুন অ্যাক্সিলারেটরের স্পেসিফিকেশন ধারণকারী একটি অভিধান প্রদান করে।

  2. লাইব্রেরি নির্দিষ্ট করুন ( libs ): এটি ভাগ করা লাইব্রেরির জন্য Bazel টার্গেট পাথ এবং ডিভাইস লিঙ্কার এটি খুঁজে পেতে প্রয়োজনীয় পরিবেশ পরিবর্তনশীল ( LD_LIBRARY_PATH ) এর বিশদ বিবরণ দেয় এমন টিপলের একটি তালিকা।

    • ডিসপ্যাচ লাইব্রেরি: রানটাইম এক্সিকিউশনের জন্য প্রয়োজনীয়।
    • কম্পাইলার প্লাগইন লাইব্রেরি: AOT কম্পাইলেশন মোডের জন্য প্রয়োজনীয়।
  3. লাইব্রেরির নাম উল্লেখ করুন ( plugin , dispatch ): প্লাগইন এবং ডিসপ্যাচ লাইব্রেরির ফাইলের নাম প্রদান করুন।

  4. Spec নিবন্ধন করুন: আপনার নতুন spec ফাংশনটিকে মূল _Specs ফাংশনের সাথে মার্জ করুন যাতে এটি তার অনন্য ব্যাকএন্ড আইডি দ্বারা উপলব্ধ হয়।

উদাহরণ নিবন্ধন ( _ExampleSpec )

litert_device_common.bzl থেকে নিম্নলিখিত কোডটি "উদাহরণ" অ্যাক্সিলারেটর কীভাবে নিবন্ধিত হয় তা ব্যাখ্যা করে:

def _ExampleSpec():
    return {
        # The unique backend ID
        "example": BackendSpec(
            id = "example",
            libs = [
                # Dispatch Library and how to find it on device
                ("//third_party/odml/litert/litert/vendors/examples:libLiteRtDispatch_Example.so", "LD_LIBRARY_PATH"),
                # Compiler Plugin Library
                ("//third_party/odml/litert/litert/vendors/examples:libLiteRtCompilerPlugin_Example.so", "LD_LIBRARY_PATH"),
            ],
            plugin = "libLiteRtCompilerPlugin_Example.so",
            dispatch = "libLiteRtDispatch_Example.so",
        ),
    }

# ... (Other specs are defined here)

def _Specs(name):
    # Your new spec function must be included here
    return (_QualcommSpec() | _GoogleTensorSpec() | _MediatekSpec() | _CpuSpec() | _GpuSpec() | _ExampleSpec())[name]

litert_device_exec এর সাথে নিবন্ধনের সুবিধা গ্রহণ করা

নিবন্ধিত হয়ে গেলে, নতুন backend_id সাথে litert_device_exec এবং সম্পর্কিত ম্যাক্রো ব্যবহার করুন। এই ম্যাক্রো স্বয়ংক্রিয়ভাবে প্রয়োজনীয় লাইব্রেরি এবং যেকোনো নির্দিষ্ট ডেটা ফাইলকে টার্গেট বাইনারি দিয়ে একত্রিত করে।

cc_binary(
    name = "example_bin",
    srcs = ["example_bin.cc"],
)

litert_device_exec(
    name = "example_bin_device",
    backend_id = "example",  # Uses the libraries registered under "example"
    data = [
        "//third_party/odml/litert/litert/test:testdata/constant_output_tensor.tflite",
    ],
    target = ":example_bin",
)

এই টার্গেটটি ( bazel run ... :example_bin_device ) চালানো হলে:

  1. example_bin C++ বাইনারি তৈরি করুন।
  2. বাইনারি, libLiteRtDispatch_Example.so , libLiteRtCompilerPlugin_Example.so , এবং .tflite ফাইলটি ডিভাইসে পুশ করুন।
  3. adb shell ব্যবহার করে বাইনারিটি কার্যকর করুন।

ডিভাইস পাথ সম্পর্কে দ্রষ্টব্য: ডিভাইসে ফাইলগুলির ক্যানোনিকাল অবস্থানটি ব্যাজেলের রানফাইল ট্রি, বিশেষ করে /data/local/tmp/runfiles/runfiles_relative_path প্রতিফলন ঘটায়। ডিভাইস স্ক্রিপ্ট স্বয়ংক্রিয়ভাবে ডায়নামিক লিঙ্কারের জন্য উপযুক্ত পাথ সেট করার কাজ পরিচালনা করে।

সংকলন মোড (AOT)

যেসব অ্যাক্সিলারেটর Ahead-of-Time (AOT) কম্পাইলেশন ধাপ সমর্থন করে, তাদের জন্য ATS একটি ডেডিকেটেড "কম্পাইল মোডে" কার্যকর করা যেতে পারে।

  • উদ্দেশ্য: এই মোডটি টার্গেট ডিভাইসে নয়, একটি ওয়ার্কস্টেশনে (হোস্ট মেশিন) চালানোর জন্য ডিজাইন করা হয়েছে। এটি নির্দিষ্ট টার্গেট হার্ডওয়্যারের জন্য মডেলগুলিকে কার্যকর না করেই কম্পাইল করে।
  • আউটপুট: সমস্ত সংকলিত মডেল ওয়ার্কস্টেশনের একটি নির্দিষ্ট ডিরেক্টরিতে আউটপুট হয়।
  • সক্রিয়করণ: ATS বিল্ড ম্যাক্রোগুলি aot-এর জন্য একটি নির্দিষ্ট লক্ষ্য নির্গত করবে যেখানে হোস্ট প্ল্যাটফর্মের জন্য লাইব্রেরি তৈরি করা হয়। এই প্রবাহটি --compile_mode ফ্ল্যাগ সহ যেকোনো বাইনারিতে সক্রিয় করা যেতে পারে, তবে এটি স্বয়ংক্রিয়ভাবে aot বিল্ডের আর্গুমেন্টের সাথে আবদ্ধ হয়।

ভবিষ্যৎ সম্প্রসারণ

সম্পূর্ণ মডেলের পাশাপাশি একক অপারেশন (অপস) এর জন্য ডেডিকেটেড পরীক্ষা অন্তর্ভুক্ত করার জন্য স্যুটটি সম্প্রসারণের পরিকল্পনা করা হয়েছে।