Web Worker: WASM-inferenssi erillisessä säikeessä, UI ei jäädy
- Poistettu kaikki web_sys::window() -kutsut Rust WASM:sta - Uudet Worker-yhteensopivat apufunktiot: perf_now(), worker_fetch(), sleep_ms() - worker.js lataa ja ajaa WASM-moduulin erillisessä säikeessä - ensureCoderNode käynnistää Workerin pääsäikeen sijaan - Selaimen UI pysyy responsiivisena inferenssin aikana Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -38,17 +38,50 @@ pub fn set_gpu_load(load: u32) {
|
||||
console_log!("[Wasm] GPU Kuormitusraja vaihdettu -> {}%", load);
|
||||
}
|
||||
|
||||
// Asynkroninen odotus WebAssemblylle
|
||||
async fn sleep_ms(ms: i32) {
|
||||
// Worker-yhteensopiva setTimeout — toimii sekä Window- että Worker-kontekstissa
|
||||
#[wasm_bindgen]
|
||||
extern "C" {
|
||||
#[wasm_bindgen(js_name = setTimeout)]
|
||||
fn set_timeout(closure: &js_sys::Function, ms: i32);
|
||||
}
|
||||
|
||||
// Asynkroninen odotus WebAssemblylle (Window + Worker)
|
||||
pub async fn sleep_ms(ms: i32) {
|
||||
let promise = js_sys::Promise::new(&mut |resolve, _| {
|
||||
web_sys::window()
|
||||
.unwrap()
|
||||
.set_timeout_with_callback_and_timeout_and_arguments_0(&resolve, ms)
|
||||
.unwrap();
|
||||
set_timeout(&resolve, ms);
|
||||
});
|
||||
let _ = wasm_bindgen_futures::JsFuture::from(promise).await;
|
||||
}
|
||||
|
||||
// Worker-yhteensopiva Performance — käyttää globalThis.performance
|
||||
pub fn perf_now() -> f64 {
|
||||
js_sys::Reflect::get(&js_sys::global(), &"performance".into())
|
||||
.ok()
|
||||
.and_then(|p| js_sys::Reflect::get(&p, &"now".into()).ok())
|
||||
.and_then(|f| f.dyn_into::<js_sys::Function>().ok())
|
||||
.and_then(|f| {
|
||||
let perf = js_sys::Reflect::get(&js_sys::global(), &"performance".into()).unwrap();
|
||||
f.call0(&perf).ok()
|
||||
})
|
||||
.and_then(|v| v.as_f64())
|
||||
.unwrap_or(0.0)
|
||||
}
|
||||
|
||||
// Worker-yhteensopiva fetch — käyttää globalThis.fetch
|
||||
pub async fn worker_fetch(url: &str) -> Result<web_sys::Response, String> {
|
||||
let promise = js_sys::Reflect::get(&js_sys::global(), &"fetch".into())
|
||||
.map_err(|_| "fetch ei saatavilla".to_string())?
|
||||
.dyn_into::<js_sys::Function>()
|
||||
.map_err(|_| "fetch ei funktio".to_string())?
|
||||
.call1(&JsValue::NULL, &url.into())
|
||||
.map_err(|e| format!("fetch: {:?}", e))?;
|
||||
let resp = wasm_bindgen_futures::JsFuture::from(js_sys::Promise::from(promise))
|
||||
.await
|
||||
.map_err(|e| format!("fetch await: {:?}", e))?;
|
||||
resp.dyn_into::<web_sys::Response>()
|
||||
.map_err(|_| "ei Response".to_string())
|
||||
}
|
||||
|
||||
// Geneerinen tensorilaskenta — toimii millä tahansa Burn-backendillä
|
||||
fn run_matmul<B: burn::tensor::backend::Backend>(size: usize) -> String {
|
||||
let device = Default::default();
|
||||
@@ -123,10 +156,9 @@ async fn run_single_tokenize(text: String, ws: Rc<RefCell<WebSocket>>) {
|
||||
let Some(bytes) = cached_tok else { return; };
|
||||
let Ok(tokenizer) = tokenizers::Tokenizer::from_bytes(&bytes) else { return; };
|
||||
|
||||
let perf = web_sys::window().unwrap().performance().unwrap();
|
||||
let start = perf.now();
|
||||
let start = perf_now();
|
||||
let result = tokenize_text(&tokenizer, &text);
|
||||
let duration_ms = perf.now() - start;
|
||||
let duration_ms = perf_now() - start;
|
||||
|
||||
let token_count = result["token_count"].as_u64().unwrap_or(0);
|
||||
let cpt = result["chars_per_token"].as_f64().unwrap_or(0.0);
|
||||
@@ -157,11 +189,10 @@ async fn run_pair_comparison(en_text: String, fi_text: String, ws: Rc<RefCell<We
|
||||
return;
|
||||
};
|
||||
|
||||
let perf = web_sys::window().unwrap().performance().unwrap();
|
||||
let start_time = perf.now();
|
||||
let start_time = perf_now();
|
||||
let en_result = tokenize_text(&tokenizer, &en_text);
|
||||
let fi_result = tokenize_text(&tokenizer, &fi_text);
|
||||
let duration_ms = perf.now() - start_time; // millisekunteja desimaalitarkkuudella
|
||||
let duration_ms = perf_now() - start_time;
|
||||
|
||||
let en_cpt = en_result["chars_per_token"].as_f64().unwrap_or(0.0);
|
||||
let fi_cpt = fi_result["chars_per_token"].as_f64().unwrap_or(0.0);
|
||||
|
||||
Reference in New Issue
Block a user