Menggunakan graphics processing unit (GPU) untuk menjalankan model machine learning (ML) Anda dapat secara dramatis meningkatkan performa model Anda dan pengalaman pengguna dari aplikasi Anda yang mendukung ML. TensorFlow Lite memungkinkan penggunaan GPU dan prosesor khusus lainnya melalui driver perangkat keras yang disebut delegate . Mengaktifkan penggunaan GPU dengan aplikasi TensorFlow Lite ML dapat memberikan manfaat berikut:
- Kecepatan - GPU dibuat untuk throughput tinggi dari beban kerja paralel yang masif. Desain ini membuatnya sangat cocok untuk jaringan saraf dalam, yang terdiri dari sejumlah besar operator, masing-masing bekerja pada tensor input yang dapat diproses secara paralel, yang biasanya menghasilkan latensi yang lebih rendah. Dalam skenario terbaik, menjalankan model Anda pada GPU dapat berjalan cukup cepat untuk mengaktifkan aplikasi real-time yang sebelumnya tidak memungkinkan.
- Efisiensi daya - GPU menjalankan komputasi ML dengan cara yang sangat efisien dan dioptimalkan, biasanya mengonsumsi lebih sedikit daya dan menghasilkan lebih sedikit panas daripada tugas yang sama yang dijalankan pada CPU.
Dokumen ini memberikan ikhtisar dukungan GPU di TensorFlow Lite, dan beberapa penggunaan tingkat lanjut untuk prosesor GPU. Untuk informasi yang lebih spesifik tentang penerapan dukungan GPU pada platform tertentu, lihat panduan berikut:
Dukungan operasi GPU ML
Ada beberapa batasan tentang apa operasi TensorFlow ML, atau ops , yang dapat dipercepat oleh delegasi GPU TensorFlow Lite. Delegasi 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 pada versi 1. Mengaktifkan dukungan kuantisasi 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 sisanya di CPU. Karena tingginya biaya sinkronisasi CPU/GPU, mode eksekusi terpisah seperti ini sering kali menghasilkan kinerja yang lebih lambat daripada saat seluruh jaringan dijalankan pada CPU saja. Dalam hal ini, aplikasi menghasilkan peringatan, seperti:
WARNING: op code #42 cannot be handled by this delegate.
Tidak ada panggilan balik untuk kegagalan jenis ini, karena ini bukan kegagalan waktu proses yang sebenarnya. Saat menguji eksekusi model Anda dengan delegasi GPU, Anda harus waspada terhadap peringatan ini. Banyaknya peringatan ini dapat menunjukkan bahwa model Anda tidak cocok untuk digunakan untuk akselerasi GPU, dan mungkin memerlukan pemfaktoran ulang model.
Contoh model
Model contoh berikut dibuat untuk memanfaatkan akselerasi GPU dengan TensorFlow Lite dan disediakan untuk referensi dan pengujian:
- Klasifikasi gambar MobileNet v1 (224x224) - Model klasifikasi gambar yang dirancang untuk aplikasi penglihatan berbasis seluler dan tersemat. ( model )
- Segmentasi DeepLab (257x257) - model segmentasi gambar yang memberikan label semantik, seperti anjing, kucing, mobil, ke setiap piksel dalam gambar masukan. ( model )
- Deteksi objek MobileNet SSD - Model klasifikasi gambar yang mendeteksi beberapa objek dengan kotak pembatas. ( model )
- PoseNet untuk estimasi pose - Model visi yang memperkirakan pose orang dalam gambar atau video. ( model )
Mengoptimalkan untuk GPU
Teknik berikut dapat membantu Anda mendapatkan kinerja yang lebih baik saat menjalankan model pada perangkat keras GPU menggunakan delegasi GPU TensorFlow Lite:
Membentuk ulang operasi - Beberapa operasi yang cepat pada CPU mungkin memerlukan biaya tinggi untuk GPU pada perangkat seluler. Operasi pembentukan ulang sangat mahal untuk dijalankan, termasuk
BATCH_TO_SPACE
,SPACE_TO_BATCH
,SPACE_TO_DEPTH
, dan sebagainya. Anda harus memeriksa dengan cermat penggunaan operasi pembentukan ulang, dan mempertimbangkan bahwa mungkin telah diterapkan hanya untuk menjelajahi data atau untuk iterasi awal model Anda. Menghapusnya dapat meningkatkan kinerja secara signifikan.Saluran data gambar - Pada GPU, data tensor diiris menjadi 4 saluran, sehingga komputasi pada tensor dengan bentuk
[B,H,W,5]
memiliki kinerja yang hampir sama pada tensor dengan bentuk[B,H,W,8]
, tetapi secara signifikan lebih buruk daripada[B,H,W,4]
. Jika perangkat keras kamera yang Anda gunakan mendukung bingkai gambar dalam RGBA, memasukkan input 4 saluran itu secara signifikan lebih cepat, karena menghindari salinan memori dari RGB 3 saluran ke RGBX 4 saluran.Model yang dioptimalkan untuk seluler - Untuk kinerja terbaik, Anda harus mempertimbangkan untuk melatih ulang penggolong Anda dengan arsitektur jaringan yang dioptimalkan untuk seluler. Pengoptimalan untuk inferensi pada perangkat dapat secara dramatis mengurangi latensi dan konsumsi daya dengan memanfaatkan fitur perangkat keras seluler.
Dukungan GPU tingkat lanjut
Anda dapat menggunakan teknik lanjutan tambahan dengan pemrosesan GPU untuk memungkinkan kinerja yang lebih baik lagi untuk model Anda, termasuk kuantisasi dan serialisasi. Bagian berikut menjelaskan teknik ini secara lebih rinci.
Menggunakan model terkuantisasi
Bagian ini menjelaskan bagaimana delegasi GPU mempercepat model terkuantisasi 8-bit, termasuk yang berikut:
- Model dilatih dengan pelatihan sadar kuantisasi
- Kuantisasi rentang dinamis pasca-pelatihan
- Kuantisasi bilangan bulat penuh pasca-pelatihan
Untuk mengoptimalkan performa, gunakan model yang memiliki tensor input dan output floating-point.
Bagaimana cara kerjanya?
Karena backend GPU hanya mendukung eksekusi titik-mengambang, kami menjalankan model terkuantisasi dengan memberinya 'tampilan titik-mengambang' dari model aslinya. Pada tingkat tinggi, ini memerlukan langkah-langkah berikut:
Tensor konstan (seperti bobot/bias) didekuantisasi satu kali ke dalam memori GPU. Operasi ini terjadi saat delegasi diaktifkan untuk TensorFlow Lite.
Input dan output ke program GPU, jika terkuantisasi 8-bit, didekuantisasi dan dikuantisasi (masing-masing) untuk setiap inferensi. Operasi ini dilakukan pada CPU menggunakan kernel yang dioptimalkan TensorFlow Lite.
Simulator kuantisasi disisipkan di antara operasi untuk meniru perilaku terkuantisasi. Pendekatan ini diperlukan untuk model di mana operasi mengharapkan aktivasi mengikuti batas yang dipelajari selama kuantisasi.
Untuk informasi tentang mengaktifkan fitur ini dengan delegasi GPU, lihat berikut ini:
- Menggunakan model terkuantisasi dengan GPU di Android
- Menggunakan model terkuantisasi dengan GPU di iOS
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 proses sebelumnya. Pendekatan ini menghindari kompilasi ulang dan dapat mengurangi waktu startup hingga 90%. Peningkatan ini dicapai dengan menukar ruang disk untuk penghematan waktu. Anda dapat mengaktifkan fitur ini dengan beberapa opsi konfigurasi, seperti yang ditunjukkan pada 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;
Jawa
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 implementasi berikut:
- Simpan data serialisasi di direktori yang tidak dapat diakses oleh aplikasi lain. Di perangkat Android, gunakan
getCodeCacheDir()
yang menunjuk ke lokasi yang bersifat pribadi untuk aplikasi saat ini. - Token model harus unik untuk perangkat untuk model tertentu. Anda dapat menghitung token model dengan membuat sidik jari dari data model menggunakan pustaka seperti
farmhash::Fingerprint64
.