การวัดประสิทธิภาพ

เครื่องมือเปรียบเทียบ

ปัจจุบันเครื่องมือเปรียบเทียบ TensorFlow Lite จะวัดและคำนวณสถิติสำหรับเมตริกประสิทธิภาพที่สำคัญต่อไปนี้

  • เวลาเริ่มต้น
  • เวลาในการอนุมานของสถานะอุ่นเครื่อง
  • เวลาอนุมานของสถานะคงที่
  • การใช้งานหน่วยความจำในระหว่างเวลาเริ่มต้น
  • การใช้งานหน่วยความจำโดยรวม

เครื่องมือการเปรียบเทียบจะพร้อมให้ใช้งานในรูปแบบแอปเปรียบเทียบสำหรับ Android และ iOS รวมถึงเป็นไบนารีบรรทัดคำสั่งเนทีฟ ซึ่งเครื่องมือดังกล่าวจะใช้ตรรกะในการวัดประสิทธิภาพหลักเดียวกัน โปรดทราบว่าตัวเลือกและรูปแบบเอาต์พุตที่ใช้ได้จะแตกต่างกันเล็กน้อยเนื่องจากสภาพแวดล้อมรันไทม์แตกต่างกัน

แอปเปรียบเทียบบน Android

คุณมี 2 ตัวเลือกในการใช้เครื่องมือการเปรียบเทียบกับ Android รายการหนึ่งคือไบนารีเปรียบเทียบในเครื่อง และอีกแอปหนึ่งคือแอปเปรียบเทียบ Android ซึ่งเป็นตัววัดประสิทธิภาพของโมเดลในแอปได้ดีกว่า อย่างไรก็ตาม ตัวเลขจากเครื่องมือการเปรียบเทียบจะยังคงแตกต่างจากตอนที่เรียกใช้การอนุมานกับโมเดลในแอปจริงเล็กน้อย

แอปเปรียบเทียบบน Android นี้ไม่มี UI ติดตั้งและเรียกใช้โดยใช้คำสั่ง adb และดึงผลลัพธ์โดยใช้คำสั่ง adb logcat

ดาวน์โหลดหรือสร้างแอป

ดาวน์โหลดแอปเปรียบเทียบ Android ที่สร้างไว้ล่วงหน้าประจำคืนโดยใช้ลิงก์ด้านล่างนี้:

สำหรับแอปเปรียบเทียบใน Android ที่รองรับการดำเนินการ TF ผ่านมอบสิทธิ์แบบยืดหยุ่น ให้ใช้ลิงก์ด้านล่าง

นอกจากนี้ คุณยังสร้างแอปจากแหล่งที่มาได้โดยทำตามinstructionsเหล่านี้

เตรียมการเปรียบเทียบ

ก่อนที่จะเรียกใช้แอปเปรียบเทียบ ให้ติดตั้งแอปและพุชไฟล์โมเดลไปยังอุปกรณ์โดยทำดังนี้

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

คุณระบุพารามิเตอร์ที่ไม่บังคับเพิ่มเติมเพื่อเรียกใช้การเปรียบเทียบได้

ตัวเลือกเหล่านี้อาจใช้ไม่ได้หรือไม่มีผลใดๆ ทั้งนี้ขึ้นอยู่กับอุปกรณ์ที่ใช้ โปรดดู พารามิเตอร์ สำหรับพารามิเตอร์ประสิทธิภาพเพิ่มเติมที่คุณสามารถเรียกใช้ด้วยแอปเปรียบเทียบ

ดูผลลัพธ์โดยใช้คำสั่ง 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 ด้วย คุณเรียกใช้เครื่องมือนี้ได้จากบรรทัดคำสั่ง Shell ใน Linux, Mac, อุปกรณ์แบบฝัง และอุปกรณ์ Android

ดาวน์โหลดหรือสร้างไบนารี

ดาวน์โหลดไบนารีบรรทัดคำสั่งเนทีฟที่สร้างไว้ล่วงหน้าทุกคืนโดยไปที่ลิงก์ด้านล่าง

สำหรับไบนารีที่สร้างไว้ล่วงหน้าตอนกลางคืนซึ่งรองรับการดำเนินการ TF ผ่านมอบสิทธิ์ Flex ให้ใช้ลิงก์ด้านล่าง

คุณยังสร้างไบนารีการเปรียบเทียบในเครื่องจากแหล่งที่มาในคอมพิวเตอร์ได้ด้วย

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

หากต้องการสร้างด้วยห่วงโซ่เครื่องมือ Android NDK คุณต้องตั้งค่าสภาพแวดล้อมของบิลด์ก่อนโดยทำตามคู่มือนี้ หรือใช้อิมเมจ Docker ตามที่อธิบายไว้ในคู่มือนี้

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

เรียกใช้การเปรียบเทียบ

หากต้องการเรียกใช้การเปรียบเทียบในคอมพิวเตอร์ ให้เรียกใช้ไบนารีจาก Shell

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

คุณสามารถใช้ชุดพารามิเตอร์ชุดเดียวกันกับที่กล่าวไว้ข้างต้นกับไบนารีบรรทัดคำสั่งเนทีฟได้

กำลังทำโปรไฟล์ Ops

นอกจากนี้ ไบนารีของโมเดลการเปรียบเทียบยังช่วยให้คุณสร้างโปรไฟล์การดำเนินการของโมเดลและรับเวลาดำเนินการของโอเปอเรเตอร์แต่ละรายการได้ด้วย โดยส่งแฟล็ก --enable_op_profiling=true ไปยัง benchmark_model ระหว่างการเรียกใช้ ดูรายละเอียดได้ ที่นี่

ไบนารีการเปรียบเทียบแบบเนทีฟสำหรับตัวเลือกประสิทธิภาพหลายรายการในการเรียกใช้ครั้งเดียว

นอกจากนี้ยังมีไบนารี C++ ที่ใช้งานง่ายและสะดวกสำหรับเปรียบเทียบตัวเลือกประสิทธิภาพหลายรายการในการใช้งานครั้งเดียวด้วย ไบนารีนี้สร้างขึ้นจากเครื่องมือเปรียบเทียบที่กล่าวถึงข้างต้น ซึ่งสามารถเปรียบเทียบตัวเลือกประสิทธิภาพได้ครั้งละ 1 ตัวเลือกเท่านั้น แท็กเหล่านี้ใช้กระบวนการบิลด์/ติดตั้ง/เรียกใช้เดียวกัน แต่ชื่อเป้าหมายของ BUILD ของไบนารีนี้คือ benchmark_model_performance_options และต้องใช้พารามิเตอร์เพิ่มเติมบางรายการ พารามิเตอร์ที่สำคัญสำหรับไบนารีนี้คือ

perf_options_list: string (default='all')
รายการที่คั่นด้วยจุลภาคของตัวเลือกประสิทธิภาพ TFLite สำหรับการเปรียบเทียบ

คุณสามารถรับไบนารีที่สร้างไว้ล่วงหน้าคืนสำหรับเครื่องมือนี้ตามที่ระบุไว้ด้านล่าง

แอปเปรียบเทียบ iOS

หากต้องการเรียกใช้การเปรียบเทียบในอุปกรณ์ iOS คุณต้องสร้างแอปจากแหล่งที่มา ใส่ไฟล์โมเดล TensorFlow Lite ลงในไดเรกทอรี benchmark_data ของโครงสร้างซอร์สและแก้ไขไฟล์ benchmark_params.json ระบบจะรวมไฟล์เหล่านั้นไว้ในแอป และแอปจะอ่านข้อมูลจากไดเรกทอรี ไปที่ แอปการเปรียบเทียบ iOS เพื่อดูคำแนะนำโดยละเอียด

การเปรียบเทียบประสิทธิภาพของรูปแบบที่รู้จักกันดี

ส่วนนี้จะแสดงการเปรียบเทียบประสิทธิภาพของ TensorFlow Lite เมื่อใช้โมเดลซึ่งเป็นที่รู้จักในอุปกรณ์ Android และ iOS บางรุ่น

การเปรียบเทียบประสิทธิภาพของ Android

ตัวเลขการเปรียบเทียบประสิทธิภาพเหล่านี้สร้างขึ้นด้วยไบนารีการเปรียบเทียบเนทีฟ

สำหรับการเปรียบเทียบ Android แอฟฟินิตี้ CPU ได้รับการตั้งค่าให้ใช้แกนขนาดใหญ่บนอุปกรณ์เพื่อลดความแปรปรวน (ดูรายละเอียด)

โดยจะถือว่ามีการดาวน์โหลดและแตกไฟล์โมเดลไปยังไดเรกทอรี /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 เทรด GPU
Mobilenet_1.0_224(float) Pixel 3 23.9 มิลลิวินาที 6.45 มิลลิวินาที
Pixel 4 14.0 มิลลิวินาที 9.0 มิลลิวินาที
Mobilenet_1.0_224 (จำนวน) Pixel 3 13.4 มิลลิวินาที ---
Pixel 4 5.0 มิลลิวินาที ---
NASNet อุปกรณ์เคลื่อนที่ Pixel 3 56 มิลลิวินาที ---
Pixel 4 34.5 มิลลิวินาที ---
SqueezeNet Pixel 3 35.8 มิลลิวินาที 9.5 มิลลิวินาที
Pixel 4 23.9 มิลลิวินาที 11.1 มิลลิวินาที
Inception_ResNet_V2 Pixel 3 422 มิลลิวินาที 99.8 มิลลิวินาที
Pixel 4 272.6 มิลลิวินาที 87.2 มิลลิวินาที
Inception_V4 Pixel 3 486 มิลลิวินาที 93 มิลลิวินาที
Pixel 4 324.1 มิลลิวินาที 97.6 มิลลิวินาที

การเปรียบเทียบประสิทธิภาพใน iOS

ตัวเลขการเปรียบเทียบประสิทธิภาพเหล่านี้สร้างขึ้นด้วยแอปเปรียบเทียบสำหรับ iOS

หากต้องการเรียกใช้การเปรียบเทียบ iOS มีการแก้ไขแอปเปรียบเทียบให้รวมโมเดลที่เหมาะสม และแก้ไข benchmark_params.json ให้ตั้ง num_threads เป็น 2 หากต้องการใช้การมอบสิทธิ์ GPU ระบบจะเพิ่มตัวเลือก "use_gpu" : "1" และ "gpu_wait_type" : "aggressive" ลงใน benchmark_params.json ด้วย

ชื่อโมเดล อุปกรณ์ CPU, 2 เทรด GPU
Mobilenet_1.0_224(float) iPhone XS 14.8 มิลลิวินาที 3.4 มิลลิวินาที
Mobilenet_1.0_224 (จำนวน) iPhone XS 11 มิลลิวินาที ---
NASNet อุปกรณ์เคลื่อนที่ iPhone XS 30.4 มิลลิวินาที ---
SqueezeNet iPhone XS 21.1 มิลลิวินาที 15.5 มิลลิวินาที
Inception_ResNet_V2 iPhone XS 261.1 มิลลิวินาที 45.7 มิลลิวินาที
Inception_V4 iPhone XS 309 มิลลิวินาที 54.4 มิลลิวินาที

Trace ของ TensorFlow Lite

ติดตามการทำงานภายในของ TensorFlow Lite ใน Android

เหตุการณ์ภายในจากล่ามของ TensorFlow Lite ของแอป Android จะจับภาพได้ด้วยเครื่องมือการติดตามของ Android ซึ่งเป็นเหตุการณ์เดียวกับที่มี Trace API ของ Android ดังนั้นเหตุการณ์ที่บันทึกจากโค้ด Java/Kotlin จะแสดงร่วมกับเหตุการณ์ภายในของ TensorFlow Lite

ตัวอย่างเหตุการณ์ ได้แก่

  • การเรียกใช้โอเปอเรเตอร์
  • แก้ไขกราฟตามผู้รับมอบสิทธิ์
  • การจัดสรร Tensor

คู่มือนี้ประกอบด้วยตัวเลือกต่างๆ ในการบันทึกการติดตาม รวมถึงเครื่องมือสร้างโปรไฟล์ CPU ของ Android Studio และแอป System Tracing โปรดดูตัวเลือกอื่นๆ ในเครื่องมือบรรทัดคำสั่ง Perfetto หรือเครื่องมือบรรทัดคำสั่ง Systrace

การเพิ่มเหตุการณ์การติดตามในโค้ด Java

นี่คือข้อมูลโค้ดจากแอปตัวอย่างการจัดประเภทรูปภาพ ซึ่งอินเทอร์พรีเตอร์ของ TensorFlow Lite จะทำงานในส่วน recognizeImage/runInference ขั้นตอนนี้เป็นขั้นตอนที่ไม่บังคับ แต่จะมีประโยชน์ในการช่วยให้สังเกตที่ที่มีการเรียกใช้การอนุมาน

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

เปิดใช้การติดตาม TensorFlow Lite

หากต้องการเปิดใช้การติดตาม TensorFlow Lite ให้ตั้งค่าคุณสมบัติของระบบ Android debug.tflite.trace เป็น 1 ก่อนเริ่มแอป Android

adb shell setprop debug.tflite.trace 1

หากตั้งค่าพร็อพเพอร์ตี้นี้เมื่อเริ่มต้นอินเทอร์พรีเตอร์ TensorFlow Lite ระบบจะติดตามเหตุการณ์สำคัญ (เช่น การเรียกใช้โอเปอเรเตอร์) จากอินเตอร์พรีเตอร์

หลังจากที่บันทึกการติดตามทั้งหมดแล้ว ให้ปิดใช้การติดตามโดยตั้งค่าพร็อพเพอร์ตี้เป็น 0

adb shell setprop debug.tflite.trace 0

เครื่องมือสร้างโปรไฟล์ CPU ของ Android Studio

บันทึกการติดตามด้วยเครื่องมือสร้างโปรไฟล์ CPU ของ Android Studio โดยทำตามขั้นตอนด้านล่าง

  1. เลือกเรียกใช้ > โปรไฟล์ "แอป" จากเมนูด้านบน

  2. คลิกที่ใดก็ได้ในไทม์ไลน์ของ CPU เมื่อหน้าต่างเครื่องมือสร้างโปรไฟล์ปรากฏขึ้น

  3. เลือก "ติดตามการเรียกของระบบ" ในโหมดการทำโปรไฟล์ CPU

    เลือก "ติดตามการเรียกใช้ระบบ"

  4. กดปุ่ม "บันทึก"

  5. กดปุ่ม "หยุด"

  6. ตรวจสอบผลลัพธ์การติดตาม

    การติดตาม Android Studio

ในตัวอย่างนี้ คุณจะดูลำดับชั้นของเหตุการณ์ในเทรดและสถิติสำหรับเวลาที่โอเปอเรเตอร์แต่ละครั้งได้ รวมถึงดูการรับส่งข้อมูลของทั้งแอประหว่างเทรดด้วย

แอป System Tracing

จับภาพการติดตามโดยไม่ใช้ Android Studio โดยทำตามขั้นตอนอย่างละเอียดในแอป System Tracing

ในตัวอย่างนี้ เหตุการณ์ TFLite เดียวกันได้รับการบันทึกและบันทึกไว้ในรูปแบบ Perfetto หรือ Systrace ขึ้นอยู่กับเวอร์ชันของอุปกรณ์ Android ไฟล์การติดตามที่บันทึกไว้จะเปิดได้ใน UI ของ Perfetto

การติดตาม Perfetto

ติดตามการทำงานของ TensorFlow Lite ภายใน iOS

เหตุการณ์ภายในจากอินเทอร์พรีเตอร์ของ TensorFlow Lite ของแอป iOS จะบันทึกไว้ได้ด้วยเครื่องมือ Instruments ที่รวมอยู่ใน Xcode เป็นเหตุการณ์ signpost ของ iOS ดังนั้นเหตุการณ์ที่บันทึกไว้จากโค้ด Swift/Objective-C จึงจะแสดงร่วมกับเหตุการณ์ภายในของ TensorFlow Lite

ตัวอย่างเหตุการณ์ ได้แก่

  • การเรียกใช้โอเปอเรเตอร์
  • แก้ไขกราฟตามผู้รับมอบสิทธิ์
  • การจัดสรร Tensor

เปิดใช้การติดตาม TensorFlow Lite

ตั้งค่าตัวแปรสภาพแวดล้อม debug.tflite.trace โดยทำตามขั้นตอนด้านล่าง

  1. เลือกผลิตภัณฑ์ > รูปแบบ > แก้ไขรูปแบบ... จากเมนูด้านบนของ Xcode

  2. คลิก "โปรไฟล์" ในแผงด้านซ้าย

  3. ยกเลิกการเลือกช่องทำเครื่องหมาย "ใช้อาร์กิวเมนต์และตัวแปรสภาพแวดล้อมของการดำเนินการเรียกใช้"

  4. เพิ่ม debug.tflite.trace ในส่วน "ตัวแปรสภาพแวดล้อม"

    ตั้งค่าตัวแปรสภาพแวดล้อม

หากต้องการยกเว้นเหตุการณ์ TensorFlow Lite เมื่อสร้างโปรไฟล์แอป iOS ให้ปิดใช้การติดตามโดยนำตัวแปรสภาพแวดล้อมออก

อุปกรณ์ XCode

จับภาพการติดตามโดยทำตามขั้นตอนด้านล่าง

  1. เลือก Product > Profile จากเมนูด้านบนของ Xcode

  2. คลิกการบันทึกระหว่างเทมเพลตการสร้างโปรไฟล์เมื่อเครื่องมือเครื่องมือเริ่มทำงาน

  3. กดปุ่ม "เริ่ม"

  4. กดปุ่ม "หยุด"

  5. คลิก "os_signpost" เพื่อขยายรายการระบบย่อยของ OS Logging

  6. คลิกระบบย่อยของ OS Logging "org.tensorflow.lite"

  7. ตรวจสอบผลลัพธ์การติดตาม

    การติดตาม Xcode Instruments

ในตัวอย่างนี้ คุณจะดูลำดับชั้นของเหตุการณ์และสถิติสำหรับเวลาของโอเปอเรเตอร์แต่ละรายได้

การใช้ข้อมูลการติดตาม

ข้อมูลการติดตามช่วยให้คุณระบุจุดคอขวดด้านประสิทธิภาพได้

ตัวอย่างข้อมูลเชิงลึกที่คุณจะได้รับจากเครื่องมือสร้างโปรไฟล์และโซลูชันที่เป็นไปได้ในการปรับปรุงประสิทธิภาพมีดังนี้

  • หากจำนวนแกนของ CPU ที่ใช้ได้น้อยกว่าจำนวนเทรดการอนุมาน โอเวอร์เฮ็ดการกำหนดเวลาของ CPU อาจทำให้ประสิทธิภาพการทำงานต่ำกว่ามาตรฐาน คุณสามารถกำหนดเวลางานอื่นๆ ที่ใช้ CPU มากในแอปพลิเคชันของคุณได้ใหม่เพื่อไม่ให้ทับซ้อนกับการอนุมานโมเดลหรือปรับเปลี่ยนจำนวนเทรดล่าม
  • หากโอเปอเรเตอร์ไม่ได้รับมอบสิทธิ์โดยสมบูรณ์ บางส่วนของกราฟโมเดลจะทำงานบน CPU แทนตัวเร่งฮาร์ดแวร์ที่คาดไว้ โดยคุณสามารถแทนที่โอเปอเรเตอร์ที่ไม่รองรับด้วยโอเปอเรเตอร์ที่รองรับซึ่งคล้ายกันได้