Việc sử dụng các đơn vị xử lý đồ họa (GPU) để chạy các mô hình máy học (ML) của bạn có thể cải thiện đáng kể hiệu suất của mô hình và trải nghiệm người dùng của các ứng dụng hỗ trợ ML của bạn. TensorFlow Lite cho phép sử dụng GPU và các bộ xử lý chuyên dụng khác thông qua trình điều khiển phần cứng được gọi là đại biểu . Cho phép sử dụng GPU với các ứng dụng TensorFlow Lite ML của bạn có thể mang lại những lợi ích sau:
- Tốc độ - GPU được xây dựng cho thông lượng cao của khối lượng công việc song song lớn. Thiết kế này làm cho chúng rất phù hợp với mạng nơ-ron sâu, bao gồm một số lượng lớn người vận hành, mỗi người làm việc trên các tenxơ đầu vào có thể được xử lý song song, điều này thường dẫn đến độ trễ thấp hơn. Trong trường hợp tốt nhất, việc chạy mô hình của bạn trên GPU có thể chạy đủ nhanh để kích hoạt các ứng dụng thời gian thực mà trước đây không thể thực hiện được.
- Hiệu quả năng lượng - GPU thực hiện tính toán ML theo cách rất hiệu quả và được tối ưu hóa, thường tiêu thụ ít năng lượng hơn và tạo ra ít nhiệt hơn so với cùng một tác vụ chạy trên CPU.
Tài liệu này cung cấp tổng quan về hỗ trợ GPU trong TensorFlow Lite và một số cách sử dụng nâng cao cho bộ xử lý GPU. Để biết thêm thông tin cụ thể về cách triển khai hỗ trợ GPU trên các nền tảng cụ thể, hãy xem các hướng dẫn sau:
Hỗ trợ hoạt động GPU ML
Có một số hạn chế đối với những hoạt động của TensorFlow ML, hoặc ops , có thể được tăng tốc bởi đại biểu GPU TensorFlow Lite. Đại biểu hỗ trợ các hoạt động sau với độ chính xác float 16-bit và 32-bit:
-
ADD
-
AVERAGE_POOL_2D
-
CONCATENATION
-
CONV_2D
-
DEPTHWISE_CONV_2D v1-2
-
EXP
-
FULLY_CONNECTED
-
LOGICAL_AND
-
LOGISTIC
-
LSTM v2 (Basic LSTM only)
-
MAX_POOL_2D
-
MAXIMUM
-
MINIMUM
-
MUL
-
PAD
-
PRELU
-
RELU
-
RELU6
-
RESHAPE
-
RESIZE_BILINEAR v1-3
-
SOFTMAX
-
STRIDED_SLICE
-
SUB
-
TRANSPOSE_CONV
Theo mặc định, tất cả các hoạt động chỉ được hỗ trợ ở phiên bản 1. Kích hoạt hỗ trợ lượng tử hóa sẽ kích hoạt các phiên bản thích hợp, ví dụ: ADD v2.
Khắc phục sự cố hỗ trợ GPU
Nếu một số hoạt động không được hỗ trợ bởi đại biểu GPU, khung sẽ chỉ chạy một phần của biểu đồ trên GPU và phần còn lại trên CPU. Do chi phí đồng bộ hóa CPU/GPU cao, chế độ thực thi phân tách như thế này thường dẫn đến hiệu suất chậm hơn so với khi toàn bộ mạng chỉ chạy trên CPU. Trong trường hợp này, ứng dụng sẽ tạo cảnh báo, chẳng hạn như:
WARNING: op code #42 cannot be handled by this delegate.
Không có lệnh gọi lại cho các lỗi thuộc loại này, vì đây không phải là lỗi thực tế trong thời gian chạy. Khi kiểm tra việc thực thi mô hình của bạn với đại biểu GPU, bạn nên cảnh giác với những cảnh báo này. Một số lượng lớn các cảnh báo này có thể chỉ ra rằng mô hình của bạn không phù hợp nhất để sử dụng cho việc tăng tốc GPU và có thể yêu cầu cấu trúc lại mô hình.
mẫu ví dụ
Các mô hình mẫu sau đây được xây dựng để tận dụng khả năng tăng tốc GPU với TensorFlow Lite và được cung cấp để tham khảo và thử nghiệm:
- Phân loại hình ảnh MobileNet v1 (224x224) - Mô hình phân loại hình ảnh được thiết kế cho các ứng dụng thị giác dựa trên di động và nhúng. ( người mẫu )
- Phân đoạn DeepLab (257x257) - mô hình phân đoạn hình ảnh gán các nhãn ngữ nghĩa, chẳng hạn như chó, mèo, ô tô, cho mọi pixel trong hình ảnh đầu vào. ( người mẫu )
- MobileNet SSD phát hiện đối tượng - Một mô hình phân loại hình ảnh phát hiện nhiều đối tượng với các hộp giới hạn. ( người mẫu )
- PoseNet để ước tính tư thế - Một mô hình tầm nhìn ước tính tư thế của mọi người trong hình ảnh hoặc video. ( người mẫu )
Tối ưu hóa cho GPU
Các kỹ thuật sau đây có thể giúp bạn đạt được hiệu suất tốt hơn khi chạy các mô hình trên phần cứng GPU bằng cách sử dụng đại biểu GPU TensorFlow Lite:
Định hình lại hoạt động - Một số hoạt động nhanh trên CPU có thể có chi phí cao đối với GPU trên thiết bị di động. Các hoạt động định hình lại đặc biệt tốn kém để chạy, bao gồm
BATCH_TO_SPACE
,SPACE_TO_BATCH
,SPACE_TO_DEPTH
, v.v. Bạn nên kiểm tra chặt chẽ việc sử dụng các thao tác định hình lại và cân nhắc rằng điều đó có thể chỉ được áp dụng cho việc khám phá dữ liệu hoặc cho các lần lặp lại sớm của mô hình của bạn. Loại bỏ chúng có thể cải thiện đáng kể hiệu suất.Các kênh dữ liệu hình ảnh - Trên GPU, dữ liệu tensor được chia thành 4 kênh và do đó, tính toán trên tensor có hình dạng
[B,H,W,5]
thực hiện tương tự trên tensor có hình dạng[B,H,W,8]
, nhưng kém hơn đáng kể so với[B,H,W,4]
. Nếu phần cứng máy ảnh bạn đang sử dụng hỗ trợ các khung hình ảnh trong RGBA, thì việc cung cấp đầu vào 4 kênh đó sẽ nhanh hơn đáng kể, vì nó tránh được việc sao chép bộ nhớ từ RGB 3 kênh sang RGBX 4 kênh.Các mô hình được tối ưu hóa cho thiết bị di động - Để có hiệu suất tốt nhất, bạn nên xem xét đào tạo lại bộ phân loại của mình bằng kiến trúc mạng được tối ưu hóa cho thiết bị di động. Tối ưu hóa cho suy luận trên thiết bị có thể giảm đáng kể độ trễ và mức tiêu thụ năng lượng bằng cách tận dụng các tính năng của phần cứng di động.
Hỗ trợ GPU nâng cao
Bạn có thể sử dụng các kỹ thuật bổ sung, nâng cao với quá trình xử lý GPU để mang lại hiệu suất tốt hơn nữa cho các mô hình của mình, bao gồm cả lượng tử hóa và tuần tự hóa. Các phần sau mô tả các kỹ thuật này chi tiết hơn.
Sử dụng các mô hình lượng tử hóa
Phần này giải thích cách đại biểu GPU tăng tốc các mô hình lượng tử hóa 8 bit, bao gồm những điều sau:
- Các mô hình được đào tạo với đào tạo nhận biết lượng tử hóa
- Lượng tử hóa phạm vi động sau đào tạo
- Lượng tử hóa toàn bộ số nguyên sau đào tạo
Để tối ưu hóa hiệu suất, hãy sử dụng các mô hình có cả tenxơ đầu vào và đầu ra dấu phẩy động.
Cái này hoạt động ra sao?
Vì chương trình phụ trợ GPU chỉ hỗ trợ thực thi dấu phẩy động nên chúng tôi chạy các mô hình được lượng tử hóa bằng cách cung cấp cho nó 'chế độ xem dấu phẩy động' của mô hình ban đầu. Ở cấp độ cao, điều này bao gồm các bước sau:
Các tenxơ không đổi (chẳng hạn như trọng số/độ lệch) được khử lượng tử một lần vào bộ nhớ GPU. Hoạt động này xảy ra khi người được ủy quyền được bật cho TensorFlow Lite.
Đầu vào và đầu ra của chương trình GPU, nếu được lượng tử hóa 8 bit, sẽ được khử lượng tử hóa và lượng tử hóa (tương ứng) cho mỗi lần suy luận. Thao tác này được thực hiện trên CPU bằng cách sử dụng các nhân được tối ưu hóa của TensorFlow Lite.
Trình mô phỏng lượng tử hóa được chèn vào giữa các hoạt động để bắt chước hành vi lượng tử hóa. Cách tiếp cận này là cần thiết cho các mô hình trong đó các op mong đợi kích hoạt tuân theo các giới hạn đã học được trong quá trình lượng tử hóa.
Để biết thông tin về cách bật tính năng này với đại biểu GPU, hãy xem phần sau:
- Sử dụng các mô hình lượng tử hóa với GPU trên Android
- Sử dụng các mô hình lượng tử hóa với GPU trên iOS
Giảm thời gian khởi tạo với tuần tự hóa
Tính năng đại biểu GPU cho phép bạn tải từ mã nhân được biên dịch trước và dữ liệu mô hình được tuần tự hóa và lưu trên đĩa từ các lần chạy trước. Cách tiếp cận này tránh biên dịch lại và có thể giảm tới 90% thời gian khởi động. Cải tiến này đạt được bằng cách trao đổi không gian đĩa để tiết kiệm thời gian. Bạn có thể bật tính năng này bằng một vài tùy chọn cấu hình, như được hiển thị trong các ví dụ mã sau:
C++
TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default(); options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION; options.serialization_dir = kTmpDir; options.model_token = kModelToken; auto* delegate = TfLiteGpuDelegateV2Create(options); if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
Java
GpuDelegate delegate = new GpuDelegate( new GpuDelegate.Options().setSerializationParams( /* serializationDir= */ serializationDir, /* modelToken= */ modelToken)); Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
Khi sử dụng tính năng tuần tự hóa, hãy đảm bảo mã của bạn tuân thủ các quy tắc triển khai sau:
- Lưu trữ dữ liệu tuần tự hóa trong một thư mục mà các ứng dụng khác không thể truy cập được. Trên thiết bị Android, hãy sử dụng
getCodeCacheDir()
trỏ đến một vị trí riêng tư đối với ứng dụng hiện tại. - Mã thông báo mô hình phải là duy nhất cho thiết bị cho mô hình cụ thể. Bạn có thể tính toán mã thông báo mô hình bằng cách tạo dấu vân tay từ dữ liệu mô hình bằng các thư viện như
farmhash::Fingerprint64
.