Công cụ đo điểm chuẩn
Các công cụ đo điểm chuẩn LiteRT hiện đo lường và tính toán số liệu thống kê cho các chỉ số hiệu suất quan trọng sau đây:
- Thời gian khởi chạy
- Thời gian suy luận của trạng thái khởi động
- Thời gian suy luận của trạng thái ổn định
- Mức sử dụng bộ nhớ trong thời gian khởi chạy
- Tổng mức sử dụng bộ nhớ
Các công cụ đo điểm chuẩn có sẵn dưới dạng ứng dụng đo điểm chuẩn cho Android và iOS, cũng như dưới dạng các tệp nhị phân dòng lệnh được tạo sẵn. Tất cả các công cụ này đều có chung logic đo lường hiệu suất cốt lõi. Xin lưu ý rằng các lựa chọn và định dạng đầu ra có sẵn sẽ khác nhau đôi chút do sự khác biệt về môi trường thời gian chạy.
Tệp nhị phân điểm chuẩn tạo sẵn (sử dụng CompiledModel API)
Có 2 lựa chọn để sử dụng công cụ đo điểm chuẩn với Android. Một là nhị phân điểm chuẩn gốc (dựa trên CompiledModel API) và một là ứng dụng điểm chuẩn Android (dựa trên Interpreter API). Công cụ Điểm chuẩn LiteRT được cung cấp dưới dạng một tệp nhị phân tích hợp sẵn benchmark_model. Bạn có thể thực thi công cụ này từ dòng lệnh shell trên Linux, macOS, Windows, Raspberry Pi, các thiết bị nhúng và thiết bị Android có bật tính năng Tăng tốc GPU.
Tải xuống hoặc tạo tệp nhị phân
Tải các tệp nhị phân dòng lệnh được tạo sẵn hằng đêm xuống bằng cách làm theo các đường liên kết sau:
Bạn cũng có thể tạo tệp nhị phân điểm chuẩn từ nguồn trên máy tính.
bazel build -c opt //litert/tools:benchmark_model
Để tạo bằng chuỗi công cụ Android NDK, trước tiên, bạn cần thiết lập môi trường tạo bằng cách làm theo hướng dẫn này hoặc sử dụng hình ảnh docker như mô tả trong hướng dẫn này.
bazel build -c opt --config=android_arm64 \
//litert/tools:benchmark_model
Chạy phép đo điểm chuẩn
Để chạy các phép đo điểm chuẩn trên máy tính, hãy thực thi tệp nhị phân từ trình bao.
path/to/downloaded_or_built/benchmark_model \
--graph=your_model.tflite \
--num_threads=4
Bạn có thể sử dụng cùng một bộ tham số như đã đề cập trước đó với tệp nhị phân dòng lệnh dựng sẵn.
Trình tăng tốc GPU
Các tệp nhị phân tạo sẵn này bao gồm Trình tăng tốc GPU LiteRT mới. Nền tảng này hỗ trợ OpenCL và WebGPU được hỗ trợ bởi Vulkan (Linux), Metal (MacOS) và Direct3D (Windows).
Để sử dụng Trình tăng tốc GPU, hãy truyền cờ --use_gpu=true.
Các hoạt động về mô hình hồ sơ
Tệp nhị phân mô hình đo điểm chuẩn cũng cho phép bạn lập hồ sơ hoạt động của mô hình và nhận thời gian thực thi của từng toán tử. Để thực hiện việc này, hãy truyền cờ --use_profiler=true đến benchmark_model trong quá trình gọi.
Ứng dụng đo điểm chuẩn Android (sử dụng Interpreter API)
Chúng tôi cũng cung cấp một ứng dụng đo điểm chuẩn Android dựa trên Interpreter API phiên bản 1. Đây là một chỉ số tốt hơn về hiệu suất của mô hình trong một ứng dụng Android. Các số liệu từ công cụ đo điểm chuẩn vẫn sẽ hơi khác so với khi chạy suy luận bằng mô hình trong ứng dụng thực tế.
Ứng dụng đo điểm chuẩn Android này không có giao diện người dùng. Cài đặt và chạy bằng lệnh adb, đồng thời truy xuất kết quả bằng lệnh adb logcat.
Tải xuống hoặc tạo ứng dụng
Tải các ứng dụng đo điểm chuẩn Android được tạo sẵn hằng đêm xuống bằng các đường liên kết sau:
Đối với các ứng dụng đo điểm chuẩn Android hỗ trợ các hoạt động TF thông qua Uỷ quyền linh hoạt, hãy sử dụng các đường liên kết bên dưới:
Bạn cũng có thể tạo ứng dụng từ nguồn bằng cách làm theo hướng dẫn này.
Chuẩn bị điểm chuẩn
Trước khi chạy ứng dụng đo điểm chuẩn, hãy cài đặt ứng dụng và đẩy tệp mô hình vào thiết bị như sau:
adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp
Chạy phép đo điểm chuẩn
adb shell am start -S \
-n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
--es args '"--graph=/data/local/tmp/your_model.tflite \
--num_threads=4"'
graph là một tham số bắt buộc.
graph:string
Đường dẫn đến tệp mô hình TFLite.
Bạn có thể chỉ định thêm các tham số không bắt buộc để chạy phép đo điểm chuẩn.
num_threads:int(mặc định=1)
Số luồng dùng để chạy trình thông dịch TFLite.use_gpu:bool(mặc định=false)
Sử dụng uỷ quyền GPU.use_xnnpack:bool(mặc định=false)
Sử dụng uỷ quyền XNNPACK.
Tuỳ thuộc vào thiết bị bạn đang dùng, một số lựa chọn trong số này có thể không dùng được hoặc không có tác dụng. Tham khảo các thông số để biết thêm các thông số hiệu suất mà bạn có thể chạy bằng ứng dụng đo điểm chuẩn.
Xem kết quả bằng lệnh logcat:
adb logcat | grep "Inference timings"
Kết quả đo điểm chuẩn được báo cáo như sau:
... tflite : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2
Ứng dụng đo điểm chuẩn iOS
Để chạy các điểm chuẩn trên thiết bị iOS, bạn cần tạo ứng dụng từ nguồn.
Đặt tệp mô hình LiteRT vào thư mục benchmark_data của cây nguồn và sửa đổi tệp benchmark_params.json. Những tệp đó được đóng gói vào ứng dụng và ứng dụng sẽ đọc dữ liệu từ thư mục. Truy cập vào ứng dụng đo điểm chuẩn iOS để xem hướng dẫn chi tiết.
Điểm chuẩn hiệu suất cho các mô hình nổi tiếng
Phần này liệt kê các điểm chuẩn hiệu suất của LiteRT khi chạy các mô hình nổi tiếng trên một số thiết bị Android và iOS.
Điểm chuẩn hiệu suất Android
Các số liệu đo điểm chuẩn hiệu suất này được tạo bằng tệp nhị phân đo điểm chuẩn gốc.
Đối với các điểm chuẩn Android, mức độ liên kết CPU được đặt để sử dụng các lõi lớn trên thiết bị nhằm giảm sự khác biệt (xem thông tin chi tiết).
Ví dụ này giả định rằng các mô hình đã được tải xuống và giải nén vào thư mục /data/local/tmp/tflite_models. Nhị phân điểm chuẩn được tạo bằng các hướng dẫn này và được giả định là nằm trong thư mục /data/local/tmp.
Cách chạy phép đo điểm chuẩn:
adb shell /data/local/tmp/benchmark_model \
--num_threads=4 \
--graph=/data/local/tmp/tflite_models/${GRAPH} \
--warmup_runs=1 \
--num_runs=50
Để chạy với uỷ quyền GPU, hãy đặt --use_gpu=true.
Các giá trị hiệu suất bên dưới được đo lường trên Android 10.
| Tên mô hình | Thiết bị | CPU, 4 luồng | GPU |
|---|---|---|---|
| Mobilenet_1.0_224(float) | Pixel 3 | 23,9 mili giây | 6,45 mili giây |
| Pixel 4 | 14 mili giây | 9 mili giây | |
| Mobilenet_1.0_224 (quant) | Pixel 3 | 13,4 mili giây | --- |
| Pixel 4 | 5 mili giây | --- | |
| NASNet mobile | Pixel 3 | 56 mili giây | --- |
| Pixel 4 | 34,5 mili giây | --- | |
| SqueezeNet | Pixel 3 | 35,8 mili giây | 9,5 mili giây |
| Pixel 4 | 23,9 mili giây | 11,1 mili giây | |
| Inception_ResNet_V2 | Pixel 3 | 422 mili giây | 99,8 mili giây |
| Pixel 4 | 272,6 mili giây | 87,2 mili giây | |
| Inception_V4 | Pixel 3 | 486 mili giây | 93 mili giây |
| Pixel 4 | 324,1 mili giây | 97,6 mili giây |
Điểm chuẩn về hiệu suất trên iOS
Những số liệu đo điểm chuẩn hiệu suất này được tạo bằng ứng dụng đo điểm chuẩn iOS.
Để chạy các phép đo điểm chuẩn trên iOS, ứng dụng đo điểm chuẩn đã được sửa đổi để đưa vào mô hình thích hợp và benchmark_params.json đã được sửa đổi để đặt num_threads thành 2. Để sử dụng uỷ quyền GPU, các lựa chọn "use_gpu" : "1" và "gpu_wait_type" : "aggressive" cũng được thêm vào benchmark_params.json.
| Tên mô hình | Thiết bị | CPU, 2 luồng | GPU |
|---|---|---|---|
| Mobilenet_1.0_224(float) | iPhone XS | 14,8 mili giây | 3,4 mili giây |
| Mobilenet_1.0_224 (quant) | iPhone XS | 11 mili giây | --- |
| NASNet mobile | iPhone XS | 30,4 mili giây | --- |
| SqueezeNet | iPhone XS | 21,1 mili giây | 15,5 mili giây |
| Inception_ResNet_V2 | iPhone XS | 261,1 mili giây | 45,7 mili giây |
| Inception_V4 | iPhone XS | 309 mili giây | 54,4 mili giây |
Theo dõi các thành phần bên trong của LiteRT
Theo dõi các thành phần bên trong LiteRT trong Android
Các công cụ theo dõi Android có thể ghi lại các sự kiện nội bộ từ trình thông dịch LiteRT của một ứng dụng Android. Đây là những sự kiện giống với API Trace của Android, vì vậy, các sự kiện được ghi lại từ mã Java/Kotlin sẽ xuất hiện cùng với các sự kiện nội bộ của LiteRT.
Sau đây là một số ví dụ về sự kiện:
- Lời gọi toán tử
- Sửa đổi biểu đồ theo uỷ quyền
- Phân bổ tensor
Trong số các lựa chọn để ghi lại dấu vết, hướng dẫn này đề cập đến Trình phân tích tài nguyên CPU của Android Studio và ứng dụng Theo dõi hệ thống. Hãy tham khảo công cụ dòng lệnh Perfetto hoặc công cụ dòng lệnh Systrace để biết các lựa chọn khác.
Thêm sự kiện theo dõi trong mã Java
Đây là một đoạn mã trong ứng dụng mẫu Phân loại hình ảnh. Trình thông dịch LiteRT chạy trong phần recognizeImage/runInference. Bước này không bắt buộc nhưng hữu ích để giúp bạn nhận thấy nơi thực hiện lệnh gọi suy luận.
Trace.beginSection("recognizeImage");
...
// Runs the inference call.
Trace.beginSection("runInference");
tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
Trace.endSection();
...
Trace.endSection();
Bật tính năng theo dõi LiteRT
Để bật tính năng theo dõi LiteRT, hãy đặt thuộc tính hệ thống Android debug.tflite.trace thành 1 trước khi khởi động ứng dụng Android.
adb shell setprop debug.tflite.trace 1
Nếu thuộc tính này được đặt khi trình thông dịch LiteRT được khởi tạo, thì các sự kiện chính (ví dụ: lệnh gọi toán tử) từ trình thông dịch sẽ được theo dõi.
Sau khi bạn ghi lại tất cả các dấu vết, hãy tắt tính năng theo dõi bằng cách đặt giá trị thuộc tính thành 0.
adb shell setprop debug.tflite.trace 0
Trình phân tích CPU của Android Studio
Ghi lại dấu vết bằng Trình phân tích tài nguyên CPU của Android Studio bằng cách làm theo các bước bên dưới:
Chọn Run > Profile 'app' (Chạy > Hồ sơ "ứng dụng") trong trình đơn trên cùng.
Nhấp vào vị trí bất kỳ trong tiến trình CPU khi cửa sổ Trình phân tích tài nguyên xuất hiện.
Chọn "Trace System Calls" (Theo dõi các lệnh gọi hệ thống) trong số các chế độ Phân tích CPU.

Nhấn vào nút "Ghi".
Nhấn nút "Dừng".
Điều tra kết quả theo dõi.

Trong ví dụ này, bạn có thể thấy hệ thống phân cấp các sự kiện trong một luồng và số liệu thống kê cho từng thời gian hoạt động, đồng thời xem luồng dữ liệu của toàn bộ ứng dụng giữa các luồng.
Ứng dụng Theo dõi hệ thống
Ghi lại dấu vết mà không cần Android Studio bằng cách làm theo các bước được trình bày chi tiết trong phần Ứng dụng System Tracing.
Trong ví dụ này, các sự kiện TFLite tương tự đã được ghi lại và lưu ở định dạng Perfetto hoặc Systrace, tuỳ thuộc vào phiên bản của thiết bị Android. Bạn có thể mở các tệp dấu vết đã ghi lại trong Giao diện người dùng Perfetto.

Theo dõi các thành phần bên trong của LiteRT trong iOS
Instruments có trong Xcode có thể ghi lại các sự kiện nội bộ từ trình thông dịch LiteRT của một ứng dụng iOS. Đây là các sự kiện signpost iOS, vì vậy, các sự kiện được ghi lại từ mã Swift/Objective-C sẽ xuất hiện cùng với các sự kiện nội bộ của LiteRT.
Sau đây là một số ví dụ về sự kiện:
- Lời gọi toán tử
- Sửa đổi biểu đồ theo uỷ quyền
- Phân bổ tensor
Bật tính năng theo dõi LiteRT
Đặt biến môi trường debug.tflite.trace bằng cách làm theo các bước dưới đây:
Chọn Product > Scheme > Edit Scheme... (Sản phẩm > Lược đồ > Chỉnh sửa lược đồ) trong trình đơn trên cùng của Xcode.
Nhấp vào "Hồ sơ" trong ngăn bên trái.
Bỏ chọn hộp đánh dấu "Sử dụng các đối số và biến môi trường của thao tác Chạy".
Thêm
debug.tflite.tracetrong phần "Biến môi trường".
Nếu bạn muốn loại trừ các sự kiện LiteRT khi lập hồ sơ ứng dụng iOS, hãy tắt tính năng theo dõi bằng cách xoá biến môi trường.
XCode Instruments
Ghi lại dấu vết bằng cách làm theo các bước bên dưới:
Chọn Product > Profile (Sản phẩm > Hồ sơ) trong trình đơn trên cùng của Xcode.
Nhấp vào Logging (Ghi nhật ký) trong số các mẫu lập hồ sơ khi công cụ Instruments khởi chạy.
Nhấn nút "Bắt đầu".
Nhấn nút "Dừng".
Nhấp vào "os_signpost" để mở rộng các mục trong hệ thống con Ghi nhật ký OS.
Nhấp vào hệ thống con Ghi nhật ký hệ điều hành "org.tensorflow.lite".
Điều tra kết quả theo dõi.

Trong ví dụ này, bạn có thể thấy hệ thống phân cấp các sự kiện và số liệu thống kê cho từng thời gian hoạt động.
Sử dụng dữ liệu theo dõi
Dữ liệu theo dõi cho phép bạn xác định các nút thắt cổ chai về hiệu suất.
Sau đây là một số ví dụ về thông tin chi tiết mà bạn có thể nhận được từ trình phân tích tài nguyên và các giải pháp tiềm năng để cải thiện hiệu suất:
- Nếu số lượng lõi CPU có sẵn nhỏ hơn số lượng luồng suy luận, thì chi phí lập lịch CPU có thể dẫn đến hiệu suất kém. Bạn có thể lên lịch lại các tác vụ khác sử dụng nhiều CPU trong ứng dụng để tránh trùng lặp với suy luận mô hình hoặc điều chỉnh số lượng luồng thông dịch.
- Nếu các toán tử không được uỷ quyền hoàn toàn, thì một số phần của biểu đồ mô hình sẽ được thực thi trên CPU thay vì trình tăng tốc phần cứng dự kiến. Bạn có thể thay thế các toán tử không được hỗ trợ bằng các toán tử tương tự được hỗ trợ.