Đo lường hiệu suất

Công cụ đo điểm chuẩn

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:

  • 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 ở trạng thái ổn định
  • Mức sử dụng bộ nhớ trong thời gian khởi chạy
  • Mức sử dụng bộ nhớ chung

Các công cụ đo điểm chuẩn được cung cấp dưới dạng ứng dụng đo điểm chuẩn cho Android và iOS cũng như tệp nhị phân dòng lệnh gốc và chúng đều có cùng hiệu suất cốt lõi logic đo lường. Xin lưu ý rằng các tuỳ chọn có sẵn và định dạng đầu ra hơi khác nhau do sự khác biệt về môi trường thời gian chạy.

Ứng dụng đo điểm chuẩn Android

Có hai cách sử dụng công cụ đo điểm chuẩn với Android. Một là tệp nhị phân đo điểm chuẩn gốc và một tệp nhị phân khác là Android ứng dụng điểm chuẩn, một đánh giá tốt hơn về hiệu suất của mô hình trong ứng dụng. Một trong hai thì số liệu từ công cụ đo điểm chuẩn vẫn sẽ hơi khác so với chạy suy luận với 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 ứng dụng đó bằng cách sử dụng adb và truy xuất kết quả bằng cách sử dụ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 dưới đây:

Đối với các ứng dụng đo điểm chuẩn Android có hỗ trợ hoạt động TF thông qua tính năng 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 các hướng dẫn.

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 đ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 các tham số không bắt buộc khác để chạy điểm chuẩn.

Tuỳ thuộc vào thiết bị bạn đang sử dụng, một số lựa chọn sau có thể không hiện có hoặc không có tác dụng. Tham khảo tham số để biết thêm thông số hiệu suất mà bạn có thể chạy bằng ứng dụng đ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

Điểm chuẩn gốc nhị phân

Công cụ đo điểm chuẩn cũng được cung cấp dưới dạng benchmark_model nhị phân gốc. Bạn có thể thực thi công cụ này từ một dòng lệnh shell trên Linux, Mac, các thiết bị được nhúng và Thiết bị Android.

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 gốc được tạo sẵn vào ban đêm bằng cách làm theo các đường liên kết bên dưới:

Đối với các tệp nhị phân được tạo sẵn vào ban đêm có hỗ trợ hoạt động TF thông qua tính năng 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 tệp nhị phân điểm chuẩn gốc từ nguồn trên máy tính của bạn.

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

Để tạo bằng chuỗi công cụ Android NDK, bạn cần thiết lập môi trường tạo bản dựng trước tiên bằng cách làm theo hướng dẫn hoặc sử dụng hình ảnh docker như được mô tả trong hướng dẫn.

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

Chạy điểm chuẩn

Để chạy phép đo điểm chuẩn trên máy tính, hãy thực thi tệp nhị phân từ shell.

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 nhóm tham số như đã đề cập ở trên với tệp nhị phân của dòng lệnh gốc.

Hoạt động phân tích mô hình

Tệp nhị phân của mô hình đ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 mỗi toán tử. Để thực hiện việc này, hãy chuyển cờ --enable_op_profiling=true đến benchmark_model trong khi gọi. Thông tin chi tiết là đã giải thích tại đây.

Tệp nhị phân điểm chuẩn gốc cho nhiều lựa chọn về hiệu suất trong một lần chạy

Một tệp nhị phân C++ thuận tiện và đơn giản cũng được cung cấp để Đo điểm chuẩn nhiều lựa chọn về hiệu suất trong một lần chạy. Tệp nhị phân này được tạo dựa trên công cụ đo điểm chuẩn nêu trên chỉ có thể đo điểm chuẩn một tuỳ chọn hiệu suất tại một thời điểm. Họ chia sẻ cùng một quy trình tạo/cài đặt/chạy, nhưng tên mục tiêu BUILD của tệp nhị phân này là benchmark_model_performance_options và cần thêm một số tham số. Một tham số quan trọng cho tệp nhị phân này là:

perf_options_list: string (default='all')
Danh sách các lựa chọn về hiệu suất của TFLite được phân tách bằng dấu phẩy để đo điểm chuẩn.

Bạn có thể tải các tệp nhị phân được tạo sẵn hằng đêm cho công cụ này như trong danh sách dưới đây:

Ứng dụng đo điểm chuẩn iOS

Để chạy phép đo đ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 benchmark_data thư mục của cây nguồn và sửa đổi tệp benchmark_params.json. Những các 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/ghé qua thời gian Ứng dụng đo điểm chuẩn iOS để được 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 LiteRT khi hoạt động tốt 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 đ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 của Android, đối tượng tương đồng của CPU được thiết lập để sử dụng các lõi lớn trên thiết bị để giảm phương sai (xem chi tiết).

Công cụ 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. Tệp nhị phân điểm chuẩn được tạo bằng hướng dẫn tại đây và được giả định là nằm trong thư mục /data/local/tmp.

Cách chạy đ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 bằng tính năng uỷ quyền GPU, hãy đặt --use_gpu=true.

Các giá trị hiệu suất dưới đây đượ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 dành cho thiết bị di động 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 hiệu suất iOS

Các số liệu điểm chuẩn hiệu suất này được tạo bằng Ứng dụng điểm chuẩn iOS.

Để chạy phép đo điểm chuẩn iOS, ứng dụng đo điểm chuẩn đã được sửa đổi để bao gồm các biến phù hợp mô hình và benchmark_params.json đã được sửa đổi để đặt num_threads thành 2. Để sử dụng tuỳ chọn uỷ quyền GPU, "use_gpu" : "1""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 dành cho thiết bị di động 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 nội bộ LiteRT

Theo dõi bên trong LiteRT trong Android

Các sự kiện nội bộ từ trình phiên dịch LiteRT của một ứng dụng Android có thể người chụp Công cụ theo dõi trên Android. Chúng là những sự kiện tương tự với Android Trace, vì vậy Các sự kiện được thu thập từ mã Java/Kotlin sẽ được xem cùng với LiteRT sự kiện nội bộ.

Một số ví dụ về các sự kiện là:

  • Lệnh gọi nhà cung cấp dịch vụ
  • Sửa đổi biểu đồ theo uỷ quyền
  • phân bổ Tensor

Trong số các cách khác nhau để ghi lại dấu vết, hướng dẫn này đề cập đến Android Trình phân tích CPU trong Studio và ứng dụng Theo dõi hệ thống. Tham khảo Công cụ dòng lệnh Perfetto hoặc Công cụ dòng lệnh Systrace để có 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ã từ Phân loại hình ảnh ứng dụng mẫu. Trình phiên dịch LiteRT chạy trong Phần recognizeImage/runInference. Bước này không bắt buộc nhưng sẽ hữu ích khi giúp chú ý vị trí mà lệnh gọi suy luận được thực hiệ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 đến 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 khởi động, các sự kiện chính (ví dụ: lệnh gọi toán tử) từ trình phiên dịch sẽ được theo dõi.

Sau khi bạn đã ghi lại tất 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 trong Android Studio

Ghi lại dấu vết bằng Trình phân tích CPU trong Android Studio bằng cách làm theo các bước dưới đây:

  1. Chọn Run > (Chạy >) Phân tích tài nguyên "app" trong trình đơn trên cùng.

  2. Nhấp vào vị trí bất kỳ trong tiến trình của CPU khi cửa sổ Trình phân tích tài nguyên xuất hiện.

  3. Chọn "Theo dõi lệnh gọi hệ thống" trong số các chế độ Lập hồ sơ CPU.

    Chọn "Theo dõi lệnh gọi hệ thống"

  4. Nhấn 'Ghi' .

  5. Nhấn 'Dừng' .

  6. Kiểm tra kết quả theo dõi.

    Dấu vết trong Android Studio

Trong ví dụ này, bạn có thể thấy hệ phân cấp sự kiện trong một chuỗi và số liệu thống kê cho từng thời gian của nhà vận hành, đồng thời xem luồng dữ liệu của toàn bộ ứng dụng giữa 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 nêu chi tiết trong Ứng dụng Theo dõi hệ thống.

Trong ví dụ này, các sự kiện TFLite tương tự đã được ghi lại và lưu vào Perfetto hoặc định dạng Systrace tuỳ thuộc vào phiên bản của thiết bị Android. Ảnh chụp tệp theo dõi có thể được mở trong giao diện người dùng Perfetto.

Dấu vết Perfetto

Theo dõi nội bộ LiteRT trong iOS

Các sự kiện nội bộ từ trình thông dịch LiteRT của một ứng dụng iOS có thể người chụp Nhạc cụ công cụ có trong Xcode. Đó là iOS signpost các sự kiện, để các sự kiện được ghi lại từ mã Swift/Mục tiêu-C sẽ được nhìn thấy cùng nhau với các sự kiện nội bộ LiteRT.

Một số ví dụ về các sự kiện là:

  • Lệnh gọi nhà cung cấp dịch vụ
  • 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:

  1. Chọn Sản phẩm > Lược đồ > Chỉnh sửa lược đồ... từ trình đơn trên cùng của Xcode.

  2. Nhấp vào 'Hồ sơ' trong ngăn bên trái.

  3. Bỏ chọn "Use the Run action's arguments and environment variables" (Sử dụng các đối số và biến môi trường của thao tác Chạy) hộp kiểm.

  4. Thêm debug.tflite.trace trong "Biến môi trường" .

    Đặt biến môi trường

Nếu bạn muốn loại trừ các sự kiện LiteRT khi phân tích tài nguyên ứng dụng iOS, tắt tính năng theo dõi bằng cách xoá biến môi trường.

Công cụ XCode

Ghi lại dấu vết bằng cách làm theo các bước dưới đây:

  1. Chọn Sản phẩm > Phân tích tài nguyên trên trình đơn trên cùng của Xcode.

  2. Nhấp vào Logging (Ghi nhật ký) trong số các mẫu lập hồ sơ khi công cụ Công cụ chạy.

  3. Nhấn "Bắt đầu" .

  4. Nhấn 'Dừng' .

  5. Nhấp vào 'os_signpost' để mở rộng các mục con trong hệ thống Ghi nhật ký hệ điều hành.

  6. Nhấp vào "org.tensorflow.lite" Hệ thống phụ Ghi nhật ký hệ điều hành.

  7. Kiểm tra kết quả theo dõi.

    Dấu vết công cụ Xcode

Trong ví dụ này, bạn có thể thấy hệ thống phân cấp sự kiện và số liệu thống kê cho mỗi thời gian của nhà vận hành.

Sử dụng dữ liệu theo dõi

Dữ liệu theo dõi giúp bạn xác định điểm tắc nghẽn về hiệu suất.

Dưới đâ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õi CPU có sẵn nhỏ hơn số lượng suy luận thì mức hao tổn lập lịch của CPU có thể dẫn đến hiệu suất dưới mức. Bạn có thể lên lịch lại cho các tác vụ cần nhiều CPU khác trong ứng dụng của mình để tránh trùng với suy luận mô hình của bạn hoặc điều chỉnh số lượng trình phiên dịch luồng.
  • Nếu các toán tử không được uỷ quyền đầy đủ, thì một số phần của biểu đồ mô hình đượ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ế những toán tử không được hỗ trợ bằng các toán tử tương tự được hỗ trợ.