Sử dụng đơ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 . Việc 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 để đạt được 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 các mạng thần kinh sâu, bao gồm một số lượng lớn các toán tử, mỗi toán tử làm việc trên các bộ căng đầ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ả sử dụng điện - 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 điện nă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ề việc 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 hoặc hoạt động TensorFlow ML, 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 ở độ 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
-
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. Việc bật hỗ trợ lượng tử hóa sẽ bậ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, thì 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 tạo ra 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ời gian chạy thực tế. Khi kiểm tra việc thực thi mô hình của bạn với người được ủy quyền GPU, bạn nên cảnh giác về 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ải là mô hình 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.
Các mô hình ví dụ
Các mô hình ví dụ sau đượ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ột 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 thiết bị di động và nhúng. ( mô hình )
- Phân đoạn DeepLab (257x257) - mô hình phân đoạn hình ảnh chỉ định 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. ( mô hình )
- Phát hiện đối tượng SSD MobileNet - Một mô hình phân loại hình ảnh phát hiện nhiều đối tượng có hộp giới hạn. ( mô hình )
- PoseNet để ước tính tư thế - 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. ( mô hình )
Tối ưu hóa cho GPU
Các kỹ thuật sau có thể giúp bạn có đượ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 cho 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 hoạt động định hình lại và xem xét điều đó có thể chỉ được áp dụng để khám phá dữ liệu hoặc cho các lần lặp lại đầu tiên 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 đó, phép tính trên tensor có hình dạng
[B,H,W,5]
thực hiện giống nhau trên tensor hình[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ợ khung hình ảnh trong RGBA, việc cấp dữ liệu đầu vào 4 kênh đó nhanh hơn đáng kể, vì nó tránh 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 với kiến trúc mạng được tối ưu hóa cho thiết bị di động. Tối ưu hóa cho hội nghị trên thiết bị có thể giảm đáng kể độ trễ và tiêu thụ điện năng bằng cách tận dụng các tính năng 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 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 đây mô tả chi tiết hơn các kỹ thuật này.
Sử dụng 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 khóa đào tạo nhận thức Lượng tử hóa
- Lượng tử hóa dải động sau đào tạo
- Lượng tử hóa số nguyên đầy đủ 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ả bộ căng đầu vào và đầu ra dấu phẩy động.
Cái này hoạt động ra sao?
Vì phần phụ trợ GPU chỉ hỗ trợ thực thi dấu phẩy động, chúng tôi chạy các mô hình 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 gốc. Ở cấp độ cao, điều này đòi hỏi các bước sau:
Các yếu tố căng không đổi (chẳng hạn như trọng lượng / độ lệch) được khử lượng tử một lần vào bộ nhớ GPU. Thao tác này xảy ra khi đại biểu được bật cho TensorFlow Lite.
Đầu vào và đầu ra của chương trình GPU, nếu 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 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.
Các 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 mà các đơn vị hoạt động mong đợi các kích hoạt tuân theo các giới hạn đã họ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 ủy quyền 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 thời gian khởi động lên đến 90%. 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 với một số 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. Trên thiết bị Android, sử dụng
getCodeCacheDir()
trỏ đến 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ách sử dụng các thư viện như
farmhash::Fingerprint64
.