Ditulis oleh Daniel Smilkov, Nikhil Thorat, dan Ann Yuan, Software Engineers di Google

Kami senang bisa mengumumkan bahwa TensorFlow.js sekarang menyediakan backend WebAssembly (WASM) untuk browser dan Node.js! Backend ini adalah alternatif dari backend WebGL, yang menghadirkan eksekusi CPU cepat dengan perubahan kode minimal. Backend ini membantu meningkatkan kinerja pada perangkat yang lebih banyak, terutama perangkat seluler kelas bawah yang tidak memiliki dukungan WebGL atau memiliki GPU lambat. Ia menggunakan library XNNPack untuk mempercepat operasi.

Penginstalan

Ada dua cara untuk menggunakan backend WASM baru ini:
  1. Dengan NPM
    // Import @tensorflow/tfjs or @tensorflow/tfjs-core
    const tf = require('@tensorflow/tfjs');
    // Add the WASM backend to the global backend registry.
    require('@tensorflow/tfjs-backend-wasm');
     
    // Set the backend to WASM and wait for the module to be ready.
    tf.setBackend('wasm').then(() => main());
    Library ini membutuhkan biner WASM saling terhubung dengan file JS utama. Jika Anda menggunakan pemaket seperti parcel atau webpack, Anda mungkin perlu menunjukkan secara manual lokasi biner WASM dengan helper setWasmPath kami:
    import {setWasmPath} from '@tensorflow/tfjs-backend-wasm';
    setWasmPath(yourCustomPath);
    tf.setBackend('wasm').then(() => {...});
    Lihat bagian “Menggunakan pemaket” di README kami untuk informasi selengkapnya.
  2. Dengan tag skrip
    <!-- Import @tensorflow/tfjs or @tensorflow/tfjs-core -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
     
    <!-- Adds the WASM backend to the global backend registry -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm/dist/tf-backend-wasm.js"></script>
     
    <script>
      tf.setBackend('wasm').then(() => main());
    </script>
    CATATAN: TensorFlow.js menetapkan prioritas untuk setiap backend dan akan secara otomatis memilih backend terbaik yang didukung untuk lingkungan tertentu. Saat ini, WebGL memiliki prioritas tertinggi, diikuti oleh WASM, kemudian backend JS vanilla. Untuk selalu menggunakan backend WASM, kita harus memanggil secara eksplisit `tf.setBackend(‘wasm’)`.

Demo

Lihat demo deteksi wajah (menggunakan model BlazeFace MediaPipe) yang berjalan pada backend WASM. Untuk detail selengkapnya tentang model tersebut, lihat entri blog ini.

Mengapa WASM?

WASM berformat lintas-browser, rakitan portabel, dan biner untuk web yang menghadirkan kecepatan eksekusi kode mendekati-asli di web. Ia diperkenalkan pada 2015 sebagai format biner berbasis web baru, menyediakan program yang ditulis dalam C, C++, atau Rust, kumpulan target untuk berjalan di web. WASM telah didukung Chrome, Safari, Firefox, dan Edge sejak 2017, dan didukung oleh 90% perangkat di seluruh dunia.

Kinerja


Versus JavaScript: WASM biasanya jauh lebih cepat daripada JavaScript untuk beban kerja numerik yang umum dalam tugas machine learning. Selain itu, WASM bisa di-decode secara native hingga 20x lebih cepat daripada JavaScript yang dapat diurai. JavaScript secara dinamis diketik dan sampahnya dikumpulkan, yang bisa menyebabkan perlambatan non-deterministik signifikan saat runtime. Selain itu, library JavaScript modern (seperti TensorFlow.js) menggunakan fitur kompilasi seperti transpiler TypeScript dan ES6 yang menghasilkan kode ES5 (untuk dukungan browser yang luas) yang lebih lambat dieksekusi daripada ES6 JavaScript vanilla.
Versus WebGL: Untuk kebanyakan model, backend WebGL masih akan mengungguli backend WASM, tetapi WASM bisa lebih cepat untuk model ultra-lite (kurang dari 3MB dan 60M multiply-adds). Dalam skenario ini, manfaat paralelisasi GPU melebihi biaya overhead tetap dari mengeksekusi shader WebGL. Di bawah ini kami menyediakan panduan untuk menemukan garis ini. Namun, ada proposal ekstensi WASM untuk menambahkan instruksi SIMD, yang memungkinkan beberapa operasi floating point untuk di-vektor dan dieksekusi secara paralel. Pengujian awal menunjukkan bahwa mengaktifkan ekstensi ini menghadirkan peningkatan 2-3x atas WASM sekarang. Nantikan kehadirannya di browser! Ia akan secara otomatis diaktifkan untuk TensorFlow.js.


Portabilitas dan Stabilitas


Ketika berhubungan dengan machine learning, ketepatan numerik adalah hal yang penting. WASM secara native mendukung aritmetika floating point, sedangkan backend WebGL membutuhkan ekstensi OES_texture_float. Tidak semua perangkat mendukung ekstensi ini, yang berarti TensorFlow.js yang terakselerasi GPU tidak didukung pada beberapa perangkat (mis. perangkat seluler lama yang mendukung WASM).
Selain itu, driver GPU bisa khusus dipakai untuk hardware tertentu dan perangkat yang berbeda dapat memiliki masalah presisi. Di iOS, float 32 bit tidak didukung pada GPU sehingga kami kembali ke float 16 bit, yang menyebabkan masalah presisi. Dalam WASM, komputasi akan selalu terjadi dalam float 32 bit dan karenanya memiliki paritas presisi di semua perangkat.

Kapan saya harus menggunakan WASM?

Secara umum, WASM adalah pilihan yang baik ketika model berukuran lebih kecil, jika Anda membutuhkan dukungan perangkat yang luas, atau jika project Anda sensitif terhadap stabilitas numerik. Namun, WASM tidak memiliki kesamaan dengan backend WebGL kami. Jika Anda menggunakan backend WASM dan membutuhkan implementasi op, jangan ragu untuk melaporkan masalah di Github. Untuk mengatasi kebutuhan kasus penggunaan produksi, kami memprioritaskan inferensi daripada dukungan pelatihan . Untuk melatih model di browser, kami sarankan menggunakan backend WebGL.
Di Node.js, backend WASM adalah solusi hebat untuk perangkat yang tidak mendukung biner TensorFlow atau Anda tidak ingin membangunnya dari sumber.
Tabel di bawah ini menunjukkan waktu inferensi (dalam milidetik) di Chrome pada MacBook Pro 2018 (Intel i7 2,2GHz, Radeon 555X) untuk beberapa model yang didukung secara resmi di backend WebGL, WASM, dan plain JS (CPU).
Kami mengamati backend WASM 10-30x lebih cepat daripada backend plain JS (CPU) di seluruh model kami. Dengan membandingkan WASM dengan WebGL, ada dua hal utama yang perlu diingat:
  1. WASM setara, atau lebih cepat daripada WebGL untuk model ultra-lite seperti BlazeFace dan FaceMesh dari MediaPipe.
  2. WASM 2-4X lebih lambat daripada WebGL untuk model edge berukuran sedang seperti MobileNet, BodyPix dan PoseNet.

Memandang ke depan

Kami percaya WASM akan menjadi backend yang semakin disukai. Pada tahun lalu, kami telah melihat hadirnya model ultra-ringan berkualitas produksi yang dirancang untuk perangkat edge (mis. BlazeFace dan FaceMesh dari MediaPipe), yang cocok untuk backend WASM.
Selain itu, ekstensi baru seperti SIMD dan thread sedang dikembangkan secara aktif yang memungkinkan akselerasi lebih lanjut di masa mendatang.

SIMD / QFMA


Terdapat proposal ekstensi WASM untuk menambahkan instruksi SIMD. Hari ini, Chrome mendukung SIMD secara parsial di bawah tanda eksperimental, status Firefox dan Edge sedang dalam pengembangan, sementara Safari belum memberikan sinyal publik. SIMD sangatlah menjanjikan. Benchmark dengan SIMD-WASM pada model ML populer menunjukkan peningkatan kecepatan 2-3X daripada WASM non-SIMD.
Selain proposal SIMD asli, backend LLVM WASM baru-baru ini mendapat dukungan untuk instruksi QFMA SIMD eksperimental yang akan lebih meningkatkan kinerja kernel. Benchmark pada model ML populer menunjukkan QFMA SIMD memberikan kecepatan ekstra 26-50% dibandingkan SIMD biasa.
Backend TF.js WASM akan memanfaatkan SIMD melalui library XNNPACK, yang mencakup kernel-mikro yang dioptimalkan untuk WASM SIMD. Ketika hadir, SIMD tidak akan terlihat oleh pengguna TensorFlow.js.

Multithreading


WASM baru-baru ini mendapatkan proposal thread dan atomik dengan tujuan untuk mempercepat aplikasi multi-thread. Proposal ini masih dalam tahap awal, dan dimaksudkan untuk menempatkan W3C Working Group di masa mendatang. Secara khusus, Chrome 74+ telah mendukung thread WASM yang diaktifkan secara default.
Ketika proposal threading hadir, kita akan siap memanfaatkan thread melalui library XNNPACK tanpa mengubah kode pengguna TensorFlow.js.

Informasi selengkapnya

  • Jika tertarik untuk mempelajari lebih lanjut, Anda bisa membaca panduan WebAssembly kami.
  • Pelajari lebih lanjut tentang WebAssembly dengan memeriksa kumpulan sumber daya ini dari Mozilla Developer Network.
  • Kami menghargai masukan dan kontribusi Anda melalui masalah dan PR di GitHub!