InferScale-Sim / worker.mjs
ArchitSharma's picture
Commiting v0.3
44745f2
Raw
History Blame Contribute Delete
1.68 kB
import { loadPyodide } from "https://cdn.jsdelivr.net/pyodide/v314.0.5/full/pyodide.mjs";
const MODULES = [
"__init__.py",
"api.py",
"diagnostics.py",
"disaggregated.py",
"kv_cache.py",
"latency.py",
"metrics.py",
"models.py",
"optimizer.py",
"profiles.py",
"simulator.py",
"workloads.py",
];
let pyodide;
async function init() {
pyodide = await loadPyodide();
pyodide.FS.mkdirTree("/home/pyodide/inferscale");
for (const file of MODULES) {
const url = new URL(`./py/inferscale/${file}`, self.location.href);
const response = await fetch(url);
if (!response.ok) throw new Error(`Failed to fetch ${file}: HTTP ${response.status}`);
pyodide.FS.writeFile(`/home/pyodide/inferscale/${file}`, await response.text(), { encoding: "utf8" });
}
await pyodide.runPythonAsync(`
import sys
if "/home/pyodide" not in sys.path:
sys.path.insert(0, "/home/pyodide")
from inferscale.api import execute
`);
self.postMessage({ type: "ready" });
}
const readyPromise = init().catch((error) => {
self.postMessage({ type: "fatal", error: error.message || String(error) });
throw error;
});
self.onmessage = async (event) => {
const { id, action, payload } = event.data;
try {
await readyPromise;
pyodide.globals.set("_action", action);
pyodide.globals.set("_payload_json", JSON.stringify(payload ?? {}));
const output = await pyodide.runPythonAsync(`
import json
_result = execute(_action, json.loads(_payload_json))
json.dumps(_result, separators=(",", ":"))
`);
self.postMessage({ id, result: JSON.parse(output) });
} catch (error) {
self.postMessage({ id, error: error.message || String(error) });
}
};