ruvector/examples/onnx-embeddings-wasm/parallel-worker.mjs
rUv b5063b4bdc feat(onnx-wasm): add parallel worker threads for 3.8x batch speedup
- ParallelEmbedder class using Node.js worker_threads
- Distributes batches across multiple CPU cores
- Benchmark results: 3.6-3.8x speedup on batch processing
- Per-text latency drops from ~390ms to ~103ms with 4 workers
- Published v0.1.2 to npm and crates.io

Usage:
  import { ParallelEmbedder } from 'ruvector-onnx-embeddings-wasm/parallel';
  const embedder = new ParallelEmbedder({ numWorkers: 4 });
  await embedder.init();
  const embeddings = await embedder.embedBatch(texts);

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 05:02:28 +00:00

37 lines
1.1 KiB
JavaScript

/**
* Worker thread for parallel ONNX embedding generation
*/
import { parentPort, workerData } from 'worker_threads';
import { WasmEmbedder, WasmEmbedderConfig } from './pkg/ruvector_onnx_embeddings_wasm.js';
// Initialize embedder with model data passed from main thread
const { modelBytes, tokenizerJson, config } = workerData;
const embedderConfig = new WasmEmbedderConfig()
.setMaxLength(config.maxLength)
.setNormalize(true)
.setPooling(0);
const embedder = WasmEmbedder.withConfig(
new Uint8Array(modelBytes),
tokenizerJson,
embedderConfig
);
// Listen for texts to embed
parentPort.on('message', (message) => {
if (message.type === 'embed') {
const { id, texts } = message;
try {
const embeddings = texts.map(text => Array.from(embedder.embedOne(text)));
parentPort.postMessage({ type: 'result', id, embeddings });
} catch (error) {
parentPort.postMessage({ type: 'error', id, error: error.message });
}
} else if (message.type === 'shutdown') {
process.exit(0);
}
});
// Signal ready
parentPort.postMessage({ type: 'ready' });