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

TensorFlow.js在engine.ts崩溃:多模型推理时出现未定义属性错误

问题分析与解决方案

问题场景

  • 内部JS应用基于TensorFlow.js实现双模型推理:一个是含126个节点的GraphModel,另一个是3层的LayersModel
  • 采用WebGL后端(切换其他后端问题依旧)
  • 先运行GraphModel推理,再执行LayersModel推理时,TensorFlow.js崩溃;单独使用任意一个模型无异常
  • 报错栈追踪:
engine.ts:426 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'backend')
    at v.moveData (engine.ts:426:29)
    at i.get (backend.ts:55:22)
    at Object.Nr [as kernelFunc] (Reshape.ts:44:41)
    at a (engine.ts:647:22)
    at engine.ts:713:23
    at v.scopedRun (engine.ts:480:19)
    at v.runKernelFunc (engine.ts:709:10)
    at v.runKernel (engine.ts:554:17)
    at reshape_ (reshape.ts:60:10)
    at reshape__op (operation.ts:51:22)

解决方法

  • 严格管控张量生命周期
    第一个模型推理后,未释放的临时张量可能干扰后端资源状态,导致第二个模型运行异常。用tf.tidy()包裹推理逻辑自动清理临时张量,用完结果后手动调用dispose()释放:

    // 第一个模型推理逻辑
    const graphResult = tf.tidy(() => {
      return graphModel.predict(yourInputTensor);
    });
    // 业务逻辑完成后释放张量
    graphResult.dispose();
    
  • 保证后端上下文一致
    加载模型前显式指定后端,避免模型加载或推理过程中意外切换后端环境:

    await tf.setBackend('webgl');
    // 按顺序加载两个模型
    const graphModel = await tf.loadGraphModel('./path/to/graph/model.json');
    const layersModel = await tf.loadLayersModel('./path/to/layers/model.json');
    
  • 隔离模型间的张量传递
    报错出在Reshape操作,大概率是第二个模型接收的输入张量状态异常(如被第一个模型后端回收)。可将第一个模型的结果转为普通JS数组,再重新创建张量传入第二个模型:

    // 将GraphModel结果转成数组
    const graphResultArray = await graphResult.array();
    graphResult.dispose();
    // 重新创建张量供LayersModel使用
    const layersInput = tf.tensor(graphResultArray);
    const layersResult = layersModel.predict(layersInput);
    
  • 升级TensorFlow.js版本
    该报错可能是TF.js的已知bug,升级到最新稳定版可解决多数兼容性问题:

    npm install @tensorflow/tfjs@latest
    

内容的提问来源于stack exchange,提问作者Milan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:02:52