Đại biểu TensorFlow Lite

Giới thiệu

Các đại biểu cho phép tăng tốc phần cứng của các mô hình TensorFlow Lite bằng cách tận dụng các bộ tăng tốc trên thiết bị như GPU và Bộ xử lý tín hiệu số (DSP) .

Theo mặc định, TensorFlow Lite sử dụng nhân CPU được tối ưu hóa cho tập lệnh ARM Neon . Tuy nhiên, CPU là bộ xử lý đa năng không nhất thiết phải được tối ưu hóa cho số học nặng thường thấy trong các mô hình Machine Learning (ví dụ: toán ma trận liên quan đến các lớp tích chập và dày đặc).

Mặt khác, hầu hết các điện thoại di động hiện đại đều chứa chip có khả năng xử lý các tác vụ nặng này tốt hơn. Việc sử dụng chúng cho các hoạt động của mạng thần kinh mang lại lợi ích to lớn về độ trễ và hiệu quả sử dụng năng lượng. Ví dụ: GPU có thể tăng tốc độ trễ lên gấp 5 lần , trong khi Qualcomm® Hexagon DSP đã cho thấy khả năng giảm mức tiêu thụ điện năng tới 75% trong các thử nghiệm của chúng tôi.

Mỗi trình tăng tốc này đều có các API liên kết cho phép tính toán tùy chỉnh, chẳng hạn như OpenCL hoặc OpenGL ES cho GPU di động và Qualcomm® Hexagon SDK cho DSP. Thông thường, bạn sẽ phải viết rất nhiều mã tùy chỉnh để chạy mạng thần kinh thông qua các giao diện này. Mọi thứ càng trở nên phức tạp hơn khi bạn cho rằng mỗi máy gia tốc đều có ưu và nhược điểm và không thể thực hiện mọi thao tác trong mạng nơ-ron. API đại biểu của TensorFlow Lite giải quyết vấn đề này bằng cách đóng vai trò là cầu nối giữa thời gian chạy TFLite và các API cấp thấp hơn này.

thời gian chạy với các đại biểu

Lựa chọn đại biểu

TensorFlow Lite hỗ trợ nhiều đại biểu, mỗi đại biểu được tối ưu hóa cho (các) nền tảng nhất định và các loại mô hình cụ thể. Thông thường, sẽ có nhiều đại biểu áp dụng cho trường hợp sử dụng của bạn, tùy thuộc vào hai tiêu chí chính: Nền tảng (Android hoặc iOS?) mà bạn nhắm mục tiêu và Loại mô hình (dấu phẩy động hoặc lượng tử hóa?) mà bạn đang cố gắng tăng tốc .

Đại biểu theo nền tảng

Đa nền tảng (Android và iOS)

  • Đại biểu GPU - Đại biểu GPU có thể được sử dụng trên cả Android và iOS. Nó được tối ưu hóa để chạy các mô hình dựa trên float 32 bit và 16 bit có sẵn GPU. Nó cũng hỗ trợ các mô hình lượng tử hóa 8 bit và cung cấp hiệu suất GPU ngang bằng với các phiên bản float của chúng. Để biết chi tiết về đại biểu GPU, hãy xem TensorFlow Lite trên GPU . Để biết hướng dẫn từng bước về cách sử dụng đại biểu GPU với Android và iOS, hãy xem Hướng dẫn đại biểu GPU TensorFlow Lite .

Android

  • Đại biểu NNAPI cho các thiết bị Android mới hơn - Đại biểu NNAPI có thể được sử dụng để tăng tốc các mô hình trên thiết bị Android có sẵn GPU, DSP và/hoặc NPU. Nó có sẵn trong Android 8.1 (API 27+) trở lên. Để biết tổng quan về đại biểu NNAPI, hướng dẫn từng bước và cách thực hành tốt nhất, hãy xem TensorFlow Lite NNAPI delegate .
  • Đại biểu lục giác cho các thiết bị Android cũ hơn - Đại biểu lục giác có thể được sử dụng để tăng tốc các mô hình trên thiết bị Android với Qualcomm Hexagon DSP. Nó có thể được sử dụng trên các thiết bị chạy phiên bản Android cũ hơn không hỗ trợ NNAPI. Xem đại biểu TensorFlow Lite Hexagon để biết thêm chi tiết.

iOS

  • Đại biểu Core ML cho iPhone và iPad mới hơn - Đối với iPhone và iPad mới hơn có sẵn Neural Engine, bạn có thể sử dụng đại biểu Core ML để tăng tốc suy luận cho các mô hình dấu phẩy động 32 bit hoặc 16 bit. Neural Engine có sẵn trên các thiết bị di động Apple có A12 SoC trở lên. Để biết tổng quan về đại biểu Core ML và hướng dẫn từng bước, hãy xem đại biểu TensorFlow Lite Core ML .

Đại biểu theo loại mô hình

Mỗi máy gia tốc được thiết kế với độ rộng bit nhất định của dữ liệu. Nếu bạn cung cấp mô hình dấu phẩy động cho một đại biểu chỉ hỗ trợ các hoạt động lượng tử hóa 8 bit (chẳng hạn như đại biểu Hexagon ), nó sẽ từ chối tất cả các hoạt động của nó và mô hình sẽ chạy hoàn toàn trên CPU. Để tránh những điều bất ngờ như vậy, bảng bên dưới cung cấp thông tin tổng quan về hỗ trợ đại biểu dựa trên loại mô hình:

Loại mô hình GPU NNAPI Hình lục giác CoreML
Dấu phẩy động (32 bit) Đúng Đúng KHÔNG Đúng
Lượng tử hóa float16 sau đào tạo Đúng KHÔNG KHÔNG Đúng
Lượng tử hóa phạm vi động sau đào tạo Đúng Đúng KHÔNG KHÔNG
Lượng tử hóa số nguyên sau đào tạo Đúng Đúng Đúng KHÔNG
Đào tạo nhận thức lượng tử hóa Đúng Đúng Đúng KHÔNG

Xác thực hiệu suất

Thông tin trong phần này đóng vai trò như một hướng dẫn sơ bộ để chọn lọc các đại biểu có thể cải thiện đơn đăng ký của bạn. Tuy nhiên, điều quan trọng cần lưu ý là mỗi đại biểu có một tập hợp các hoạt động được xác định trước mà nó hỗ trợ và có thể thực hiện khác nhau tùy thuộc vào kiểu máy và thiết bị; ví dụ: đại biểu NNAPI có thể chọn sử dụng Edge-TPU của Google trên điện thoại Pixel trong khi sử dụng DSP trên thiết bị khác. Do đó, bạn nên thực hiện một số điểm chuẩn để đánh giá mức độ hữu ích của đại biểu đối với nhu cầu của bạn. Điều này cũng giúp biện minh cho việc tăng kích thước nhị phân liên quan đến việc gắn một đại biểu vào thời gian chạy TensorFlow Lite.

TensorFlow Lite có công cụ đánh giá độ chính xác và hiệu suất mở rộng có thể giúp các nhà phát triển tự tin sử dụng đại biểu trong ứng dụng của họ. Những công cụ này sẽ được thảo luận trong phần tiếp theo.

Công cụ đánh giá

Độ trễ và dấu chân bộ nhớ

Công cụ đo điểm chuẩn của TensorFlow Lite có thể được sử dụng với các tham số phù hợp để ước tính hiệu suất mô hình, bao gồm độ trễ suy luận trung bình, chi phí khởi tạo, dung lượng bộ nhớ, v.v. Công cụ này hỗ trợ nhiều cờ để tìm ra cấu hình đại biểu tốt nhất cho mô hình của bạn. Ví dụ: --gpu_backend=gl có thể được chỉ định bằng --use_gpu để đo khả năng thực thi GPU bằng OpenGL. Danh sách đầy đủ các tham số đại biểu được hỗ trợ được xác định trong tài liệu chi tiết .

Dưới đây là một ví dụ chạy cho mô hình lượng tử hóa có GPU thông qua adb :

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

Bạn có thể tải xuống phiên bản dựng sẵn của công cụ này dành cho Android, kiến ​​trúc ARM 64-bit tại đây ( chi tiết hơn ).

Độ chính xác và đúng đắn

Các đại biểu thường thực hiện tính toán ở độ chính xác khác với các đối tác CPU của họ. Kết quả là có sự cân bằng về độ chính xác (thường là nhỏ) liên quan đến việc sử dụng đại biểu để tăng tốc phần cứng. Lưu ý rằng điều này không phải lúc nào cũng đúng; ví dụ: do GPU sử dụng độ chính xác của dấu phẩy động để chạy các mô hình lượng tử hóa nên có thể có một chút cải thiện về độ chính xác (ví dụ: cải thiện <1% Top-5 trong phân loại hình ảnh ILSVRC).

TensorFlow Lite có hai loại công cụ để đo lường mức độ chính xác của một đại biểu đối với một mô hình nhất định: Dựa trên nhiệm vụBất khả tri về nhiệm vụ . Tất cả các công cụ được mô tả trong phần này đều hỗ trợ các tham số ủy quyền nâng cao được sử dụng bởi công cụ đo điểm chuẩn ở phần trước. Lưu ý rằng các phần phụ bên dưới tập trung vào đánh giá đại biểu (Đại biểu có hoạt động giống như CPU ​​không?) thay vì đánh giá mô hình (Bản thân mô hình có phù hợp với nhiệm vụ không?).

Đánh giá dựa trên nhiệm vụ

TensorFlow Lite có các công cụ để đánh giá tính chính xác của hai tác vụ dựa trên hình ảnh:

Bạn có thể tìm thấy các tệp nhị phân dựng sẵn của các công cụ này (Android, kiến ​​trúc ARM 64-bit), cùng với tài liệu tại đây:

Ví dụ bên dưới minh họa việc đánh giá phân loại hình ảnh bằng NNAPI sử dụng Edge-TPU của Google trên Pixel 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

Đầu ra dự kiến ​​​​là danh sách các số liệu Top-K từ 1 đến 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

Đánh giá bất khả tri về nhiệm vụ

Đối với các tác vụ không có công cụ đánh giá trên thiết bị được thiết lập hoặc nếu bạn đang thử nghiệm các mô hình tùy chỉnh, TensorFlow Lite có công cụ Inference Diff . (Android, nhị phân kiến ​​trúc nhị phân ARM 64-bit tại đây )

Suy luận khác biệt so sánh việc thực thi TensorFlow Lite (về độ trễ và độ lệch giá trị đầu ra) trong hai cài đặt:

  • Suy luận CPU đơn luồng
  • Suy luận do người dùng xác định - được xác định bởi các tham số này

Để làm như vậy, công cụ này tạo ra dữ liệu Gaussian ngẫu nhiên và chuyển nó qua hai Trình thông dịch TFLite - một chạy nhân CPU đơn luồng và cái còn lại được tham số hóa bởi các đối số của người dùng.

Nó đo độ trễ của cả hai, cũng như sự khác biệt tuyệt đối giữa các tensor đầu ra từ mỗi Phiên dịch, trên cơ sở từng phần tử.

Đối với một mô hình có một tenxơ đầu ra duy nhất, đầu ra có thể trông như thế này:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

Điều này có nghĩa là đối với tensor đầu ra ở chỉ số 0 , các phần tử từ đầu ra CPU khác với đầu ra của đại biểu trung bình là 1.96e-05 .

Lưu ý rằng việc giải thích những con số này đòi hỏi kiến ​​thức sâu hơn về mô hình và ý nghĩa của mỗi tensor đầu ra. Nếu đó là một hồi quy đơn giản xác định một số loại điểm hoặc mức nhúng, thì sự khác biệt sẽ ở mức thấp (nếu không thì đó là lỗi với đại biểu). Tuy nhiên, các kết quả đầu ra như 'lớp phát hiện' từ các mẫu SSD khó diễn giải hơn một chút. Ví dụ: nó có thể hiển thị sự khác biệt khi sử dụng công cụ này, nhưng điều đó có thể không có nghĩa là có điều gì đó thực sự sai với đại biểu: hãy xem xét hai lớp (giả): "TV (ID: 10)", "Monitor (ID:20)" - Nếu một đại biểu hơi xa sự thật vàng và hiển thị màn hình thay vì TV, chênh lệch đầu ra cho tensor này có thể cao tới 20-10 = 10.