TensorFlow.js berfungsi di browser dan Node.js, dan di kedua platform ada banyak konfigurasi berbeda yang tersedia. Setiap platform memiliki serangkaian pertimbangan unik yang akan memengaruhi cara aplikasi dikembangkan.
Di browser, TensorFlow.js mendukung perangkat seluler serta perangkat desktop. Setiap perangkat memiliki serangkaian batasan tertentu, seperti API WebGL yang tersedia, yang secara otomatis ditentukan dan dikonfigurasi untuk Anda.
Di Node.js, TensorFlow.js mendukung pengikatan langsung ke API TensorFlow atau berjalan dengan implementasi CPU vanilla yang lebih lambat.
Lingkungan
Saat program TensorFlow.js dijalankan, konfigurasi spesifiknya disebut lingkungan. Lingkungan terdiri dari satu backend global serta satu set flag yang mengontrol fitur-fitur mendetail dari TensorFlow.js.
Backend
TensorFlow.js mendukung beberapa backend berbeda yang mengimplementasikan penyimpanan tensor dan operasi matematika. Pada waktu tertentu, hanya satu backend yang aktif. Biasanya, TensorFlow.js akan secara otomatis memilih backend terbaik untuk Anda mengingat lingkungan saat ini. Namun, terkadang penting untuk mengetahui backend mana yang digunakan dan cara menggantinya.
Untuk menemukan backend mana yang Anda gunakan:
console.log(tf.getBackend());
Jika Anda ingin mengubah backend secara manual:
tf.setBackend('cpu');
console.log(tf.getBackend());
Backend WebGL
Backend WebGL, 'webgl', saat ini merupakan backend paling kuat untuk browser. Backend ini hingga 100x lebih cepat daripada backend CPU vanilla. Tensor disimpan sebagai tekstur WebGL dan operasi matematika diimplementasikan dalam shader WebGL. Berikut adalah beberapa hal berguna yang perlu diketahui saat menggunakan backend ini: \
Hindari memblokir utas UI
Ketika sebuah operasi dipanggil, seperti tf.matMul(a, b), hasil tf.Tensor dikembalikan secara sinkron, namun perhitungan perkalian matriks mungkin belum benar-benar siap. Ini berarti tf.Tensor yang dikembalikan hanyalah pegangan untuk perhitungan. Ketika Anda memanggil x.data()
atau x.array()
, nilai-nilai akan menyelesaikan ketika perhitungan telah benar-benar selesai. Hal ini membuat penting untuk menggunakan asynchronous x.data()
dan x.array()
metode atas rekan-rekan sinkron mereka x.dataSync()
dan x.arraySync()
untuk menghindari menghalangi thread UI saat selesai perhitungan.
Manajemen memori
Satu peringatan saat menggunakan backend WebGL adalah perlunya manajemen memori eksplisit. WebGLTextures, tempat penyimpanan data Tensor, tidak secara otomatis mengumpulkan sampah oleh browser.
Untuk menghancurkan memori dari tf.Tensor
, Anda dapat menggunakan dispose()
metode:
const a = tf.tensor([[1, 2], [3, 4]]);
a.dispose();
Sangat umum untuk menghubungkan beberapa operasi bersama-sama dalam suatu aplikasi. Memegang referensi ke semua variabel perantara untuk membuangnya dapat mengurangi keterbacaan kode. Untuk mengatasi masalah ini, TensorFlow.js menyediakan tf.tidy()
metode yang membersihkan semua tf.Tensor
s yang tidak dikembalikan oleh fungsi setelah melaksanakan itu, mirip dengan cara variabel lokal dibersihkan ketika fungsi dijalankan:
const a = tf.tensor([[1, 2], [3, 4]]);
const y = tf.tidy(() => {
const result = a.square().log().neg();
return result;
});
presisi
Pada perangkat seluler, WebGL mungkin hanya mendukung tekstur titik mengambang 16 bit. Namun, sebagian besar model pembelajaran mesin dilatih dengan bobot dan aktivasi floating point 32 bit. Hal ini dapat menyebabkan masalah presisi ketika port model untuk perangkat mobile seperti angka floating 16 bit hanya dapat mewakili angka di kisaran [0.000000059605, 65504]
. Ini berarti Anda harus berhati-hati agar bobot dan aktivasi dalam model Anda tidak melebihi kisaran ini. Untuk memeriksa apakah perangkat mendukung 32 bit tekstur, periksa nilai tf.ENV.getBool('WEBGL_RENDER_FLOAT32_CAPABLE')
, jika ini adalah palsu maka perangkat hanya mendukung 16 bit floating point tekstur. Anda dapat menggunakan tf.ENV.getBool('WEBGL_RENDER_FLOAT32_ENABLED')
untuk memeriksa apakah TensorFlow.js saat ini menggunakan 32 tekstur bit.
Kompilasi shader & unggahan tekstur
TensorFlow.js menjalankan operasi pada GPU dengan menjalankan program shader WebGL. Shader ini dirakit dan dikompilasi dengan malas ketika pengguna meminta untuk menjalankan operasi. Kompilasi shader terjadi pada CPU di utas utama dan bisa lambat. TensorFlow.js akan meng-cache shader yang dikompilasi secara otomatis, membuat panggilan kedua ke operasi yang sama dengan tensor input dan output dengan bentuk yang sama jauh lebih cepat. Biasanya, aplikasi TensorFlow.js akan menggunakan operasi yang sama beberapa kali selama masa pakai aplikasi, sehingga melewati model pembelajaran mesin yang kedua jauh lebih cepat.
TensorFlow.js juga menyimpan data tf.Tensor sebagai WebGLTextures. Ketika tf.Tensor
dibuat, kita tidak segera meng-upload data ke GPU, bukan kita menyimpan data pada CPU sampai tf.Tensor
digunakan dalam operasi. Jika tf.Tensor
digunakan kedua kalinya, data yang sudah di GPU sehingga tidak ada biaya upload. Dalam model pembelajaran mesin yang khas, ini berarti bobot diunggah selama prediksi pertama melalui model dan lintasan kedua melalui model akan jauh lebih cepat.
Jika Anda peduli dengan performa prediksi pertama melalui model atau kode TensorFlow.js Anda, sebaiknya pemanasan model dengan meneruskan Tensor input dengan bentuk yang sama sebelum data nyata digunakan.
Sebagai contoh:
const model = await tf.loadLayersModel(modelUrl);
// Warmup the model before using real data.
const warmupResult = model.predict(tf.zeros(inputShape));
warmupResult.dataSync();
warmupResult.dispose();
// The second predict() will be much faster
const result = model.predict(userData);
Backend TensorFlow Node.js
Di backend TensorFlow Node.js, 'node', TensorFlow C API digunakan untuk mempercepat operasi. Ini akan menggunakan akselerasi perangkat keras yang tersedia pada mesin, seperti CUDA, jika tersedia.
Dalam backend ini, seperti backend WebGL, operasi kembali tf.Tensor
s serempak. Namun, tidak seperti backend WebGL, operasi selesai sebelum Anda mendapatkan kembali tensor. Ini berarti bahwa panggilan untuk tf.matMul(a, b)
akan memblokir thread UI.
Karena alasan ini, jika Anda ingin menggunakan ini dalam aplikasi produksi, Anda harus menjalankan TensorFlow.js di utas pekerja agar tidak memblokir utas utama.
Untuk informasi lebih lanjut tentang Node.js, lihat panduan ini.
latar belakang WASM
TensorFlow.js menyediakan backend WebAssembly ( wasm
), yang menawarkan CPU percepatan dan dapat digunakan sebagai alternatif untuk vanili JavaScript CPU ( cpu
) dan WebGL dipercepat ( webgl
) backends. Untuk menggunakannya:
// Set the backend to WASM and wait for the module to be ready.
tf.setBackend('wasm');
tf.ready().then(() => {...});
Jika server Anda melayani .wasm
file di jalan yang berbeda atau nama yang berbeda, penggunaan setWasmPath
sebelum Anda menginisialisasi backend. Lihat "Menggunakan Bundlers" bagian dalam README untuk info lebih lanjut:
import {setWasmPath} from '@tensorflow/tfjs-backend-wasm';
setWasmPath(yourCustomPath);
tf.setBackend('wasm');
tf.ready().then(() => {...});
Mengapa WASM?
Wasm diperkenalkan pada tahun 2015 sebagai format biner berbasis web baru, memberikan program yang ditulis dalam JavaScript, C, C ++, dll kompilasi target untuk menjalankan di web. Wasm telah didukung oleh Chrome, Safari, Firefox, dan Ujung sejak 2017, dan didukung oleh 90% dari perangkat di seluruh dunia.
Pertunjukan
Wasm backend memanfaatkan perpustakaan XNNPACK untuk implementasi dioptimalkan dari operator jaringan saraf.
Versus JavaScript: binari wasm umumnya jauh lebih cepat daripada bundel JavaScript untuk browser untuk memuat, parse, dan mengeksekusi. JavaScript diketik secara dinamis dan sampah dikumpulkan, yang dapat menyebabkan pelambatan saat runtime.
Versus WebGL: WebGL lebih cepat daripada wasm untuk kebanyakan model, tapi untuk model kecil wasm bisa mengungguli WebGL karena biaya overhead tetap melaksanakan shader WebGL. Bagian “Kapan saya harus menggunakan WASM” di bawah ini membahas heuristik untuk membuat keputusan ini.
Portabilitas dan Stabilitas
WASM memiliki aritmatika float 32-bit portabel, menawarkan paritas presisi di semua perangkat. WebGL, di sisi lain, adalah spesifik perangkat keras dan perangkat yang berbeda dapat memiliki presisi yang bervariasi (misalnya mundur ke float 16-bit pada perangkat iOS).
Seperti WebGL, WASM secara resmi didukung oleh semua browser utama. Tidak seperti WebGL, WASM dapat berjalan di Node.js, dan digunakan di sisi server tanpa perlu mengompilasi pustaka asli.
Kapan saya harus menggunakan WASM?
Ukuran model dan permintaan komputasi
Secara umum, wasm adalah pilihan yang baik ketika model yang lebih kecil atau Anda peduli tentang perangkat yang lebih rendah-end yang tidak memiliki dukungan WebGL ( OES_texture_float
ekstensi) atau memiliki GPU kurang kuat. Tabel di bawah ini menunjukkan inferensi kali (per TensorFlow.js 1.5.2) di Chrome pada 2018 MacBook Pro untuk 5 dari resmi didukung kami model di seluruh WebGL, wasm, dan backends CPU:
Model yang lebih kecil
Model | WebGL | WASM | CPU | Penyimpanan |
---|---|---|---|---|
BlazeWajah | 22,5 mdtk | 15,6 mdtk | 315,2 mdtk | .4 MB |
FaceMesh | 19,3 mdtk | 19,2 mdtk | 335 mdtk | 2.8 MB |
Model yang lebih besar
Model | WebGL | WASM | CPU | Penyimpanan |
---|---|---|---|---|
PoseNet | 42,5 mdtk | 173,9 mdtk | 1514,7 mdtk | 4,5 MB |
BodyPix | 77 ms | 188.4 mdtk | 2683 mdtk | 4,6 MB |
MobileNet v2 | 37 ms | 94 ms | 923.6 mdtk | 13 MB |
Tabel di atas menunjukkan bahwa wasm adalah 10-30x lebih cepat dari dataran JS CPU backend di seluruh model, dan kompetitif dengan WebGL untuk model yang lebih kecil seperti BlazeFace , yang ringan (400kb), namun memiliki jumlah yang layak ops (~ 140). Mengingat bahwa program WebGL memiliki biaya overhead tetap per eksekusi operasi, ini menjelaskan mengapa model seperti BlazeFace lebih cepat di WASM.
Hasil ini akan bervariasi tergantung pada perangkat Anda. Cara terbaik untuk menentukan apakah WASM tepat untuk aplikasi Anda adalah dengan mengujinya di berbagai backend kami.
Inferensi vs Pelatihan
Untuk mengatasi penggunaan-kasus utama untuk penyebaran model pra-dilatih, pengembangan backend wasm akan memprioritaskan inferensi lebih pelatihan dukungan. Melihat daftar up-to-date dari ops didukung dalam wasm dan biarkan kami tahu jika model Anda memiliki op yang tidak didukung. Untuk model pelatihan, sebaiknya gunakan backend Node (TensorFlow C++) atau backend WebGL.
CPU bagian belakang
Backend CPU, 'cpu', adalah backend dengan performa paling rendah, namun paling sederhana. Semua operasi diimplementasikan dalam JavaScript vanilla, yang membuatnya kurang dapat diparalelkan. Mereka juga memblokir utas UI.
Backend ini bisa sangat berguna untuk pengujian, atau pada perangkat di mana WebGL tidak tersedia.
Bendera
TensorFlow.js memiliki serangkaian flag lingkungan yang dievaluasi secara otomatis dan menentukan konfigurasi terbaik di platform saat ini. Bendera ini sebagian besar internal, tetapi beberapa bendera global dapat dikontrol dengan API publik.
-
tf.enableProdMode():
memungkinkan mode produksi, yang akan menghapus validasi Model, cek NaN, dan pemeriksaan kebenaran lain yang mendukung kinerja. -
tf.enableDebugMode()
: memungkinkan mode debug, yang akan login ke konsol setiap operasi yang dijalankan, serta informasi kinerja runtime seperti jejak memori dan waktu eksekusi kernel Total. Perhatikan bahwa ini akan sangat memperlambat aplikasi Anda, jangan gunakan ini dalam produksi.