React Native中TensorFlow JS predict() GPU内存泄漏问题求助
Expo React Native TensorCamera 内存泄漏优化方案
常见操作失误排查
- 帧处理并发无控制:TensorCamera默认持续输出帧数据,若每帧都触发模型推理,会导致大量未完成的异步任务堆积,内存无法及时释放。
- tf.tidy() 未覆盖异步操作:tf.tidy()仅能同步清理张量,若模型推理是异步调用(如
await model.predict()),tidy无法捕获异步流程中的张量,导致泄漏。 - 模型重复加载:若在
onReady回调中重复加载模型,会创建多个模型实例,占用大量GPU内存。 - 输入尺寸过大:未对摄像头帧进行缩小处理,高分辨率图像会让模型推理产生大量中间张量,直接拉高内存占用。
具体优化步骤
限制帧处理并发
添加全局锁避免同时处理多帧,跳过繁忙时的帧并及时释放对应张量:let isProcessing = false; const onReady = async (tensor) => { if (isProcessing) { tf.dispose(tensor); return; } isProcessing = true; try { // 帧处理逻辑 } finally { tf.dispose(tensor); isProcessing = false; } };正确管理异步张量
异步推理的张量需手动释放,或用嵌套的tf.tidy()处理同步部分,异步结果单独dispose:await tf.tidy(() => { const resized = tf.image.resizeBilinear(tensor, [320, 320]); const normalized = resized.div(255.0); return model.predict(normalized).array().then(predictions => { tf.dispose([resized, normalized]); // 处理识别结果 }); });单例模型加载与卸载
仅在组件挂载时加载一次模型,卸载时释放资源:let model; useEffect(() => { const loadModel = async () => { model = await tf.loadLayersModel('model.json'); }; loadModel(); return () => { if (model) model.dispose(); tf.disposeVariables(); }; }, []);缩小模型输入尺寸
在TensorCamera配置中降低resize参数,减少每帧的内存占用:<TensorCamera type={Camera.Constants.Type.back} resizeWidth={320} resizeHeight={320} resizeDepth={3} onReady={onReady} autorender={false} />定期清理全局张量
可在帧处理间隙或组件生命周期中调用tf.disposeVariables(),清理未被捕获的全局张量。
内容的提问来源于stack exchange,提问作者pepperav
相关产品推荐
相关产品推荐

