เครื่องมือมาตรฐาน
ปัจจุบันเครื่องมือวัดประสิทธิภาพ 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
คุณสามารถระบุพารามิเตอร์ทางเลือกเพิ่มเติมสำหรับการรันการวัดประสิทธิภาพได้
-
num_threads
:int
(ค่าเริ่มต้น = 1)
จำนวนเธรดที่จะใช้สำหรับการเรียกใช้ล่าม TFLite -
use_gpu
:bool
(ค่าเริ่มต้น = false)
ใช้ ตัวแทน GPU -
use_nnapi
:bool
(ค่าเริ่มต้น = false)
ใช้ ผู้รับมอบสิทธิ์ NNAPI -
use_xnnpack
:bool
(ค่าเริ่มต้น=false
)
ใช้ ผู้รับมอบสิทธิ์ XNNPACK -
use_hexagon
:bool
(ค่าเริ่มต้น=false
)
ใช้ ผู้รับมอบสิทธิ์หกเหลี่ยม
ตัวเลือกเหล่านี้บางส่วนอาจไม่พร้อมใช้งานหรือไม่มีผลกระทบ ทั้งนี้ขึ้นอยู่กับอุปกรณ์ที่คุณใช้ โปรดดู พารามิเตอร์ สำหรับพารามิเตอร์ประสิทธิภาพเพิ่มเติมที่คุณสามารถเรียกใช้กับแอปเปรียบเทียบได้
ดูผลลัพธ์โดยใช้คำสั่ง 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 มิลลิวินาที | - |
SqueezeNet | ไอโฟน 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 โดยทำตามขั้นตอนด้านล่าง:
เลือก เรียกใช้ > โปรไฟล์ 'แอป' จากเมนูด้านบน
คลิกที่ใดก็ได้ในไทม์ไลน์ของ CPU เมื่อหน้าต่าง Profiler ปรากฏขึ้น
เลือก 'ติดตามการเรียกของระบบ' ในโหมดโปรไฟล์ CPU
กดปุ่ม 'บันทึก'
กดปุ่ม 'หยุด'
ตรวจสอบผลการติดตาม
ในตัวอย่างนี้ คุณสามารถดูลำดับชั้นของเหตุการณ์ในเธรดและสถิติสำหรับเวลาของผู้ดำเนินการแต่ละรายการ และยังดูโฟลว์ข้อมูลของแอปทั้งหมดระหว่างเธรดอีกด้วย
แอพติดตามระบบ
บันทึกการติดตามโดยไม่ต้องใช้ 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
โดยทำตามขั้นตอนด้านล่าง:
เลือก ผลิตภัณฑ์ > โครงการ > แก้ไขโครงการ... จากเมนูด้านบนของ Xcode
คลิก 'โปรไฟล์' ในบานหน้าต่างด้านซ้าย
ยกเลิกการเลือกช่องทำเครื่องหมาย 'ใช้อาร์กิวเมนต์ของการดำเนินการเรียกใช้และตัวแปรสภาพแวดล้อม'
เพิ่ม
debug.tflite.trace
ในส่วน 'ตัวแปรสภาพแวดล้อม'
หากคุณต้องการยกเว้นเหตุการณ์ TensorFlow Lite เมื่อสร้างโปรไฟล์แอป iOS ให้ปิดใช้งานการติดตามโดยลบตัวแปรสภาพแวดล้อม
เครื่องมือ XCode
จับร่องรอยโดยทำตามขั้นตอนด้านล่าง:
เลือก ผลิตภัณฑ์ > โปรไฟล์ จากเมนูด้านบนของ Xcode
คลิก การบันทึก ระหว่างเทมเพลตการทำโปรไฟล์เมื่อเครื่องมือเครื่องมือเปิดตัว
กดปุ่ม 'เริ่ม'
กดปุ่ม 'หยุด'
คลิก 'os_signpost' เพื่อขยายรายการระบบย่อย OS Logging
คลิกระบบย่อยการบันทึก OS 'org.tensorflow.lite'
ตรวจสอบผลการติดตาม
ในตัวอย่างนี้ คุณสามารถดูลำดับชั้นของเหตุการณ์และสถิติสำหรับเวลาของผู้ปฏิบัติงานแต่ละราย
การใช้ข้อมูลการติดตาม
ข้อมูลการติดตามช่วยให้คุณสามารถระบุปัญหาคอขวดของประสิทธิภาพได้
นี่คือตัวอย่างข้อมูลเชิงลึกบางส่วนที่คุณจะได้รับจากเครื่องมือสร้างโปรไฟล์และแนวทางแก้ไขที่เป็นไปได้เพื่อปรับปรุงประสิทธิภาพ:
- หากจำนวนคอร์ CPU ที่มีอยู่น้อยกว่าจำนวนเธรดการอนุมาน โอเวอร์เฮดในการกำหนดเวลา CPU อาจทำให้ประสิทธิภาพต่ำกว่ามาตรฐาน คุณสามารถกำหนดเวลางานที่ต้องใช้ CPU มากอื่นๆ ในแอปพลิเคชันของคุณใหม่ได้ เพื่อหลีกเลี่ยงการทับซ้อนกับการอนุมานโมเดลของคุณ หรือปรับแต่งจำนวนเธรดของล่าม
- หากผู้ปฏิบัติงานไม่ได้รับการมอบหมายโดยสมบูรณ์ กราฟโมเดลบางส่วนจะถูกดำเนินการบน CPU แทนที่จะเป็นตัวเร่งฮาร์ดแวร์ที่คาดไว้ คุณสามารถแทนที่ตัวดำเนินการที่ไม่รองรับด้วยตัวดำเนินการที่รองรับที่คล้ายกัน