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

React Native中TensorFlow JS predict() GPU内存泄漏问题求助

Expo React Native TensorCamera 内存泄漏优化方案

常见操作失误排查

  • 帧处理并发无控制:TensorCamera默认持续输出帧数据,若每帧都触发模型推理,会导致大量未完成的异步任务堆积,内存无法及时释放。
  • tf.tidy() 未覆盖异步操作:tf.tidy()仅能同步清理张量,若模型推理是异步调用(如await model.predict()),tidy无法捕获异步流程中的张量,导致泄漏。
  • 模型重复加载:若在onReady回调中重复加载模型,会创建多个模型实例,占用大量GPU内存。
  • 输入尺寸过大:未对摄像头帧进行缩小处理,高分辨率图像会让模型推理产生大量中间张量,直接拉高内存占用。

具体优化步骤

  1. 限制帧处理并发
    添加全局锁避免同时处理多帧,跳过繁忙时的帧并及时释放对应张量:

    let isProcessing = false;
    
    const onReady = async (tensor) => {
      if (isProcessing) {
        tf.dispose(tensor);
        return;
      }
      isProcessing = true;
    
      try {
        // 帧处理逻辑
      } finally {
        tf.dispose(tensor);
        isProcessing = false;
      }
    };
    
  2. 正确管理异步张量
    异步推理的张量需手动释放,或用嵌套的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]);
        // 处理识别结果
      });
    });
    
  3. 单例模型加载与卸载
    仅在组件挂载时加载一次模型,卸载时释放资源:

    let model;
    
    useEffect(() => {
      const loadModel = async () => {
        model = await tf.loadLayersModel('model.json');
      };
      loadModel();
    
      return () => {
        if (model) model.dispose();
        tf.disposeVariables();
      };
    }, []);
    
  4. 缩小模型输入尺寸
    在TensorCamera配置中降低resize参数,减少每帧的内存占用:

    <TensorCamera
      type={Camera.Constants.Type.back}
      resizeWidth={320}
      resizeHeight={320}
      resizeDepth={3}
      onReady={onReady}
      autorender={false}
    />
    
  5. 定期清理全局张量
    可在帧处理间隙或组件生命周期中调用tf.disposeVariables(),清理未被捕获的全局张量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:43:14