Skip to content

Commit 383e899

Browse files
fix: add model disposal to embedder to prevent ONNX memory leak
Add disposeModel() that releases ONNX sessions between model loads. loadModel() now auto-disposes when switching models, and the embedding benchmark calls disposeModel() after each iteration to prevent OOM when running large models like bge-large after smaller ones. Impact: 2 functions changed, 7 affected
1 parent dc08aee commit 383e899

3 files changed

Lines changed: 18 additions & 1 deletion

File tree

scripts/embedding-benchmark.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const root = path.resolve(__dirname, '..');
2424
const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
2525
const dbPath = path.join(root, '.codegraph', 'graph.db');
2626

27-
const { buildEmbeddings, MODELS, searchData } = await import(
27+
const { buildEmbeddings, MODELS, searchData, disposeModel } = await import(
2828
new URL('../src/embedder.js', import.meta.url).href
2929
);
3030

@@ -129,6 +129,7 @@ for (const key of modelKeys) {
129129
} catch (err) {
130130
console.error(` FAILED: ${err.message}`);
131131
}
132+
await disposeModel();
132133
}
133134

134135
// Restore console.log for JSON output

src/embedder.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,26 @@ async function loadTransformers() {
238238
}
239239
}
240240

241+
/**
242+
* Dispose the current ONNX session and free memory.
243+
* Safe to call when no model is loaded (no-op).
244+
*/
245+
export async function disposeModel() {
246+
if (extractor) {
247+
await extractor.dispose();
248+
extractor = null;
249+
}
250+
activeModel = null;
251+
}
252+
241253
async function loadModel(modelKey) {
242254
const config = getModelConfig(modelKey);
243255

244256
if (extractor && activeModel === config.name) return { extractor, config };
245257

258+
// Dispose previous model before loading a different one
259+
await disposeModel();
260+
246261
const transformers = await loadTransformers();
247262
pipeline = transformers.pipeline;
248263
_cos_sim = transformers.cos_sim;

src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export {
2121
buildEmbeddings,
2222
cosineSim,
2323
DEFAULT_MODEL,
24+
disposeModel,
2425
EMBEDDING_STRATEGIES,
2526
embed,
2627
estimateTokens,

0 commit comments

Comments
 (0)