Tutorial Setup JupyterLite dengan Numba untuk Scientific Computing di Browser
KR
Kevin Ray

Dipublikasikan 16 Agustus 2026

Tutorial Setup JupyterLite dengan Numba untuk Scientific Computing di Browser

Bayangkan menjalankan compiler JIT Python yang dipercepat LLVM langsung di browser, tanpa server backend. Itu yang baru saja diwujudkan oleh tim QuantStack: Numba berjalan di JupyterLite melalui WebAssembly. Artikel ini adalah panduan praktis setup dan pemanfaatan Numba di browser untuk scientific computing, berdasarkan implementasi resmi yang diumumkan di Notebook.link.

1. Memahami JupyterLite dan WebAssembly

JupyterLite adalah distribusi JupyterLab yang berjalan sepenuhnya di sisi client. Kernel Python-nya dikompilasi ke WebAssembly menggunakan Emscripten, sehingga tidak memerlukan server Jupyter atau kernel process lokal. Ini mengubah notebook dari aplikasi client-server menjadi aplikasi static site yang bisa dihosting di CDN.

Manfaatnya sangat besar untuk edukasi dan dokumentasi: pengguna tidak perlu install Python, cukup buka URL dan langsung bereksperimen. Tapi sampai saat ini ada satu komponen kunci yang hilang dari ekosistem browser: Numba, JIT compiler yang mempercepat loop numerik Python hingga ratusan kali.

Tantangan utamanya adalah security model browser. WebAssembly tidak mengizinkan aplikasi membuat atau memodifikasi executable memory secara langsung. Padahal Numba secara native menghasilkan machine code, menempatkannya di executable memory, dan memanggilnya seketika. Untuk browser, pipeline ini harus diubah total.

2. Arsitektur Numba di WebAssembly

Tim QuantStack memecahkan masalah ini dengan mengganti backend eksekusi llvmlite. Pipeline asli Numba: Python bytecode diubah ke Numba IR, diketik, diturunkan ke LLVM IR via llvmlite, lalu diberikan ke LLVM JIT engine. Di browser, llvmlite tidak lagi memanggil JIT engine, melainkan pipeline WebAssembly khusus:

  1. LLVM IR dikompilasi menjadi WebAssembly object file.

  2. Object tersebut di-link dengan wasm-ld menjadi WebAssembly side module (setara shared library dinamis).

  3. Side module di-load secara dinamis ke aplikasi yang sedang berjalan.

  4. Simbol di-resolve dan fungsi dikompilasi dipanggil melalui WebAssembly function table.

Yang menarik, LLD dijalankan in-process melalui driver re-entrant-nya. Spawn subprocess wasm-ld tidak memungkinkan di browser, sehingga solusi in-process menjadi keharusan. Module yang sudah di-load tetap hidup secara global, memungkinkan runtime library, compiler helper, dan fungsi user saling resolve simbol.

3. Setup Environment Numba di JupyterLite

Langkah pertama adalah membuka instance JupyterLite yang sudah terkonfigurasi. QuantStack menyediakan demo langsung di Notebook.link Numba Ecosystem. Namun jika kamu ingin deploy sendiri, berikut komponen yang dibutuhkan:

# Di terminal JupyterLite dengan mamba
%pip install -i https://repo.mamba.pm/emscripten-forge 
    numba numpy scipy

Numba tersedia di emscripten-forge, distribusi software untuk WebAssembly yang dibangun di atas stack conda/mamba. Emscripten-forge menyediakan compiler toolchain LLVM, Clang, dan LLD yang sudah dikompilasi ke WebAssembly, sehingga seluruh pipeline kompilasi bisa terjadi di browser.

Setelah install, import dan gunakan Numba seperti biasa:

from numba import njit

@njit
def add(a, b):
    return a + b

add(1.0, 2.5)

Di balik layar, Numba mengkonstruksi Numba IR, menurunkannya ke LLVM IR, dan menyerahkannya ke WebAssembly execution engine baru. Engine ini mengompilasi LLVM IR ke WebAssembly object, memanggil LLD in-process, dan memuat side module ke kernel Xeus-Python yang sedang berjalan.

4. Persistent Caching dan Performa

Salah satu fitur praktis yang diaktifkan adalah object caching melalui @njit(cache=True). Ketika fungsi dengan cache dijalankan kembali di session browser berikutnya, Numba mengambil cached compilation data dari filesystem persistent JupyterLite. llvmlite menggunakan kembali WebAssembly object yang sudah ada, sambil me-link dan memuat ulang side module baru ke kernel yang baru.

Dari segi performa, hasil benchmark mengejutkan: Numba di WebAssembly memberikan speedup sekitar 250 kali dibanding Python standard, sedangkan secara native speedup-nya sekitar 90 kali. Gain relatif yang lebih besar di browser disebabkan oleh overhead interpreter Python yang lebih signifikan di lingkungan WebAssembly. Dengan kata lain, Numba bahkan lebih bernilai di browser daripada di native.

Tentu saja ada batasan. WebAssembly belum mendukung semua target feature native, seperti SIMD penuh. Tapi arsitektur yang sudah terbukti ini membuka jalan untuk optimasi numerical kernel di masa depan.

5. Membuka Ekosistem Numba di Browser

Manfaat Numba di browser tidak berhenti pada fungsi scalar atau array kernel. Begitu Numba tersedia, seluruh ekosistem yang bergantung padanya menjadi feasible di JupyterLite:

  • PyTensor: compile symbolic numerical graph menggunakan Numba linker.

  • PyMC: probabilistic modeling langsung di browser berkat fondasi PyTensor.

  • interpolation.py: rutin interpolasi yang dipercepat Numba untuk numerical economics.

  • Dolo.py: toolkit ekonomi dinamis dengan JIT-aware numerical routines.

Demo lengkap dari progresi ini tersedia di Numba Ecosystem Notebook. Kamu bisa mencoba mulai dari contoh Numba klasik, naik ke PyTensor, lalu ke PyMC, semuanya tanpa keluar dari tab browser.

Roadmap dan Kontribusi Komunitas

Pekerjaan saat ini sudah membuktikan arsitektur end-to-end, tapi masih ada banyak yang bisa ditingkatkan. Tim QuantStack berencana mengirimkan perubahan upstream ke Numba dan llvmlite, memperluas test coverage, meningkatkan performa caching, serta memvalidasi lebih banyak package dari ekosistem Numba. Target feature WebAssembly seperti SIMD juga menjadi arah menarik untuk numerical kernel.

Bagi komunitas, ini berarti proyek yang bergantung pada Numba kini bisa dievaluasi untuk dukungan browser. Dulu WebAssembly dianggap batasan yang menghalang. Sekarang dengan LLVM, LLD, llvmlite, dan Numba tersedia di emscripten-forge, JupyterLite bertransformasi dari environment Python ringan menjadi platform untuk scientific computing kompilasi yang serius.

Setup Numba di JupyterLite tidak lagi memerlukan hack atau workaround. Install via mamba, import, dan jalankan @njit. Compiler stack yang kompleks kini berjalan sepenuhnya di browser, membuka akses scientific Python untuk siapa saja yang punya browser modern dan koneksi internet.