Đại biểu GPU cho TensorFlow Lite

Việc sử dụng bộ 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 để có thông lượng cao cho 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 lưới 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 tensor đầ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 suất năng lượng - GPU thực hiện tính toán ML theo cách rất hiệu quả và tối ưu, 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 thông tin 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 hoặc hoạt động của 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 với độ chính xác nổi 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. Việc bật hỗ trợ lượng tử hóa sẽ kích hoạt các phiên bản phù hợp, ví dụ: THÊM v2.

Hỗ trợ GPU khắc phục sự cố

Nếu một số hoạt động không được đại biểu GPU hỗ trợ, khung sẽ chỉ chạy một phần 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 chia 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 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 trong 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 đại biểu GPU, bạn nên cảnh giác với những cảnh báo này. Phần lớn các cảnh báo này có thể cho thấy 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 tái cấu trúc mô hình.

Mô hình ví dụ

Các mô hình ví dụ 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:

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:

  • Hoạt động định hình lại - Một số hoạt động diễn ra nhanh chóng trên CPU có thể gây tốn kém 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 khi 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à cân nhắc rằng hoạt động đó có thể chỉ được áp dụng để khám phá dữ liệu hoặc để lặp lại mô hình ban đầu của bạn. Loại bỏ chúng có thể cải thiện đáng kể hiệu suất.

  • 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] sẽ thực hiện tương tự trên tensor có hình dạng [B,H,W,8] , nhưng tệ 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 ở 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 trình 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. Việc tối ưu hóa chức năng suy luận trên thiết bị có thể giảm đáng kể độ trễ và mức 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 nâng cao, bổ sung 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ả các kỹ thuật này chi tiết hơn.

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:

Để tối ưu hóa hiệu suất, hãy sử dụng các mô hình có cả tensor đầu vào và đầu ra dấu phẩy động.

Cái này hoạt động ra sao?

Do phần 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 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 đòi hỏi các bước sau:

  • Các tensor không đổi (chẳng hạn như trọng số/độ lệch) được khử lượng tử hóa một lần vào bộ nhớ GPU. Thao tác này xảy ra khi tính năng đại biểu đượ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 suy luận. Hoạt động này được thực hiện trên CPU bằng cách sử dụng hạt 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 hoạt động mong đợi việc 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:

Giảm thời gian khởi tạo bằng tuần tự hóa

Tính năng ủy quyền GPU cho phép bạn tải từ mã hạt 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 việc biên dịch lại và có thể giảm thời gian khởi động tới 90%. Sự cải thiệ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 số tùy chọn cấu hình, như minh họa trong các ví dụ về 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ẫu phải là duy nhất cho thiết bị dành cho kiểu máy 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 .