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 kỹ thuật 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à một 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 Học máy (ví dụ: phép toán ma trận liên quan đến tích chập và các lớp dày đặc).
Mặt khác, hầu hết các điện thoại di động hiện đại đều có chip xử lý tốt hơn các hoạt động nặng này. Việc sử dụng chúng cho các hoạt động mạng nơ-ron mang lại những lợi ích to lớn về độ trễ và hiệu quả sử dụng điện năng. Ví dụ: GPU có thể tăng tốc độ trễ lên đến 5x , trong khi Qualcomm® Hexagon DSP đã cho thấy khả năng giảm tiêu thụ điện năng lên tới 75% trong các thử nghiệm của chúng tôi.
Mỗi bộ tăng tốc này đều có các API được 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ột mạng nơ-ron thông qua các giao diện này. Mọi thứ thậm chí còn phức tạp hơn khi bạn cho rằng mỗi bộ tăng tốc đều có ưu và nhược điểm và không thể thực hiện mọi hoạt động trong mạng nơ-ron. API đại diện của TensorFlow Lite giải quyết vấn đề này bằng cách hoạt động như một cầu nối giữa thời gian chạy TFLite và các API cấp thấp hơn này.
Chọn một đại diện
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 diện á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 hay iOS?) Mà bạn nhắm mục tiêu và Loại mô hình (dấu phẩy động hay 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)
- Ủy quyền GPU - Người ủy quyền 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 khi 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 GPU ủy quyền với Android và iOS, hãy xem Hướng dẫn sử dụng GPU ủy quyền 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ác phương pháp hay nhất, hãy xem đại biểu NNAPI của TensorFlow Lite .
- Đại biểu Hexagon cho các thiết bị Android cũ hơn - Đại biểu Hexagon 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 khi Neural Engine khả dụng, bạn có thể sử dụng Core ML ủy quyền để tăng tốc suy luận cho các kiểu 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 của Apple với A12 SoC hoặc cao hơ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 bộ tăng tốc được thiết kế với một độ 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 bất ngờ như vậy, bảng dưới đây cung cấp tổng quan về hỗ trợ ủy quyền 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 dải độ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 những người được ủy quyền có thể cải thiện ứng dụng 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 nhóm 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 một thiết bị khác. Do đó, bạn thường nên thực hiện một số phép đo điểm chuẩn để đánh giá mức độ hữu ích của một đạ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á hiệu suất và độ chính xác mở rộng có thể trao quyền cho các nhà phát triển tự tin trong việc sử dụng các đạ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ễ & dấu chân bộ nhớ
Công cụ đ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 với --use_gpu
để đo hiệu suất GPU với 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ột mô hình lượng tử hóa với GPU 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 ( thêm chi tiết ).
Độ chính xác & tính đúng đắn
Các đại biểu thường thực hiện các phép tính với độ chính xác khác với các đối tác CPU của họ. Do đó, có một sự đánh đổi (thường là nhỏ) về độ chính xác liên quan đến việc sử dụng một đạ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ụ: vì GPU sử dụng độ chính xác 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 hành vi 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ụ và dựa trên nhiệm vụ-bất khả tri . Tất cả các công cụ được mô tả trong phần này 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 từ phần trước. Lưu ý rằng các phần phụ bên dưới tập trung vào đánh giá ủy quyền (Người ủy quyền có hoạt động giống như CPU không?) Hơn là đánh giá mô hình (Bản thân mô hình có tốt cho 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 đúng đắn của hai tác vụ dựa trên hình ảnh:
ILSVRC 2012 (Phân loại hình ảnh) với độ chính xác hàng đầu
Phát hiện đối tượng COCO (w / hộp giới hạn) với độ chính xác trung bình trung bình (mAP)
Bạn có thể tìm thấy các tệp nhị phân được tạo 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 hướng dẫn tại đây:
Ví dụ dưới đây minh họa đánh giá phân loại hình ảnh với 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 chỉ số 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á nhiệm vụ-bất khả tri
Đố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 với các mô hình tùy chỉnh, TensorFlow Lite có công cụ Inference Diff . (Android, kiến trúc nhị phân 64-bit ARM nhị phân tại đây )
Inference Diff so sánh việc thực thi TensorFlow Lite (về độ trễ & độ 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ụ tạo ra dữ liệu Gaussian ngẫu nhiên và chuyển nó qua hai Bộ thông dịch TFLite - một bộ đang chạy các nhân CPU đơn luồng và bộ kia đượ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 bộ căng đầu ra từ mỗi Bộ thông dịch, trên cơ sở mỗi phần tử.
Đối với một mô hình có một tensor đầu ra duy nhất, đầu ra có thể giống như sau:
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 đại biểu trung bình là 1.96e-05
.
Lưu ý rằng việc diễn giải những con số này đòi hỏi kiến thức sâu hơn về mô hình và những gì mỗi tensor đầu ra biểu thị. Nếu nó là một hồi quy đơn giản xác định một số loại điểm hoặc nhúng, thì sự khác biệt phải thấp (nếu không thì đó là lỗi với người được ủy quyền). Tuy nhiên, các kết quả đầu ra như 'lớp phát hiện' từ các kiểu SSD khó hiểu hơn một chút. Ví dụ: nó có thể cho thấy 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à thực sự có gì đó không ổn với người được ủy quyền: 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, sự khác biệt đầu ra cho tensor này có thể là một cái gì đó cao như 20-10 = 10.