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

เครื่องมือมาตรฐาน

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

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

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

แอพมาตรฐาน Android

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

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

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

ดาวน์โหลดแอปมาตรฐาน Android ที่สร้างไว้ล่วงหน้าทุกคืนโดยใช้ลิงก์ด้านล่าง:

สำหรับแอปวัดประสิทธิภาพ Android ที่รองรับ TF ops ผ่านทาง ตัวแทน Flex ให้ใช้ลิงก์ด้านล่าง:

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

เตรียมเบนช์มาร์ก

ก่อนที่จะเรียกใช้แอปการวัดประสิทธิภาพ ให้ติดตั้งแอปและพุชไฟล์โมเดลไปยังอุปกรณ์ดังนี้:

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

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

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

สำหรับไบนารีที่สร้างไว้ล่วงหน้าทุกคืนที่รองรับ TF ops ผ่าน Flex degate ให้ใช้ลิงก์ด้านล่าง:

หากต้องการเปรียบเทียบมาตรฐานกับ ผู้รับมอบสิทธิ์ TensorFlow Lite Hexagon เราได้สร้างไฟล์ libhexagon_interface.so ที่จำเป็นไว้ล่วงหน้าด้วย (ดูรายละเอียดเกี่ยวกับไฟล์นี้ ที่ นี่) หลังจากดาวน์โหลดไฟล์ของแพลตฟอร์มที่เกี่ยวข้องจากลิงก์ด้านล่าง โปรดเปลี่ยนชื่อไฟล์เป็น libhexagon_interface.so

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

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

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

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 คุณต้องสร้างแอปจาก แหล่งที่มา วางไฟล์โมเดล TensorFlow Lite ลงในไดเร็กทอรี benchmark_data ของแผนผังต้นทาง และแก้ไขไฟล์ benchmark_params.json ไฟล์เหล่านั้นถูกรวมไว้ในแอพและแอพจะอ่านข้อมูลจากไดเร็กทอรี ไปที่ แอปวัดประสิทธิภาพ iOS เพื่อดูคำแนะนำโดยละเอียด

การวัดประสิทธิภาพสำหรับรุ่นที่รู้จักกันดี

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

การวัดประสิทธิภาพการทำงานของ Android

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

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

โดยถือว่าโมเดลถูกดาวน์โหลดและคลายซิปไปยังไดเร็กทอรี /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

หากต้องการรันด้วยผู้รับมอบสิทธิ์ nnapi ให้ตั้งค่า --use_nnapi=true หากต้องการรันด้วยตัวแทน GPU ให้ตั้งค่า --use_gpu=true

ค่าประสิทธิภาพด้านล่างนี้วัดจาก Android 10

ชื่อรุ่น อุปกรณ์ ซีพียู 4 เธรด จีพียู นาปี
Mobilenet_1.0_224(ลอย) พิกเซล 3 23.9 น 6.45 น 13.8 มิลลิวินาที
พิกเซล 4 14.0 น 9.0 มิลลิวินาที 14.8 มิลลิวินาที
Mobilenet_1.0_224 (ปริมาณ) พิกเซล 3 13.4 มิลลิวินาที --- 6.0 มิลลิวินาที
พิกเซล 4 5.0 มิลลิวินาที --- 3.2 มิลลิวินาที
NASNet มือถือ พิกเซล 3 56 น --- 102 มิลลิวินาที
พิกเซล 4 34.5 มิลลิวินาที --- 99.0 มิลลิวินาที
สควีซเน็ต พิกเซล 3 35.8 มิลลิวินาที 9.5 มิลลิวินาที 18.5 มิลลิวินาที
พิกเซล 4 23.9 น 11.1 มิลลิวินาที 19.0 น
Inception_ResNet_V2 พิกเซล 3 422 ม 99.8 มิลลิวินาที 201 นางสาว
พิกเซล 4 272.6 มิลลิวินาที 87.2 มิลลิวินาที 171.1 มิลลิวินาที
การเริ่มต้น_V4 พิกเซล 3 486 มิลลิวินาที 93 น 292 ม
พิกเซล 4 324.1 มิลลิวินาที 97.6 มิลลิวินาที 186.9 มิลลิวินาที

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

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

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

ชื่อรุ่น อุปกรณ์ ซีพียู 2 เธรด จีพียู
Mobilenet_1.0_224(ลอย) ไอโฟน XS 14.8 มิลลิวินาที 3.4 มิลลิวินาที
Mobilenet_1.0_224 (ปริมาณ) ไอโฟน XS 11 น ---
NASNet มือถือ ไอโฟน XS 30.4 มิลลิวินาที ---
สควีซเน็ต ไอโฟน XS 21.1 น 15.5 มิลลิวินาที
Inception_ResNet_V2 ไอโฟน XS 261.1 มิลลิวินาที 45.7 มิลลิวินาที
การเริ่มต้น_V4 ไอโฟน XS 309 ม 54.4 มิลลิวินาที

ติดตามภายใน TensorFlow Lite

ติดตามภายใน TensorFlow Lite ใน Android

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

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

  • การร้องขอของโอเปอเรเตอร์
  • การปรับเปลี่ยนกราฟโดยผู้รับมอบสิทธิ์
  • การจัดสรรเทนเซอร์

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

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

นี่คือข้อมูลโค้ดจากแอปตัวอย่าง Image Classification ล่าม 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

ตัวสร้างโปรไฟล์ซีพียู Android Studio

บันทึกการติดตามด้วย Android Studio CPU Profiler โดยทำตามขั้นตอนด้านล่าง:

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

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

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

    เลือก 'ติดตามการโทรของระบบ'

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

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

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

    ติดตาม Android Studio

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

แอพติดตามระบบ

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

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

ร่องรอยเพอร์เฟตโต

ติดตามภายใน TensorFlow Lite ใน iOS

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

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

  • การร้องขอของโอเปอเรเตอร์
  • การปรับเปลี่ยนกราฟโดยผู้รับมอบสิทธิ์
  • การจัดสรรเทนเซอร์

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

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

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

  2. คลิก 'โปรไฟล์' ในบานหน้าต่างด้านซ้าย

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

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

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

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

เครื่องมือ XCode

จับร่องรอยโดยทำตามขั้นตอนด้านล่าง:

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

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

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

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

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

  6. คลิกระบบย่อยการบันทึก OS 'org.tensorflow.lite'

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

    ติดตาม Xcode Instruments

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

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

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

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

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