- Transformers.js adalah library untuk menjalankan model 🤗 Transformers di browser tanpa server, dengan tujuan menghadirkan pengalaman yang setara secara fungsional dan API yang mirip dengan
transformers Python dari Hugging Face
- Untuk menjalankan model, library ini menggunakan ONNX Runtime, dan model pralatih PyTorch·TensorFlow·JAX dapat dikonversi ke ONNX menggunakan 🤗 Optimum
- Dengan API
pipeline, tugas seperti analisis sentimen dapat dipanggil dengan cara yang mirip Python, dan model lain dapat dipilih dengan menentukan ID model atau path sebagai argumen kedua
- Eksekusi default di browser menggunakan CPU berbasis WASM, dan eksekusi WebGPU dapat dipilih dengan
device: 'webgpu', tetapi API WebGPU masih eksperimental di beberapa browser
- Dalam lingkungan dengan sumber daya terbatas seperti browser web, tipe data seperti
"fp32", "fp16", "q8", dan "q4" dapat dipilih melalui dtype untuk menyesuaikan bandwidth dan performa
Menjalankan Transformers di Browser
- Transformers.js adalah library yang dirancang untuk menjalankan 🤗 Transformers langsung di browser tanpa server
- Library ini menargetkan pengalaman penggunaan yang setara secara fungsional dengan library Python transformers dari Hugging Face, sehingga model pralatih yang sama dapat dijalankan dengan API yang sangat mirip
- Tugas yang didukung mencakup berbagai modalitas
- Pemrosesan bahasa alami: klasifikasi teks, pengenalan entitas bernama, tanya jawab, language modeling, peringkasan, penerjemahan, pilihan ganda, pembuatan teks
- Computer vision: klasifikasi gambar, deteksi objek, segmentasi, estimasi kedalaman
- Audio: pengenalan suara otomatis, klasifikasi audio, text-to-speech
- Multimodal: embedding, klasifikasi audio zero-shot, klasifikasi gambar zero-shot, deteksi objek zero-shot
Cara Eksekusi dan Konversi Model
Instalasi dan Penggunaan di Browser
- Paket NPM diinstal dengan perintah berikut
npm i @huggingface/transformers
- Dapat juga digunakan di vanilla JS tanpa bundler, dan diimpor sebagai ES Modules melalui CDN atau static hosting
<script type="module">
import { pipeline } from 'https://cdn.jsdelivr.net/npm/@huggingface/transformers@4.2.0';
</script>
API pipeline yang Mirip Python
- API
pipeline adalah cara termudah untuk menjalankan model di library ini dengan menggabungkan model pralatih, preprocessing input, dan postprocessing output
- Mirip dengan contoh analisis sentimen di
transformers Python, di JavaScript juga bisa membuat pipeline('sentiment-analysis'), memasukkan teks, lalu menerima hasilnya
import { pipeline } from '@huggingface/transformers';
const pipe = await pipeline('sentiment-analysis');
const out = await pipe('I love transformers!');
// [{'label': 'POSITIVE', 'score': 0.999817686}]
- Untuk menggunakan model lain, tentukan ID model atau path sebagai argumen kedua pada fungsi
pipeline
const pipe = await pipeline(
'sentiment-analysis',
'Xenova/bert-base-multilingual-uncased-sentiment'
);
Opsi CPU, WebGPU, dan Kuantisasi
- Default eksekusi di browser adalah CPU berbasis WASM
- Untuk menjalankan di GPU, atur
device: 'webgpu'
const pipe = await pipeline(
'sentiment-analysis',
'Xenova/distilbert-base-uncased-finetuned-sst-2-english',
{
device: 'webgpu',
}
);
- Detail lebih lanjut tentang WebGPU tersedia di WebGPU guide
- Karena WebGPU API masih eksperimental di beberapa browser, pengguna diarahkan untuk mengirim bug report WebGPU jika terjadi masalah
- Dalam lingkungan browser web dengan sumber daya terbatas, penggunaan model terkuantisasi direkomendasikan
- Gunakan opsi
dtype untuk memilih tipe data model
- Pilihan umum adalah
"fp32" sebagai default WebGPU, "fp16", "q8" sebagai default WASM, dan "q4"
- Detail lebih lanjut tersedia di quantization guide
const pipe = await pipeline(
'sentiment-analysis',
'Xenova/distilbert-base-uncased-finetuned-sst-2-english',
{
dtype: 'q4',
}
);
Konfigurasi Kustom
import { env } from '@huggingface/transformers';
env.localModelPath = '/path/to/models/';
env.allowRemoteModels = false;
env.backends.onnx.wasm.wasmPaths = '/path/to/files/';
- Seluruh konfigurasi yang tersedia ada di API Reference
- Saat mengonversi model PyTorch ke ONNX, pendekatan satu perintah menggunakan Optimum direkomendasikan
Tugas yang Didukung dan Cakupan Model
- Untuk mencari model yang kompatibel di Hugging Face Hub, gunakan filter tag library transformers.js
- Tugas yang didukung mencakup NLP, vision, audio, multimodal, dan reinforcement learning, meski beberapa tugas masih belum didukung
- Di NLP, yang didukung antara lain fill-mask, question-answering, summarization, text-classification, text-generation, token-classification, translation, zero-shot-classification, feature-extraction, dan lainnya
- Di vision, yang didukung antara lain background-removal, depth-estimation, image-classification, image-segmentation, image-to-image, object-detection, image-feature-extraction, dan lainnya
- Di audio, yang didukung adalah audio-classification, automatic-speech-recognition, dan text-to-speech
- Di multimodal, yang didukung antara lain document-question-answering, image-to-text, zero-shot audio/image classification, zero-shot object detection, dan lainnya
- Tugas yang belum didukung juga disebutkan secara eksplisit
- table-question-answering, mask-generation, video-classification, unconditional-image-generation
- audio-to-audio, tabular-classification, tabular-regression
- text-to-image, visual-question-answering
- Daftar arsitektur model yang didukung mencakup banyak keluarga model seperti BERT, BART, CLIP, DistilBERT, Whisper, Llama, Qwen, Gemma, Phi, Segment Anything, ViT, dan lainnya
- Jika tugas atau model yang diinginkan tidak ada dalam daftar atau belum didukung, pengguna dapat membuka feature request
1 komentar
Komentar Hacker News
CLIP di browser: https://observablehq.com/@simonw/openai-clip-in-a-browser
Deteksi objek gambar dengan detra-resnet-50: https://observablehq.com/@simonw/detect-objects-in-images
Ukuran model awalnya terasa seperti batasan, tetapi ada cukup banyak aplikasi yang tidak terlalu masuk akal untuk dianggap mustahil hanya karena meminta pengguna dengan laptop dan koneksi yang bagus menunggu sekitar 30 detik saat loading
Rilis terbaru menambahkan dukungan untuk kuantisasi embedding biner, jadi saya benar-benar ingin mencobanya: https://github.com/xenova/transformers.js/releases/tag/2.17....
Saya sudah membuat paket npm untuk transformers.js v3 dan sepertinya perlu diperbarui. Belum yakin apakah fitur ini sudah termasuk di dalamnya
Saya mempertahankan fork terutama agar bisa berjalan di bun, dan ketika v3 dirilis nanti rencananya akan mendukung bun dengan baik. Namun WebGPU tidak akan berfungsi, meski itu fitur opsional
[Edit: kalau ingin memakainya, kirim DM. Saya tidak ingin mempromosikan fork]
Walau hanya 384 dimensi, hasilnya mengejutkan bagus untuk teks per paragraf. Di leaderboard pun peringkatnya lebih tinggi daripada text-embedding-ada-002
https://huggingface.co/spaces/mteb/leaderboard
https://syntax.fm/show/740/local-ai-models-in-javascript-mac...
Saya membuat webapp kecil untuk menghapus latar belakang gambar dengan model RMBG1.4 dari BRIA AI: https://aether.nco.dev
Sangat menyenangkan karena tidak perlu mengirim data ke API dan tetap berjalan di smartphone. Ke depannya saya rasa akan makin banyak proyek yang memakai ini untuk model vision, bahasa, dan utilitas kecil lainnya (estimasi kedalaman, penghapusan latar belakang, dll.), dan masa depan web terlihat cerah
Proyek berikutnya juga sudah sedang dikerjakan, dan di sana saya hampir pasti akan memakai transformers.js lagi
Rencananya adalah menguji embedding dan strategi pencarian untuk berbagai strategi RAG yang akan dipakai di server atau aplikasi Electron
Keduanya kurang bagus
Dalam jangka panjang, mungkin pendekatan yang tepat adalah browser menyertakan beberapa model bawaan dan mengeksposnya lewat Web API yang distandardisasi, tetapi saya belum mendengar ada upaya seperti itu sedang berjalan
(44MB) Penghapusan latar belakang di browser: https://huggingface.co/spaces/Xenova/remove-background-web. Ada juga versi WebGPU: https://huggingface.co/spaces/Xenova/remove-background-webgp...
(51MB) Whisper Web untuk pengenalan suara otomatis: https://huggingface.co/spaces/Xenova/whisper-web cukup pilih versi terkuantisasi di pengaturan
(28MB) Depth Anything Web untuk estimasi kedalaman monokular: https://huggingface.co/spaces/Xenova/depth-anything-web
(14MB) Segment Anything Web untuk segmentasi gambar: https://huggingface.co/spaces/Xenova/segment-anything-web
(20MB) Doodle Dash, game pengenalan sketsa berbasis machine learning: https://huggingface.co/spaces/Xenova/doodle-dash
Selain itu masih banyak lagi. Contoh lain bisa dilihat di koleksi demo Transformers.js: https://huggingface.co/collections/Xenova/transformersjs-dem...
Model di-cache per domain (menggunakan Web Cache API), jadi tidak perlu diunduh ulang setiap kali halaman dimuat. Jika ingin mempertahankan model lintas domain, Anda bisa membuat ekstensi browser dengan library ini
Bagian yang disebut terakhir sedang diupayakan, tetapi belum pada tahap yang bisa dibicarakan
Webapp yang membutuhkan data bergigabita di sisi klien sulit dibuat secara praktis. Tidak ada cara andal untuk menjamin data akan tetap berada di cache selama yang diinginkan pengguna, dan sekalipun bisa di-cache dengan andal, karena kebijakan cache partitioning browser, setiap situs yang memakai model yang sama harus mengunduh dan memakai ruang penyimpanan secara duplikat
Bagian dalam komentar asli seperti “tampak sangat tidak praktis”, “model umumnya cukup besar”, dan “150 situs × model 800MB” tampaknya justru memberi catatan bahwa pemahamannya kurang
Keunggulan besar lainnya adalah transformers juga berjalan di Node.js. Menyiapkan runtime jauh lebih mudah daripada mencocokkan kombinasi aneh Python dan dependensinya
Sepertinya akan membaik ketika sistem operasi mulai memasang model terlebih dahulu dan vendor browser juga menyediakan API yang bisa digunakan
Meski begitu, untuk sebagian besar pekerjaan, model yang di-host di cloud kemungkinan besar akan selalu jauh lebih baik
Ada benchmark embedding WebGPU di Hugging Face Space yang bisa dipakai untuk memperkirakan operasi forward pass: https://huggingface.co/spaces/Xenova/webgpu-embedding-benchm...
Itu sendiri mengesankan, tetapi pelatihan dengan latensi tersebut sepertinya akan menyakitkan. Pada fp16, batch 32, panjang sekuens 512, forward pass model 22 juta parameter memakan waktu sekitar 500ms
Sepertinya jelas ada potensi untuk prediksi on-demand