kylä lähtee!
This commit is contained in:
@@ -94,32 +94,20 @@ CARGO_TARGET_DIR=target-native HUB_URL=wss://kipina.studio/ws cargo run --releas
|
|||||||
|
|
||||||
Jos CUDA:a ei ole, poista feature: `candle-core = { version = "0.8" }` (ilman `features = ["cuda"]`).
|
Jos CUDA:a ei ole, poista feature: `candle-core = { version = "0.8" }` (ilman `features = ["cuda"]`).
|
||||||
|
|
||||||
## WebGPU-asetukset selaimessa
|
## Kuinka saat WebGPU:n aktivoitua selaimessasi:
|
||||||
|
|
||||||
WebGPU ei ole oletuksena päällä kaikissa selaimissa. Jos "Liity laskentaverkkoon" -nappi käynnistää CPU-fallbackin vaikka koneessa on näytönohjain:
|
Jos käytät Chromea, Bravea tai Edgeä (Chromium-pohjainen):
|
||||||
|
|
||||||
**Chrome / Brave (Linux APT/DEB):**
|
- Kirjoita selaimen osoiteriville: `chrome://flags` (tai `brave://flags` / `edge://flags`)
|
||||||
```bash
|
- Etsi hakusanalla **WebGPU** tai **Unsafe WebGPU** (`#enable-unsafe-webgpu`).
|
||||||
google-chrome --enable-unsafe-webgpu --enable-features=Vulkan --ignore-gpu-blocklist --use-angle=vulkan --ozone-platform=x11 https://kipina.studio
|
- Vaihda asetus tilaan **Enabled**.
|
||||||
|
- *(Linuxilla erityisesti saatat joutua käynnistämään selaimen terminaalin kautta komennoilla `--enable-unsafe-webgpu --enable-features=Vulkan`, aivan kuten olit tehnyt tämän kehityssession alussa!)*
|
||||||
|
|
||||||
brave-browser --enable-unsafe-webgpu --enable-features=Vulkan --ignore-gpu-blocklist --use-angle=vulkan --ozone-platform=x11 https://kipina.studio
|
Jos käytät Firefoxia:
|
||||||
```
|
|
||||||
|
|
||||||
**Chrome / Brave (Linux Flatpak):**
|
- Kirjoita osoiteriville: `about:config`
|
||||||
```bash
|
- Etsi `dom.webgpu.enabled` ja aseta se arvoon `true`.
|
||||||
flatpak run com.google.Chrome --enable-unsafe-webgpu --enable-features=Vulkan --ignore-gpu-blocklist --use-angle=vulkan --ozone-platform=x11 https://kipina.studio
|
- Etsi `gfx.webgpu.force-enabled` ja aseta se arvoon `true`.
|
||||||
|
|
||||||
flatpak run com.brave.Browser --enable-unsafe-webgpu --enable-features=Vulkan --ignore-gpu-blocklist --use-angle=vulkan --ozone-platform=x11 https://kipina.studio
|
|
||||||
```
|
|
||||||
|
|
||||||
**Chrome / Brave (Windows / Mac):**
|
|
||||||
1. Avaa `chrome://flags`
|
|
||||||
2. Ota käyttöön "WebGPU" ja "Vulkan"
|
|
||||||
3. Käynnistä selain uudelleen
|
|
||||||
|
|
||||||
**Firefox:** `about:config` → `dom.webgpu.enabled` = `true`
|
|
||||||
|
|
||||||
**Safari:** Develop → Feature Flags → WebGPU
|
|
||||||
|
|
||||||
## Projektin rakenne
|
## Projektin rakenne
|
||||||
|
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ web-sys = { version = "0.3.68", features = [
|
|||||||
] }
|
] }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
burn = { version = "0.14.0", features = ["wgpu", "ndarray"] }
|
burn = { version = "0.21.0-pre.2", default-features = false, features = ["wgpu", "ndarray"] }
|
||||||
burn-wgpu = "0.14.0"
|
burn-wgpu = "0.21.0-pre.2"
|
||||||
burn-ndarray = "0.14.0"
|
burn-ndarray = "0.21.0-pre.2"
|
||||||
wasm-bindgen-futures = "0.4"
|
wasm-bindgen-futures = "0.4"
|
||||||
console_error_panic_hook = "0.1.7"
|
console_error_panic_hook = "0.1.7"
|
||||||
reqwest = { version = "0.12", default-features = false, features = ["json"] }
|
reqwest = { version = "0.12", default-features = false, features = ["json"] }
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use burn::tensor::{backend::Backend, Tensor, Data};
|
use burn::tensor::{backend::Backend, Tensor, TensorData};
|
||||||
use candle_core::safetensors;
|
use candle_core::safetensors;
|
||||||
use candle_core::Device as CandleDevice;
|
use candle_core::Device as CandleDevice;
|
||||||
use burn::module::Param;
|
use burn::module::Param;
|
||||||
|
|||||||
@@ -120,11 +120,10 @@ pub async fn run_smollm_inference(prompt: String, ws: Rc<RefCell<WebSocket>>) {
|
|||||||
|
|
||||||
let use_gpu = crate::HAS_WEBGPU.load(std::sync::atomic::Ordering::SeqCst);
|
let use_gpu = crate::HAS_WEBGPU.load(std::sync::atomic::Ordering::SeqCst);
|
||||||
if use_gpu {
|
if use_gpu {
|
||||||
console_log!("[SmolLM] Alustetaan Burn WebGPU...");
|
console_log!("[SmolLM] Burn WebGPU inferenssi...");
|
||||||
burn_wgpu::init_async::<burn_wgpu::AutoGraphicsApi>(&Default::default(), Default::default()).await;
|
|
||||||
run_burn_inference::<burn::backend::Wgpu>(prompt, model_bytes, tokenizer, ws, perf.clone()).await;
|
run_burn_inference::<burn::backend::Wgpu>(prompt, model_bytes, tokenizer, ws, perf.clone()).await;
|
||||||
} else {
|
} else {
|
||||||
console_log!("[SmolLM] Käytetään CPU NdArrayta (vanha tapa)...");
|
console_log!("[SmolLM] Burn NdArray (CPU) inferenssi...");
|
||||||
run_burn_inference::<burn::backend::NdArray>(prompt, model_bytes, tokenizer, ws, perf.clone()).await;
|
run_burn_inference::<burn::backend::NdArray>(prompt, model_bytes, tokenizer, ws, perf.clone()).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1020,7 +1020,14 @@
|
|||||||
try {
|
try {
|
||||||
const adapter = await navigator.gpu.requestAdapter();
|
const adapter = await navigator.gpu.requestAdapter();
|
||||||
if (adapter) {
|
if (adapter) {
|
||||||
|
try {
|
||||||
|
const testDevice = await adapter.requestDevice({ requiredLimits: { maxInterStageShaderComponents: 60 } });
|
||||||
hasWebGPU = true;
|
hasWebGPU = true;
|
||||||
|
testDevice.destroy();
|
||||||
|
} catch(e) {
|
||||||
|
console.log("[WebGPU] Legacy-tuki rajoittaa WebGPU:n: " + e.message);
|
||||||
|
hasWebGPU = false; // Fallback to CPU NdArray avoiding WASM panic
|
||||||
|
}
|
||||||
const info = adapter.info || {};
|
const info = adapter.info || {};
|
||||||
const maxBuf = Number(adapter.limits.maxBufferSize || 0);
|
const maxBuf = Number(adapter.limits.maxBufferSize || 0);
|
||||||
// maxBufferSize antaa arvion VRAM:sta — tyypillisesti ~25% todellisesta
|
// maxBufferSize antaa arvion VRAM:sta — tyypillisesti ~25% todellisesta
|
||||||
@@ -1297,7 +1304,15 @@
|
|||||||
if (navigator.gpu) {
|
if (navigator.gpu) {
|
||||||
try {
|
try {
|
||||||
const adapter = await navigator.gpu.requestAdapter();
|
const adapter = await navigator.gpu.requestAdapter();
|
||||||
coderHasWebGPU = !!adapter;
|
if (adapter) {
|
||||||
|
try {
|
||||||
|
const testDevice = await adapter.requestDevice({ requiredLimits: { maxInterStageShaderComponents: 60 } });
|
||||||
|
coderHasWebGPU = true;
|
||||||
|
testDevice.destroy();
|
||||||
|
} catch(e) {
|
||||||
|
coderHasWebGPU = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch(e) {}
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
await start_agent_node(wsUrl, coderHasWebGPU, JSON.stringify(deviceInfo), taskId);
|
await start_agent_node(wsUrl, coderHasWebGPU, JSON.stringify(deviceInfo), taskId);
|
||||||
|
|||||||
Reference in New Issue
Block a user