เครื่องมือเปรียบเทียบ
ปัจจุบันเครื่องมือเปรียบเทียบ 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
คุณระบุพารามิเตอร์ที่ไม่บังคับเพิ่มเติมเพื่อเรียกใช้การเปรียบเทียบได้
num_threads
:int
(default=1)
จำนวนชุดข้อความที่จะใช้ในการเรียกใช้อินเทอร์พรีเตอร์ TFLiteuse_gpu
:bool
(default=false)
ใช้ผู้รับมอบสิทธิ์ GPUuse_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
ด้วย คุณเรียกใช้เครื่องมือนี้ได้จากบรรทัดคำสั่ง 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 โดยทำตามขั้นตอนด้านล่าง
เลือกเรียกใช้ > โปรไฟล์ "แอป" จากเมนูด้านบน
คลิกที่ใดก็ได้ในไทม์ไลน์ของ CPU เมื่อหน้าต่างเครื่องมือสร้างโปรไฟล์ปรากฏขึ้น
เลือก "ติดตามการเรียกของระบบ" ในโหมดการทำโปรไฟล์ CPU
กดปุ่ม "บันทึก"
กดปุ่ม "หยุด"
ตรวจสอบผลลัพธ์การติดตาม
ในตัวอย่างนี้ คุณจะดูลำดับชั้นของเหตุการณ์ในเทรดและสถิติสำหรับเวลาที่โอเปอเรเตอร์แต่ละครั้งได้ รวมถึงดูการรับส่งข้อมูลของทั้งแอประหว่างเทรดด้วย
แอป System Tracing
จับภาพการติดตามโดยไม่ใช้ Android Studio โดยทำตามขั้นตอนอย่างละเอียดในแอป System Tracing
ในตัวอย่างนี้ เหตุการณ์ TFLite เดียวกันได้รับการบันทึกและบันทึกไว้ในรูปแบบ Perfetto หรือ Systrace ขึ้นอยู่กับเวอร์ชันของอุปกรณ์ Android ไฟล์การติดตามที่บันทึกไว้จะเปิดได้ใน UI ของ Perfetto
ติดตามการทำงานของ TensorFlow Lite ภายใน iOS
เหตุการณ์ภายในจากอินเทอร์พรีเตอร์ของ TensorFlow Lite ของแอป iOS จะบันทึกไว้ได้ด้วยเครื่องมือ Instruments ที่รวมอยู่ใน Xcode เป็นเหตุการณ์ signpost ของ iOS ดังนั้นเหตุการณ์ที่บันทึกไว้จากโค้ด Swift/Objective-C จึงจะแสดงร่วมกับเหตุการณ์ภายในของ TensorFlow Lite
ตัวอย่างเหตุการณ์ ได้แก่
- การเรียกใช้โอเปอเรเตอร์
- แก้ไขกราฟตามผู้รับมอบสิทธิ์
- การจัดสรร Tensor
เปิดใช้การติดตาม TensorFlow Lite
ตั้งค่าตัวแปรสภาพแวดล้อม debug.tflite.trace
โดยทำตามขั้นตอนด้านล่าง
เลือกผลิตภัณฑ์ > รูปแบบ > แก้ไขรูปแบบ... จากเมนูด้านบนของ Xcode
คลิก "โปรไฟล์" ในแผงด้านซ้าย
ยกเลิกการเลือกช่องทำเครื่องหมาย "ใช้อาร์กิวเมนต์และตัวแปรสภาพแวดล้อมของการดำเนินการเรียกใช้"
เพิ่ม
debug.tflite.trace
ในส่วน "ตัวแปรสภาพแวดล้อม"
หากต้องการยกเว้นเหตุการณ์ TensorFlow Lite เมื่อสร้างโปรไฟล์แอป iOS ให้ปิดใช้การติดตามโดยนำตัวแปรสภาพแวดล้อมออก
อุปกรณ์ XCode
จับภาพการติดตามโดยทำตามขั้นตอนด้านล่าง
เลือก Product > Profile จากเมนูด้านบนของ Xcode
คลิกการบันทึกระหว่างเทมเพลตการสร้างโปรไฟล์เมื่อเครื่องมือเครื่องมือเริ่มทำงาน
กดปุ่ม "เริ่ม"
กดปุ่ม "หยุด"
คลิก "os_signpost" เพื่อขยายรายการระบบย่อยของ OS Logging
คลิกระบบย่อยของ OS Logging "org.tensorflow.lite"
ตรวจสอบผลลัพธ์การติดตาม
ในตัวอย่างนี้ คุณจะดูลำดับชั้นของเหตุการณ์และสถิติสำหรับเวลาของโอเปอเรเตอร์แต่ละรายได้
การใช้ข้อมูลการติดตาม
ข้อมูลการติดตามช่วยให้คุณระบุจุดคอขวดด้านประสิทธิภาพได้
ตัวอย่างข้อมูลเชิงลึกที่คุณจะได้รับจากเครื่องมือสร้างโปรไฟล์และโซลูชันที่เป็นไปได้ในการปรับปรุงประสิทธิภาพมีดังนี้
- หากจำนวนแกนของ CPU ที่ใช้ได้น้อยกว่าจำนวนเทรดการอนุมาน โอเวอร์เฮ็ดการกำหนดเวลาของ CPU อาจทำให้ประสิทธิภาพการทำงานต่ำกว่ามาตรฐาน คุณสามารถกำหนดเวลางานอื่นๆ ที่ใช้ CPU มากในแอปพลิเคชันของคุณได้ใหม่เพื่อไม่ให้ทับซ้อนกับการอนุมานโมเดลหรือปรับเปลี่ยนจำนวนเทรดล่าม
- หากโอเปอเรเตอร์ไม่ได้รับมอบสิทธิ์โดยสมบูรณ์ บางส่วนของกราฟโมเดลจะทำงานบน CPU แทนตัวเร่งฮาร์ดแวร์ที่คาดไว้ โดยคุณสามารถแทนที่โอเปอเรเตอร์ที่ไม่รองรับด้วยโอเปอเรเตอร์ที่รองรับซึ่งคล้ายกันได้