কর্মক্ষমতা পরিমাপ

বেঞ্চমার্ক টুল

LiteRT বেঞ্চমার্ক সরঞ্জামগুলি বর্তমানে নিম্নলিখিত গুরুত্বপূর্ণ কর্মক্ষমতা মেট্রিক্সের পরিসংখ্যান পরিমাপ করে এবং গণনা করে:

  • প্রারম্ভিক সময়
  • ওয়ার্মআপ অবস্থার অনুমান সময়
  • স্থির অবস্থার অনুমান সময়
  • প্রারম্ভিক সময় মেমরি ব্যবহার
  • সামগ্রিক মেমরি ব্যবহার

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

অ্যান্ড্রয়েড বেঞ্চমার্ক অ্যাপ

অ্যান্ড্রয়েডের সাথে বেঞ্চমার্ক টুল ব্যবহার করার দুটি বিকল্প রয়েছে। একটি হল একটি নেটিভ বেঞ্চমার্ক বাইনারি এবং আরেকটি হল একটি অ্যান্ড্রয়েড বেঞ্চমার্ক অ্যাপ, অ্যাপটিতে মডেলটি কীভাবে পারফর্ম করবে তার একটি ভাল পরিমাপ। যেভাবেই হোক, প্রকৃত অ্যাপে মডেলের সাথে অনুমান চালানোর সময় বেঞ্চমার্ক টুলের সংখ্যাগুলি এখনও কিছুটা আলাদা হবে।

এই অ্যান্ড্রয়েড বেঞ্চমার্ক অ্যাপটির কোনো UI নেই। adb কমান্ড ব্যবহার করে এটি ইনস্টল করুন এবং চালান এবং adb logcat কমান্ড ব্যবহার করে ফলাফল পুনরুদ্ধার করুন।

অ্যাপটি ডাউনলোড বা তৈরি করুন

নীচের লিঙ্কগুলি ব্যবহার করে রাতের জন্য প্রি-বিল্ট অ্যান্ড্রয়েড বেঞ্চমার্ক অ্যাপগুলি ডাউনলোড করুন:

ফ্লেক্স প্রতিনিধির মাধ্যমে TF অপ্স সমর্থন করে এমন অ্যান্ড্রয়েড বেঞ্চমার্ক অ্যাপগুলির জন্য, নীচের লিঙ্কগুলি ব্যবহার করুন:

আপনি এই নির্দেশাবলী অনুসরণ করে উত্স থেকে অ্যাপটি তৈরি করতে পারেন।

বেঞ্চমার্ক প্রস্তুত করুন

বেঞ্চমার্ক অ্যাপটি চালানোর আগে, অ্যাপটি ইনস্টল করুন এবং মডেল ফাইলটিকে ডিভাইসে নিম্নরূপ পুশ করুন:

adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp

বেঞ্চমার্ক চালান

adb shell am start -S \
  -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
  --es args '"--graph=/data/local/tmp/your_model.tflite \
              --num_threads=4"'

graph একটি প্রয়োজনীয় পরামিতি।

  • graph : string
    TFLite মডেল ফাইলের পথ।

বেঞ্চমার্ক চালানোর জন্য আপনি আরও ঐচ্ছিক পরামিতি নির্দিষ্ট করতে পারেন।

  • num_threads : int (ডিফল্ট=1)
    TFLite ইন্টারপ্রেটার চালানোর জন্য থ্রেডের সংখ্যা।
  • use_gpu : bool (ডিফল্ট = মিথ্যা)
    GPU প্রতিনিধি ব্যবহার করুন।
  • use_xnnpack : bool (ডিফল্ট = false )
    XNNPACK প্রতিনিধি ব্যবহার করুন।

আপনি যে ডিভাইসটি ব্যবহার করছেন তার উপর নির্ভর করে, এই বিকল্পগুলির মধ্যে কিছু উপলব্ধ নাও হতে পারে বা কোন প্রভাব নেই৷ আপনি বেঞ্চমার্ক অ্যাপের সাথে চালাতে পারেন এমন আরও পারফরম্যান্স প্যারামিটারের জন্য প্যারামিটারগুলি পড়ুন।

logcat কমান্ড ব্যবহার করে ফলাফল দেখুন:

adb logcat | grep "Inference timings"

বেঞ্চমার্ক ফলাফল হিসাবে রিপোর্ট করা হয়:

... tflite  : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

নেটিভ বেঞ্চমার্ক বাইনারি

বেঞ্চমার্ক টুলটি একটি নেটিভ বাইনারি benchmark_model হিসাবেও প্রদান করা হয়। আপনি লিনাক্স, ম্যাক, এমবেডেড ডিভাইস এবং অ্যান্ড্রয়েড ডিভাইসে শেল কমান্ড লাইন থেকে এই টুলটি চালাতে পারেন।

ডাউনলোড করুন বা বাইনারি তৈরি করুন

নীচের লিঙ্কগুলি অনুসরণ করে রাতের পূর্ব-নির্মিত নেটিভ কমান্ড-লাইন বাইনারিগুলি ডাউনলোড করুন:

রাত্রিকালীন পূর্ব-নির্মিত বাইনারিগুলির জন্য যা ফ্লেক্স প্রতিনিধির মাধ্যমে TF অপ্স সমর্থন করে, নীচের লিঙ্কগুলি ব্যবহার করুন:

আপনি আপনার কম্পিউটারে উত্স থেকে নেটিভ বেঞ্চমার্ক বাইনারি তৈরি করতে পারেন।

bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model

অ্যান্ড্রয়েড এনডিকে টুলচেন দিয়ে তৈরি করতে, আপনাকে প্রথমে এই নির্দেশিকা অনুসরণ করে বিল্ড এনভায়রনমেন্ট সেট আপ করতে হবে, অথবা এই গাইডে বর্ণিত ডকার ইমেজটি ব্যবহার করতে হবে।

bazel build -c opt --config=android_arm64 \
  //tensorflow/lite/tools/benchmark:benchmark_model

বেঞ্চমার্ক চালান

আপনার কম্পিউটারে বেঞ্চমার্ক চালানোর জন্য, শেল থেকে বাইনারি চালান।

path/to/downloaded_or_built/benchmark_model \
  --graph=your_model.tflite \
  --num_threads=4

আপনি নেটিভ কমান্ড-লাইন বাইনারি দিয়ে উপরে উল্লিখিত পরামিতিগুলির একই সেট ব্যবহার করতে পারেন।

প্রোফাইলিং মডেল অপারেশন

বেঞ্চমার্ক মডেল বাইনারি আপনাকে মডেল অপ্স প্রোফাইল করতে এবং প্রতিটি অপারেটরের কার্যকর করার সময় পেতে দেয়। এটি করার জন্য, আহ্বানের সময় ফ্ল্যাগ --enable_op_profiling=true benchmark_model পাস করুন। বিস্তারিত এখানে ব্যাখ্যা করা হয়.

একক রানে একাধিক কর্মক্ষমতা বিকল্পের জন্য নেটিভ বেঞ্চমার্ক বাইনারি

একটি সুবিধাজনক এবং সহজ C++ বাইনারি একটি একক রানে একাধিক কর্মক্ষমতা বিকল্পকে বেঞ্চমার্ক করার জন্য প্রদান করা হয়। এই বাইনারিটি উপরে উল্লিখিত বেঞ্চমার্ক টুলের উপর ভিত্তি করে তৈরি করা হয়েছে যা একটি সময়ে শুধুমাত্র একটি একক পারফরম্যান্স বিকল্পকে বেঞ্চমার্ক করতে পারে। তারা একই বিল্ড/ইনস্টল/চালানোর প্রক্রিয়া শেয়ার করে, কিন্তু এই বাইনারিটির BUILD টার্গেট নাম হল benchmark_model_performance_options এবং এতে কিছু অতিরিক্ত প্যারামিটার লাগে। এই বাইনারি জন্য একটি গুরুত্বপূর্ণ পরামিতি হল:

perf_options_list : string (ডিফল্ট = 'সব')
বেঞ্চমার্কের জন্য TFLite পারফরম্যান্স বিকল্পগুলির একটি কমা দ্বারা পৃথক করা তালিকা৷

আপনি নীচে তালিকাভুক্ত এই টুলের জন্য রাত্রিকালীন প্রাক-নির্মিত বাইনারি পেতে পারেন:

iOS বেঞ্চমার্ক অ্যাপ

iOS ডিভাইসে বেঞ্চমার্ক চালানোর জন্য, আপনাকে উৎস থেকে অ্যাপটি তৈরি করতে হবে। সোর্স ট্রির বেঞ্চমার্ক_ডেটা ডিরেক্টরিতে LiteRT মডেল ফাইলটি রাখুন এবং benchmark_params.json ফাইলটি পরিবর্তন করুন। সেই ফাইলগুলি অ্যাপে প্যাকেজ করা হয় এবং অ্যাপটি ডিরেক্টরি থেকে ডেটা পড়ে। বিস্তারিত নির্দেশাবলীর জন্য iOS বেঞ্চমার্ক অ্যাপে যান।

সুপরিচিত মডেলের জন্য পারফরম্যান্স বেঞ্চমার্ক

কিছু অ্যান্ড্রয়েড এবং iOS ডিভাইসে সুপরিচিত মডেল চালানোর সময় এই বিভাগে LiteRT পারফরম্যান্স বেঞ্চমার্ক তালিকাভুক্ত করা হয়।

অ্যান্ড্রয়েড কর্মক্ষমতা বেঞ্চমার্ক

এই পারফরম্যান্স বেঞ্চমার্ক নম্বরগুলি নেটিভ বেঞ্চমার্ক বাইনারি দিয়ে তৈরি করা হয়েছিল।

অ্যান্ড্রয়েড বেঞ্চমার্কের জন্য, সিপিইউ অ্যাফিনিটি ভ্যারিয়েন্স কমাতে ডিভাইসে বড় কোর ব্যবহার করতে সেট করা হয়েছে ( বিস্তারিত দেখুন)।

এটি অনুমান করে যে মডেলগুলি ডাউনলোড করা হয়েছে এবং /data/local/tmp/tflite_models ডিরেক্টরিতে আনজিপ করা হয়েছে। বেঞ্চমার্ক বাইনারি এই নির্দেশাবলী ব্যবহার করে তৈরি করা হয়েছে এবং ধরে নেওয়া হয়েছে যে /data/local/tmp ডিরেক্টরিতে রয়েছে।

বেঞ্চমার্ক চালানোর জন্য:

adb shell /data/local/tmp/benchmark_model \
  --num_threads=4 \
  --graph=/data/local/tmp/tflite_models/${GRAPH} \
  --warmup_runs=1 \
  --num_runs=50

GPU প্রতিনিধির সাথে চালানোর জন্য, --use_gpu=true সেট করুন।

নীচের কর্মক্ষমতা মান Android 10 এ পরিমাপ করা হয়।

মডেলের নাম ডিভাইস CPU, 4 থ্রেড জিপিইউ
Mobilenet_1.0_224(ফ্লোট) পিক্সেল 3 23.9 ms 6.45 ms
পিক্সেল 4 14.0 ms 9.0 ms
Mobilenet_1.0_224 (পরিমাণ) পিক্সেল 3 13.4 ms ---
পিক্সেল 4 5.0 ms ---
NASNet মোবাইল পিক্সেল 3 56 ms ---
পিক্সেল 4 34.5 ms ---
স্কুইজনেট পিক্সেল 3 35.8 ms 9.5 ms
পিক্সেল 4 23.9 ms 11.1 ms
ইনসেপশন_রেসনেট_ভি2 পিক্সেল 3 422 ms 99.8 ms
পিক্সেল 4 272.6 ms 87.2 ms
ইনসেপশন_V4 পিক্সেল 3 486 ms 93 ms
পিক্সেল 4 324.1 ms 97.6 ms

iOS কর্মক্ষমতা বেঞ্চমার্ক

এই পারফরম্যান্স বেঞ্চমার্ক নম্বরগুলি iOS বেঞ্চমার্ক অ্যাপ দিয়ে তৈরি করা হয়েছিল।

iOS বেঞ্চমার্কগুলি চালানোর জন্য, উপযুক্ত মডেল অন্তর্ভুক্ত করার জন্য বেঞ্চমার্ক অ্যাপটি সংশোধন করা হয়েছিল এবং benchmark_params.json num_threads 2 এ সেট করতে পরিবর্তন করা হয়েছিল। GPU প্রতিনিধি ব্যবহার করতে, "use_gpu" : "1" এবং "gpu_wait_type" : "aggressive" বিকল্পগুলি ছিল এছাড়াও benchmark_params.json এ যোগ করা হয়েছে।

মডেলের নাম ডিভাইস CPU, 2 থ্রেড জিপিইউ
Mobilenet_1.0_224(ফ্লোট) আইফোন এক্সএস 14.8 ms 3.4 ms
Mobilenet_1.0_224 (পরিমাণ) আইফোন এক্সএস 11 মি.সে ---
NASNet মোবাইল আইফোন এক্সএস 30.4 ms ---
স্কুইজনেট আইফোন এক্সএস 21.1 ms 15.5 ms
ইনসেপশন_রেসনেট_ভি2 আইফোন এক্সএস 261.1 ms 45.7 ms
ইনসেপশন_V4 আইফোন এক্সএস 309 ms 54.4 ms

ট্রেস LiteRT অভ্যন্তরীণ

অ্যান্ড্রয়েডে LiteRT ইন্টারনাল ট্রেস করুন

একটি Android অ্যাপের LiteRT ইন্টারপ্রেটার থেকে অভ্যন্তরীণ ইভেন্টগুলি অ্যান্ড্রয়েড ট্রেসিং টুল দ্বারা ক্যাপচার করা যেতে পারে৷ এগুলি অ্যান্ড্রয়েড ট্রেস API-এর সাথে একই ইভেন্ট, তাই জাভা/কোটলিন কোড থেকে ক্যাপচার করা ইভেন্টগুলি LiteRT অভ্যন্তরীণ ইভেন্টগুলির সাথে একসাথে দেখা হয়।

ঘটনার কিছু উদাহরণ হল:

  • অপারেটর আহ্বান
  • প্রতিনিধি দ্বারা গ্রাফ পরিবর্তন
  • টেনসর বরাদ্দ

ট্রেস ক্যাপচার করার জন্য বিভিন্ন বিকল্পের মধ্যে, এই গাইডটি অ্যান্ড্রয়েড স্টুডিও সিপিইউ প্রোফাইলার এবং সিস্টেম ট্রেসিং অ্যাপকে কভার করে। অন্যান্য বিকল্পের জন্য Perfetto কমান্ড-লাইন টুল বা Systrace কমান্ড-লাইন টুল পড়ুন।

জাভা কোডে ট্রেস ইভেন্ট যোগ করা হচ্ছে

এটি ইমেজ ক্লাসিফিকেশন উদাহরণ অ্যাপ থেকে একটি কোড স্নিপেট। LiteRT দোভাষী recognizeImage/runInference বিভাগে চলে। এই ধাপটি ঐচ্ছিক কিন্তু অনুমান কলটি কোথায় করা হয়েছে তা লক্ষ্য করার জন্য এটি উপযোগী।

  Trace.beginSection("recognizeImage");
  ...
  // Runs the inference call.
  Trace.beginSection("runInference");
  tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
  Trace.endSection();
  ...
  Trace.endSection();

LiteRT ট্রেসিং সক্ষম করুন৷

LiteRT ট্রেসিং সক্ষম করতে, অ্যান্ড্রয়েড অ্যাপ শুরু করার আগে অ্যান্ড্রয়েড সিস্টেম প্রপার্টি debug.tflite.trace 1 এ সেট করুন।

adb shell setprop debug.tflite.trace 1

LiteRT ইন্টারপ্রেটার শুরু করার সময় এই বৈশিষ্ট্যটি সেট করা থাকলে, ইন্টারপ্রেটার থেকে মূল ইভেন্টগুলি (যেমন, অপারেটর আহ্বান) ট্রেস করা হবে।

আপনি সমস্ত ট্রেস ক্যাপচার করার পরে, সম্পত্তির মান 0 এ সেট করে ট্রেসিং অক্ষম করুন।

adb shell setprop debug.tflite.trace 0

অ্যান্ড্রয়েড স্টুডিও সিপিইউ প্রোফাইলার

নীচের পদক্ষেপগুলি অনুসরণ করে অ্যান্ড্রয়েড স্টুডিও সিপিইউ প্রোফাইলারের সাথে ট্রেসগুলি ক্যাপচার করুন:

  1. উপরের মেনু থেকে রান > প্রোফাইল 'অ্যাপ' নির্বাচন করুন।

  2. প্রোফাইলার উইন্ডো প্রদর্শিত হলে CPU টাইমলাইনের যে কোন জায়গায় ক্লিক করুন।

  3. CPU প্রোফাইলিং মোডগুলির মধ্যে 'ট্রেস সিস্টেম কল' নির্বাচন করুন।

    'ট্রেস সিস্টেম কল' নির্বাচন করুন

  4. 'রেকর্ড' বোতাম টিপুন।

  5. 'স্টপ' বোতাম টিপুন।

  6. ট্রেস ফলাফল তদন্ত.

    অ্যান্ড্রয়েড স্টুডিও ট্রেস

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

সিস্টেম ট্রেসিং অ্যাপ

সিস্টেম ট্রেসিং অ্যাপে বিস্তারিত ধাপগুলি অনুসরণ করে অ্যান্ড্রয়েড স্টুডিও ছাড়াই ট্রেস ক্যাপচার করুন।

এই উদাহরণে, একই TFLite ইভেন্টগুলি ক্যাপচার করা হয়েছিল এবং Android ডিভাইসের সংস্করণের উপর নির্ভর করে Perfetto বা Systrace ফর্ম্যাটে সংরক্ষিত হয়েছিল৷ ক্যাপচার করা ট্রেস ফাইলগুলি Perfetto UI এ খোলা যেতে পারে।

পারফেটো ট্রেস

iOS-এ LiteRT ইন্টারনাল ট্রেস করুন

একটি iOS অ্যাপের LiteRT ইন্টারপ্রেটার থেকে অভ্যন্তরীণ ইভেন্টগুলি Xcode সহ অন্তর্ভুক্ত Instruments টুল দ্বারা ক্যাপচার করা যেতে পারে। এগুলি হল iOS সাইনপোস্ট ইভেন্ট, তাই সুইফট/অবজেক্টিভ-সি কোড থেকে ক্যাপচার করা ইভেন্টগুলিকে LiteRT অভ্যন্তরীণ ইভেন্টগুলির সাথে একসাথে দেখা হয়।

ঘটনার কিছু উদাহরণ হল:

  • অপারেটর আহ্বান
  • প্রতিনিধি দ্বারা গ্রাফ পরিবর্তন
  • টেনসর বরাদ্দ

LiteRT ট্রেসিং সক্ষম করুন৷

নীচের পদক্ষেপগুলি অনুসরণ করে পরিবেশ পরিবর্তনশীল debug.tflite.trace সেট করুন:

  1. Xcode-এর উপরের মেনু থেকে পণ্য > স্কিম > স্কিম সম্পাদনা করুন... নির্বাচন করুন।

  2. বাম ফলকে 'প্রোফাইল' ক্লিক করুন।

  3. 'রান অ্যাকশনের আর্গুমেন্ট এবং এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করুন' চেকবক্স অনির্বাচন করুন।

  4. 'এনভায়রনমেন্ট ভেরিয়েবল' বিভাগের অধীনে debug.tflite.trace যোগ করুন।

    পরিবেশ পরিবর্তনশীল সেট করুন

আপনি যদি iOS অ্যাপের প্রোফাইল করার সময় LiteRT ইভেন্টগুলি বাদ দিতে চান, তাহলে এনভায়রনমেন্ট ভেরিয়েবল সরিয়ে ট্রেসিং অক্ষম করুন।

এক্সকোড যন্ত্র

নীচের পদক্ষেপগুলি অনুসরণ করে ট্রেস ক্যাপচার করুন:

  1. Xcode এর উপরের মেনু থেকে পণ্য > প্রোফাইল নির্বাচন করুন।

  2. ইনস্ট্রুমেন্ট টুল চালু হলে প্রোফাইলিং টেমপ্লেটের মধ্যে লগিং এ ক্লিক করুন।

  3. 'স্টার্ট' বোতাম টিপুন।

  4. 'স্টপ' বোতাম টিপুন।

  5. OS লগিং সাবসিস্টেম আইটেম প্রসারিত করতে 'os_signpost' এ ক্লিক করুন।

  6. 'org.tensorflow.lite' OS লগিং সাবসিস্টেমে ক্লিক করুন।

  7. ট্রেস ফলাফল তদন্ত.

    এক্সকোড ইন্সট্রুমেন্টস ট্রেস

এই উদাহরণে, আপনি প্রতিটি অপারেটর সময়ের জন্য ইভেন্ট এবং পরিসংখ্যানের শ্রেণিবিন্যাস দেখতে পারেন।

ট্রেসিং ডেটা ব্যবহার করে

ট্রেসিং ডেটা আপনাকে পারফরম্যান্সের বাধা শনাক্ত করতে দেয়।

এখানে কিছু অন্তর্দৃষ্টির উদাহরণ দেওয়া হল যা আপনি প্রোফাইলার থেকে পেতে পারেন এবং কর্মক্ষমতা উন্নত করতে সম্ভাব্য সমাধানগুলি পেতে পারেন:

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