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
相关产品推荐
相关产品推荐

