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

基于CPython调用PyTorch GPU推理的C++程序内存泄漏求助

解决C++调用PyTorch OOM后GPU内存无法释放的问题

1. 把Python推理逻辑放到独立子进程

CPython的全局解释器锁和PyTorch的CUDA上下文绑定特性,导致单进程内即使释放对象,CUDA上下文也可能残留。最可靠的方式是把Python推理任务放到独立子进程里:

  • C++主进程用fork()(Linux)或CreateProcess(Windows)创建子进程,子进程内初始化Python并执行推理;
  • 主进程监控子进程状态,一旦触发OOM,直接终止子进程——操作系统会自动回收子进程占用的所有GPU资源,包括PyTorch的CUDA上下文;
  • 后续需要继续推理时,重新启动新的子进程即可。

2. Python层面手动销毁CUDA上下文

PyTorch的CUDA上下文绑定到当前线程,仅释放张量和模型可能不够,试试调用内部API强制清理:

import torch
import gc
from torch._C import _cuda_clearCublasWorkspaces, _cuda_clearCuDNNWorkspaces

def force_cuda_cleanup():
    # 遍历并删除所有张量对象
    for obj in gc.get_objects():
        try:
            if torch.is_tensor(obj) or (hasattr(obj, 'data') and torch.is_tensor(obj.data)):
                del obj
        except Exception:
            pass
    gc.collect()
    torch.cuda.empty_cache()
    # 清除cublas和cudnn的工作区缓存
    _cuda_clearCublasWorkspaces()
    _cuda_clearCuDNNWorkspaces()
    # 重置当前设备的CUDA上下文
    torch.cuda.device(torch.cuda.current_device()).reset()
  • 注意:这个方法依赖PyTorch内部API,版本兼容性可能有问题,1.13.0版本可以尝试,但稳定性不如进程隔离方案。

3. 升级Python和PyTorch版本

你当前用的Python3.9+PyTorch1.13.0在CUDA资源管理上存在已知bug,试试升级:

  • 把Python升到3.10+,PyTorch升到2.x版本——新版本优化了CUDA上下文的销毁逻辑,配合Python3.11修复后的Py_Finalize(),能更彻底地释放资源;
  • 升级后,C++层面调用Py_FinalizeEx()(替代Py_Finalize()),应该能正常回收PyTorch占用的GPU内存。

4. C++层面强制重置CUDA设备

如果不想换版本,试试在C++中调用CUDA原生API强制销毁上下文:

#include <cuda_runtime.h>

// 在调用Py_FinalizeEx()并释放所有Python对象后执行
cudaError_t reset_err = cudaDeviceReset();
if (reset_err != cudaSuccess) {
    // 处理重置失败的情况,比如打印错误信息
}
  • 注意:cudaDeviceReset()会销毁当前进程所有设备的CUDA上下文,后续如果还要用CUDA,需要重新初始化PyTorch的CUDA环境;
  • 确保在调用前,所有Python对象都通过Py_XDECREF释放,避免残留引用导致资源无法回收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:44:59