Kehendak soalan dan skop
Sebuah aplikasi web ingin menjalankan model pengelasan imej secara tempatan dalam pelayar untuk mengurangkan risiko privasi muat naik imej dan pendaman rangkaian. Pasukan sedang mempertimbangkan Draf Cadangan Calon (Candidate Recommendation Draft) W3C Web Neural Network API Mei 2026. WebNN ialah API graf pengiraan yang boleh menyasarkan pelaksanaan CPU, GPU dan NPU; spesifikasi ini masih berkembang, jadi Candidate Recommendation Draft bukanlah jaminan sokongan yang stabil dalam setiap pelayar.
Berikan jawapan lengkap yang merangkumi penukaran model, pembinaan dan kompilasi graf, penghantaran inferens, pemilihan peranti, sandaran dan pengesahan pelepasan.
Perkara yang dinilai oleh penemu duga
Penemu duga mencari kitaran hayat "bina sekali, laksana berkali-kali" yang jelas dan perbezaan antara kompilasi MLGraphBuilder.build() tak segerak dan pelaksanaan MLContext.dispatch() tak segerak. WebNN harus diterangkan sebagai abstraksi agnostik perkakasan, bukan sebagai jaminan bahawa setiap operator berprestasi sama pada setiap peranti.
Jawapan yang kukuh membincangkan liputan operator, pengikatan tensor (tensor binding), halangan bebenang utama (main thread), pengesanan keupayaan, privasi dan cap jari (fingerprinting), keserasian pelayar serta pelan kenari (canary) yang boleh dibalikkan.
Soalan penjelasan sebelum menjawab
- Adakah model menggunakan bentuk tetap, atau adakah ia mesti menyokong bentuk dinamik dan pelbagai kejituan (precisions)?
- Adakah pelayar dan sistem pengendalian sasaran mendedahkan operator dan bahagian belakang (backends) yang sama?
- Adakah inferens mesti kekal di luar talian, atau adakah sandaran pelayan yang selamat boleh diterima?
- Adakah sasarannya ialah kelajuan first-paint, pendaman setiap bingkai, daya pemprosesan (throughput), tenaga atau privasi?
- Adakah model memproses imej sensitif, dan mungkinkah keupayaan perkakasan menjadi isyarat cap jari?
Rangka kerja jawapan 30 saat
"Saya akan menganggap WebNN sebagai bahagian belakang pelaksanaan calon. Mula-mula saya akan mengesahkan operator model dan reka letak tensor, kemudian memindahkan pembinaan dan kompilasi graf keluar daripada laluan inferens. Kompilasi dan penghantaran adalah tak segerak, dengan tensor dinamakan mengikat input dan output. Sebelum pelepasan, saya akan membina matriks pelayar, peranti dan versi model; keupayaan yang tidak disokong atau kegagalan kompilasi akan disandarkan kepada WebAssembly atau pelayan dengan sempadan data yang jelas. Saya akan mengukur kompilasi pertama, inferens keadaan mantap, memori, tenaga dan tindak balas bebenang utama, melaksanakan kenari secara beransur-ansur, serta mengekalkan suis pemati (kill switch)."
Jawapan mendalam langkah demi langkah
Bekukan kontrak model
Tetapkan bentuk input, jenis data, reka letak, penormalan, label output dan toleransi ralat. Tukar model kepada subgraf operator yang disokong, mengesan operator yang tidak disokong semasa pembinaan graf dan bukannya selepas pelaksanaan separa pada peranti pengguna. Kekalkan pelaksanaan rujukan WebAssembly atau pelayan untuk perbandingan lapisan demi lapisan.
Bina dan kompilasi graf
Cipta konteks dan MLGraphBuilder melalui navigator.ml, kemudian susun input, pemalar dan operator. build() mengkompilasi graf dan mengembalikan Promise; setiap pembina harus memiliki satu graf. Panaskan graf terlebih dahulu atau dalam Worker supaya kompilasi pertama tidak menjadi pendaman klik.
const context = await navigator.ml.createContext({ deviceType: 'gpu' });
const builder = new MLGraphBuilder(context);
const input = builder.input('image', {
dataType: 'float32',
dimensions: [1, 224, 224, 3],
});
const weights = builder.constant(weightDescriptor, weightBuffer);
const logits = builder.conv2d(input, weights, convOptions);
const graph = await builder.build({ logits });Pilihan peranti hanyalah dasar calon; sesuatu pelaksanaan mesti disahkan terhadap pelayar sasaran dan versi spesifikasi dan bukannya menganggap ia menerima setiap nilai.
Reka bentuk pelaksanaan tak segerak dan aliran memori
dispatch() menyerahkan pelaksanaan graf ke garis masa pelaksanaan dan kembali serta-merta. Ikat tensor input dan output yang dinamakan, kemudian baca keputusan selepas pelaksanaan selesai. Guna semula graf, konteks dan penimbal yang dikompilasi untuk inferens berulang dan bukannya memperuntukkan bagi setiap bingkai. Penstriman kamera memerlukan tekanan belakang (backpressure): gugurkan atau gabungkan bingkai baharu semasa bingkai sebelumnya masih berjalan dan bukannya membina barisan gilir tanpa batas.
Pilih peranti dan sandaran
Kesan sokongan API, operator dan model sebelum memilih CPU, GPU atau NPU. Ketersediaan peranti tidak membuktikan bahawa operator sasaran adalah cekap; pilih berdasarkan pengukuran hujung ke hujung. Rantaian sandaran boleh menjadi WebNN → WebAssembly → pelayan, tetapi setiap peringkat mesti berkongsi pra-pemprosesan dan semakan keputusan. Sandaran pelayan memuat naik imej, jadi UI dan lapisan rangkaian mesti menyatakan sempadan kebenaran dan pengekalan.
Lindungi bebenang utama dan interaksi
Pembinaan graf, kompilasi, pra-pemprosesan dan pasca-pemprosesan boleh menjejaskan interaksi. Letakkan kerja berat dalam Dedicated Worker dan kekalkan bebenang utama untuk penangkapan input dan keadaan UI. Gunakan pembatalan atau nombor jujukan untuk membuang keputusan lapuk. Ukur tugasan panjang (long tasks), lonjakan input dan pemulihan tab latar belakang, bukan hanya purata masa inferens.
Bina matriks ketepatan dan keserasian
Matrikskan versi pelayar, sistem pengendalian, jenis peranti, kejituan model dan set operator. Bandingkan output, ketepatan dan input sempadan dengan bahagian belakang rujukan. Rekod kegagalan kompilasi, operator yang tidak disokong, kehilangan peranti dan pemusnahan konteks. Memandangkan dokumen W3C masih merupakan Candidate Recommendation Draft, pelan pelepasan mesti membenarkan perubahan spesifikasi dan perbezaan pelaksanaan.
Kendalikan privasi, kebenaran dan cap jari
Pelaksanaan tempatan mengurangkan muat naik imej, tetapi fail model, cache dan telemetri masih boleh membocorkan maklumat. Cache hanya pemberat yang diperlukan, elakkan pengelogan ciri input, dan jangan jadikan jenis peranti sebagai pengecam pengguna. Spesifikasi menyatakan bahawa penjadualan peranti boleh mencipta isyarat cap jari; oleh itu, keputusan keupayaan harus diminimumkan dan berjangka hayat pendek, dengan alternatif perisian atau pelayan disediakan.
Kenari, pemerhatian dan pengunduran (rollback)
Mulakan dengan model tidak sensitif dan set pelayar yang kecil. Bandingkan kompilasi pertama, P50/P95 keadaan mantap, tugasan panjang bebenang utama, memori, tenaga, kadar kegagalan dan kadar sandaran. Jalankan semula matriks semasa peningkatan model atau pelayar. Jika peranti ranap, ketepatan tersasar, penggunaan tenaga berlebihan atau keperluan privasi gagal, lumpuhkan WebNN dan gunakan bahagian belakang rujukan; kekalkan hash versi, peranti dan model untuk analisis.
Jawapan model berkualiti tinggi
"Saya akan membekukan kontrak input, output dan ralat model, kemudian mengesahkan pemetaan operator ke WebNN. Graf dibina dan dikompilasi sekali; build() dan dispatch() mengikut aliran tak segerak, dan gelung inferens menggunakan semula konteks serta penimbalnya. Matriks pelepasan meliputi versi pelayar, peranti dan model, dengan Workers mengendalikan kompilasi dan pra-pemprosesan. WebNN, WebAssembly dan pelayan membentuk rantaian sandaran yang boleh diperhatikan, dan sandaran pelayan menyatakan sempadan muat naik. Metrik kenari termasuk pendaman kali pertama dan keadaan mantap, tugasan panjang, memori, tenaga, ketepatan dan kadar kegagalan; suis pemati memulihkan bahagian belakang rujukan serta-merta."
Kesilapan lazim
- Menganggap Candidate Recommendation sebagai sokongan universal → jurang pelayar atau operator menjejaskan pengguna → bina matriks versi dan keupayaan.
- Mengkompilasi graf pada setiap permintaan → kos larian pertama berulang → panaskan dan guna semula graf yang dikompilasi.
- Menanda aras hanya pada GPU yang ideal → laluan CPU atau NPU gagal → ukur hujung ke hujung pada setiap bahagian belakang.
- Menganggap penghantaran adalah segerak → jank atau keputusan tidak mengikut susunan → gunakan keadaan tak segerak dan nombor jujukan.
- Membariskan setiap bingkai kamera → pendaman meningkat tanpa batas → gunakan tekanan belakang dan gugurkan bingkai lapuk.
- Melaporkan keupayaan peranti sebagai identiti → risiko cap jari meningkat → minimalkan pengesanan dan kekalkan sandaran perisian.
Soalan susulan dan jawapan
Soalan susulan 1: Mengapa tidak menggunakan WebGPU secara terus?
WebGPU mendedahkan sumber peringkat lebih rendah dan kawalan shader, yang sesuai untuk operator tersuai dan penjadualan terperinci. WebNN menyediakan abstraksi graf rangkaian neural peringkat lebih tinggi yang memetakan secara lebih langsung kepada rangka kerja dan bahagian belakang perkakasan. Pilih berdasarkan liputan operator, kebolehselenggaraan, matlamat prestasi dan sempadan privasi.
Soalan susulan 2: Kompilasi mengambil masa sepuluh saat. Bagaimanakah anda mengelakkan masa menunggu yang ketara kepada pengguna?
Pindahkan pemuatan dan kompilasi model ke dalam Worker, panaskan semasa waktu melahu (idle time), dan cache pemberat yang telah disahkan integritinya. Jika permintaan pertama masih belum tersedia, tunjukkan keadaan yang benar dan gunakan WebAssembly atau sandaran pelayan; jangan sekali-kali menyembunyikan kegagalan kompilasi di sebalik output palsu.
Soalan susulan 3: Output GPU kadangkala berbeza daripada rujukan. Apakah yang anda lakukan?
Asingkan pembundaran titik terapung, penukaran kejituan, perbezaan pelaksanaan operator dan kecacatan model sebenar. Hasilkan semula dengan input tetap, tensor perantaraan dan ambang toleransi; jika toleransi produk dilebihi, gunakan bahagian belakang lain dan rekod versi pelayar, pemacu dan model.
Soalan susulan 4: Pengguna menolak muat naik imej dan WebNN tidak tersedia. Apakah langkah seterusnya?
Tawarkan WebAssembly tempatan atau keadaan tidak tersedia yang jelas; jangan pintas pilihan pengguna. Produk boleh mengurangkan kerumitan model atau menawarkan aliran manual, tetapi ia mesti mengekalkan sempadan data yang telus.