You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:03:31