mirror of
https://github.com/ruvnet/RuVector.git
synced 2026-05-25 23:24:03 +00:00
- 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>
37 lines
1.1 KiB
JavaScript
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' });
|