Ủy quyền TensorFlow Lite

Đối tượng đại diện cho phép tăng tốc phần cứng cho các mô hình TensorFlow Lite bằng cách tận dụng các trình 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 các nhân CPU được tối ưu hoá cho tập lệnh ARM Neon. Tuy nhiên, CPU là bộ xử lý đa năng không cần thiết được tối ưu hoá cho số học nặng thường thấy trong các mô hình Học máy (ví dụ: toán học ma trận liên quan đến tích chập và 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 chứa các loại chip tốt hơn trong việc xử lý các thao tác nặng này. Việc sử dụng giải pháp này cho các hoạt động của mạng nơron mang lại lợi ích to lớn về độ trễ và hiệu quả sử dụng điện năng. Ví dụ: GPU có thể cung cấp độ trễ tăng tốc lên tới 5 lần.

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 tuỳ chỉnh, chẳng hạn như OpenCL hoặc OpenGL ES cho GPU di động. Thông thường, bạn sẽ phải viết nhiều mã tuỳ chỉnh để chạy 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 trình tăng tốc đều có những ưu và nhược điểm riêng, đồng thời không thể thực hiện mọi thao tác trong mạng nơron. API uỷ quyền của TensorFlow Lite giúp 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 đại diện

Chọn người được uỷ quyền

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

Người được uỷ quyền theo nền tảng

Nhiều nền tảng (Android và iOS)

  • Uỷ quyền của GPU – Bạn có thể sử dụng uỷ quyền của GPU trên cả Android và iOS. Thư viện này được tối ưu hoá để chạy các mô hình dựa trên độ chính xác đơn 32 bit và 16 bit dựa trên độ chính xác đơn khi có GPU. API này cũng hỗ trợ các mô hình lượng tử hoá 8 bit và cung cấp hiệu suất GPU tương đương với các phiên bản có độ chính xác đơn. Để biết thông tin chi tiết về uỷ quyền GPU, vui lòng xem bài viết TensorFlow Lite trên GPU.

iOS

  • Đối tượng uỷ quyền học máy chính cho iPhone và iPad mới hơn – Đối với iPhone và iPad đời mới hơn (có công cụ Neural Engine), bạn có thể sử dụng uỷ quyền học máy Core để 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 của Apple có A12 SoC trở lên. Để biết thông tin tổng quan về việc uỷ quyền cho công nghệ học máy Core ML và hướng dẫn từng bước, hãy xem bài viết Uỷ quyền cho công nghệ học máy của TensorFlow Lite Core.

Số uỷ quyền theo loại mô hình

Mỗi trình 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 uỷ quyền chỉ hỗ trợ các thao tác lượng tử hoá 8 bit, thì mô hình đó sẽ từ chối tất cả các thao tác 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 thông tin tổng quan về chế độ hỗ trợ uỷ quyền dựa trên loại mô hình:

Loại mô hình GPU CoreML
Dấu phẩy động (32 bit)
Định lượng lượng tử float16 sau quá trình đào tạo
Định lượng dải động sau khi đào tạo Không
Định lượng số nguyên sau khi đào tạo Không
Đào tạo nhận biết lượng tử Không

Đang xác thực hiệu suất

Thông tin trong phần này đóng vai trò là nguyên tắc sơ bộ để lập danh sách rút gọn các đại diệ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 thực thể uỷ quyền có một tập hợp thao tác được xác định trước mà nó hỗ trợ, đồng thời có thể hoạt động theo cách khác nhau tuỳ thuộc vào kiểu máy và thiết bị. Do đó, thông thường, bạn 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 thực thể uỷ quyền đối với nhu cầu của bạn. Điều này cũng giúp chứng minh việc tăng kích thước nhị phân liên quan đến việc đính kèm thực thể đại diện 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 chuyên sâu có thể giúp các nhà phát triển yên tâm sử dụng thực thể đại diện 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à mức sử dụng bộ nhớ

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

Dưới đây là ví dụ chạy cho mô hình lượng tử hoá 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 phiên bản tạo sẵn của công cụ này xuống cho Android, kiến trúc ARM 64 bit tại đây (xem thêm thông tin chi tiết).

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

Thực thể đại diện thường thực hiện các phép tính với độ chính xác khác với độ chính xác của CPU. Do đó, sẽ có một sự đánh đổi độ chính xác (thường không đáng kể) liên quan đến việc sử dụng thực thể đại diện để tăng tốc phần cứng. Lưu ý điều này không phải luôn đú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ử hoá, nên độ chính xác có thể cải thiện đôi chút (ví dụ: <1% cải thiện trong số 5 vị trí hàng đầu trong phân loại hình ảnh ILSVRC).

TensorFlow Lite có 2 loại công cụ giúp đo lường hành vi chính xác của uỷ quyền trong một mô hình nhất định: Task-Based (Dựa trên tác vụ) và Task-Agnostic (Không phụ thuộc vào nhiệm vụ). Tất cả công cụ được mô tả trong phần này đều hỗ trợ tham số uỷ quyền nâng cao mà công cụ đo điểm chuẩn sử dụng trong phần trước. Xin lưu ý rằng các phần phụ dưới đây tập trung vào đánh giá uỷ quyền (Uỷ quyền 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ó tốt cho tác vụ không?).

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

TensorFlow Lite có các công cụ để đánh giá mức độ chính xác cho 2 nhiệm vụ dựa trên hình ảnh:

Tệp nhị phân 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 có tại đây:

Ví dụ bên dưới minh hoạ việc đánh giá việc phân loại hình ảnh bằng GPU 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_gpu=true

Kết quả 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á không phụ thuộc vào nhiệm vụ

Đối với những nhiệm vụ chưa 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 tuỳ chỉnh, TensorFlow Lite có công cụ Inference Diff. (Android, tệp nhị phân của cấu trúc nhị phân ARM 64 bit tại đây)

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

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

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

Chỉ số này đo độ trễ của cả hai, cũng như chênh lệch tuyệt đối giữa các tensor đầu ra từ mỗi Trình thông dịch, trên cơ sở từng phần tử.

Đối với mô hình có một tensor đầu ra duy nhất, dữ liệu đầu ra có thể có dạ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

Tức là đối với tensor đầu ra tại chỉ mục 0, các phần tử trong đầu ra của CPU khác với đầu ra uỷ quyền với giá trị trung bình là 1.96e-05.

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