Delegasi GPU untuk TensorFlow Lite

Menggunakan unit pemrosesan grafis (GPU) untuk menjalankan model machine learning (ML) dapat meningkatkan performa model dan pengalaman pengguna aplikasi Anda secara signifikan pada aplikasi berkemampuan ML. TensorFlow Lite memungkinkan penggunaan GPU dan prosesor khusus lainnya melalui driver hardware yang disebut delegasi. Mengaktifkan penggunaan GPU dengan aplikasi TensorFlow Lite ML dapat memberikan manfaat berikut:

  • Kecepatan - GPU dibuat untuk throughput tinggi dengan beban kerja paralel yang masif. Desain ini membuatnya sangat cocok untuk jaringan neural dalam, yang terdiri dari sejumlah besar operator, masing-masing berfungsi pada tensor input yang dapat diproses secara paralel, yang biasanya menghasilkan latensi yang lebih rendah. Dalam skenario terbaik, menjalankan model Anda di GPU dapat berjalan cukup cepat untuk mengaktifkan aplikasi real-time yang sebelumnya tidak mungkin dilakukan.
  • Efisiensi daya - GPU melakukan komputasi ML dengan cara yang sangat efisien dan optimal, biasanya mengonsumsi lebih sedikit daya dan menghasilkan lebih sedikit panas dibandingkan tugas yang sama yang berjalan di CPU.

Dokumen ini memberikan ringkasan tentang dukungan GPU di TensorFlow Lite, dan beberapa penggunaan lanjutan untuk prosesor GPU. Untuk informasi yang lebih spesifik tentang mengimplementasikan dukungan GPU pada platform tertentu, lihat panduan berikut:

Dukungan operasi ML GPU

Ada beberapa batasan terkait operasi atau operasi TensorFlow ML yang dapat dipercepat oleh delegasi GPU TensorFlow Lite. Delegasi ini mendukung operasi berikut dalam presisi float 16-bit dan 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

Secara default, semua operasi hanya didukung di versi 1. Mengaktifkan dukungan kuantisasi akan mengaktifkan versi yang sesuai, misalnya, ADD v2.

Memecahkan masalah dukungan GPU

Jika beberapa operasi tidak didukung oleh delegasi GPU, framework hanya akan menjalankan sebagian grafik di GPU dan bagian lainnya di CPU. Karena tingginya biaya sinkronisasi CPU/GPU, mode eksekusi terpisah seperti ini sering kali menghasilkan performa yang lebih lambat daripada jika seluruh jaringan dijalankan hanya dengan CPU saja. Dalam hal ini, aplikasi akan menghasilkan peringatan, seperti:

WARNING: op code #42 cannot be handled by this delegate.

Tidak ada callback untuk kegagalan jenis ini, karena ini bukan kegagalan run-time yang sebenarnya. Saat menguji eksekusi model dengan delegasi GPU, Anda akan mengetahui peringatan ini. Peringatan ini dalam jumlah yang tinggi dapat menunjukkan bahwa model Anda tidak cocok digunakan untuk akselerasi GPU, dan mungkin memerlukan pemfaktoran ulang model.

Contoh model

Contoh model berikut dibuat untuk memanfaatkan akselerasi GPU dengan TensorFlow Lite dan disediakan untuk referensi serta pengujian:

Mengoptimalkan GPU

Teknik berikut dapat membantu Anda mendapatkan performa yang lebih baik saat menjalankan model di hardware GPU menggunakan delegasi GPU TensorFlow Lite:

  • Membentuk ulang operasi - Beberapa operasi yang cepat pada CPU mungkin memiliki biaya tinggi untuk GPU di perangkat seluler. Operasi membentuk ulang sangat mahal untuk dijalankan, termasuk BATCH_TO_SPACE, SPACE_TO_BATCH, SPACE_TO_DEPTH, dan sebagainya. Anda harus memeriksa dengan cermat penggunaan operasi bentuk ulang, dan mempertimbangkan bahwa operasi tersebut mungkin hanya diterapkan untuk menjelajahi data atau untuk iterasi awal model Anda. Menghapusnya dapat meningkatkan performa secara signifikan.

  • Saluran data gambar - Di GPU, data tensor dibagi menjadi 4 saluran, dan begitu pula fungsi komputasi pada tensor dengan bentuk [B,H,W,5] berperforma hampir sama pada tensor bentuk [B,H,W,8], tetapi jauh lebih buruk daripada [B,H,W,4]. Jika hardware kamera yang Anda gunakan mendukung frame gambar dalam RGBA, proses memasukkan input 4-saluran tersebut akan jauh lebih cepat karena menghindari salinan memori dari RGB 3-saluran ke RGBX 4-saluran.

  • Model yang dioptimalkan untuk seluler - Untuk mendapatkan performa terbaik, Anda harus mempertimbangkan untuk melatih ulang pengklasifikasi dengan arsitektur jaringan yang dioptimalkan untuk seluler. Pengoptimalan untuk inferensi di perangkat dapat mengurangi latensi dan konsumsi daya secara signifikan dengan memanfaatkan fitur hardware seluler.

Dukungan GPU lanjutan

Anda dapat menggunakan teknik tambahan yang canggih dengan pemrosesan GPU untuk menghasilkan performa yang lebih baik lagi untuk model Anda, termasuk kuantisasi dan serialisasi. Bagian berikut menjelaskan teknik ini secara lebih mendetail.

Menggunakan model terkuantisasi

Bagian ini menjelaskan cara delegasi GPU mempercepat model terkuantisasi 8 bit, termasuk:

Untuk mengoptimalkan performa, gunakan model yang memiliki tensor input dan output floating point.

Bagaimana cara kerjanya?

Karena backend GPU hanya mendukung eksekusi floating point, kami menjalankan model terkuantisasi dengan memberinya 'tampilan floating point' dari model aslinya. Pada tingkat tinggi, hal ini memerlukan langkah-langkah berikut:

  • Tensor konstan (seperti bobot/bias) dide-kuantisasi satu kali ke dalam memori GPU. Operasi ini terjadi jika delegasi diaktifkan untuk TensorFlow Lite.

  • Input dan output ke program GPU, jika terkuantisasi 8-bit, akan didekuantisasi dan dikuantisasi (masing-masing) untuk setiap inferensi. Operasi ini dilakukan di CPU menggunakan kernel TensorFlow Lite yang dioptimalkan.

  • Simulator kuantisasi disisipkan di antara operasi untuk meniru perilaku terkuantisasi. Pendekatan ini diperlukan untuk model yang operasinya mengharapkan aktivasi mengikuti batas yang dipelajari selama kuantisasi.

Untuk mengetahui informasi tentang cara mengaktifkan fitur ini dengan delegasi GPU, lihat hal berikut:

Mengurangi waktu inisialisasi dengan serialisasi

Fitur delegasi GPU memungkinkan Anda memuat dari kode kernel yang telah dikompilasi sebelumnya dan data model yang diserialisasi dan disimpan di disk dari operasi sebelumnya. Pendekatan ini menghindari kompilasi ulang dan dapat mengurangi waktu startup hingga 90%. Peningkatan ini dicapai dengan menukar kapasitas disk untuk menghemat waktu. Anda dapat mengaktifkan fitur ini dengan beberapa opsi konfigurasi, seperti yang ditunjukkan dalam contoh kode berikut:

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);
      

Saat menggunakan fitur serialisasi, pastikan kode Anda mematuhi aturan penerapan berikut:

  • Menyimpan data serialisasi dalam direktori yang tidak dapat diakses oleh aplikasi lain. Di perangkat Android, gunakan getCodeCacheDir() yang mengarah ke lokasi yang bersifat pribadi untuk aplikasi saat ini.
  • Token model harus unik bagi perangkat untuk model tertentu. Anda dapat menghitung token model dengan membuat sidik jari dari data model menggunakan library seperti farmhash::Fingerprint64.