Node.js Worker线程中onnxruntime-node模块重复加载自注册失败问题求助
解决Node.js Worker线程中onnxruntime-node模块重复注册问题
我在Node.js+TypeScript项目的worker.js文件中,因其他导入方式无法适配Worker线程,采用Function动态导入@xenova/transformers:
const TransformersApi = Function('return import("@xenova/transformers")')(); const { CLIPVisionModelWithProjection, RawImage, AutoProcessor } = await TransformersApi;
首次运行该文件时一切正常,但后续请求执行第二行代码时,出现错误:
Error: Module did not self-register: '/server/node_modules/onnxruntime-node/bin/napi-v3/linux/x64/onnxruntime_binding.node'. at Module._extensions..node (/server/lib/internal/modules/cjs/loader.js:1340:18) at Module.load (/home/server/lib/internal/modules/cjs/loader.js:1119:32) at Module._load (/home/server/lib/internal/modules/cjs/loader.js:960:12) at Module.require (/home/server/lib/internal/modules/cjs/loader.js:1143:19) at require (/home/server/lib/internal/modules/cjs/helpers.js:110:18) at Object.<anonymous> (/home/server/node_modules/onnxruntime-node/dist/binding.js:9:1) at Module._compile (/home/server/lib/internal/modules/cjs/loader.js:1256:14) at Module._extensions..js (/home/server/lib/internal/modules/cjs/loader.js:1310:10) at Module.load (/home/server/lib/internal/modules/cjs/loader.js:1119:32) at Module._load (node:internal/modules/cjs/loader:960:12) {code: 'ERR_DLOPEN_FAILED', stack: 'Error: Module did not self-register: '/home/r…oad (node:internal/modules/cjs/loader:960:12)', message: 'Module did not self-register: '/home/…napi-v3/linux/x64/onnxruntime_binding.node'.'}
我已尝试以下方案但均未解决:
- npm rebuild
- 删除node_modules后重新执行npm install
- 在package.json中添加"type": "module"(因项目使用CommonJS外部模块导致报错)
- 修改tsconfig.json配置为"module": "commonjs", "target": "es2016", "sourceMap": true
可行解决方案
1. 避免Worker线程内重复导入模块
原生模块无法在同一进程中重复注册,需将transformers的导入逻辑放在Worker初始化阶段,仅执行一次,后续请求复用已加载的模块:
// worker.js 初始化阶段仅执行一次导入 const TransformersApi = await Function('return import("@xenova/transformers")')(); const { CLIPVisionModelWithProjection, RawImage, AutoProcessor } = TransformersApi; // 监听主线程任务,复用已初始化的模块 process.on('message', async (taskData) => { try { // 示例:处理任务逻辑 const processor = AutoProcessor.from_pretrained('Xenova/clip-vit-base-patch32'); const model = CLIPVisionModelWithProjection.from_pretrained('Xenova/clip-vit-base-patch32'); // ... 具体业务处理 process.send({ success: true, data: result }); } catch (err) { process.send({ success: false, error: err.message }); } });
2. 切换到onnxruntime-web替代原生模块
@xenova/transformers支持切换为纯JS实现的onnxruntime-web,避免原生动态链接库的注册冲突。在导入前设置环境变量:
// 在导入transformers前配置环境变量 process.env.TRANSFORMERS_ONNX_RUNTIME = 'web'; const TransformersApi = await Function('return import("@xenova/transformers")')(); const { CLIPVisionModelWithProjection, RawImage, AutoProcessor } = TransformersApi; // ... 后续代码不变
3. 检查Node.js版本兼容性
onnxruntime-node对Node.js版本有明确要求,建议使用v16及以上版本。运行node -v查看当前版本,若版本过低则升级到兼容版本。
4. 控制Worker线程生命周期
避免频繁创建销毁Worker线程,可采用Worker池复用已初始化的Worker实例,减少模块重复加载的概率。
内容的提问来源于stack exchange,提问作者Rajesh Kumar
相关产品推荐
相关产品推荐

