GPU的程序kill后未释放内存

本文揭示了PyTorch中使用DataLoader进行数据读取时的假多线程现象,实际上是通过多个子进程来模拟多线程工作。文章详细解释了在程序结束后,子进程占用的GPU显存不会自动释放的问题,并提供了手动清理僵尸进程的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用PyTorch设置多线程(threads)进行数据读取(DataLoader),其实是假的多线程,他是开了N个子进程(PID都连着)进行模拟多线程工作,所以你的程序跑完或者中途kill掉主进程的话,子进程的GPU显存并不会被释放,需要手动一个一个kill才行,具体方法描述如下:

1.先关闭ssh(或者shell)窗口,退出重新登录

2.查看运行在gpu上的所有程序:

fuser -v /dev/nvidia*

3.kill掉所有(连号的)僵尸进程

### 如何在 Linux 系统中释放 GPU 资源 当程序运行结束后未正常释放 GPU 资源时,可以采取以下措施来手动释放这些资源。 #### 查看当前 GPU 使用情况 通过 `nvidia-smi` 命令查看当前 GPU 的使用状态以及占用它的进程 ID (PID)[^1]。 ```bash nvidia-smi ``` 如果能够找到具体的 PID,则可以直接杀死该进程以释放 GPU 显存。 #### 杀死特定进程 对于已知的 PID,可以通过发送信号强制终止对应进程: ```bash kill -9 <PID> ``` 此命令会立即停止指定的进程并尝试释放其持有的 GPU 资源。 #### 处理无可见 PID 的显存占用 有时即使 GPU 存在显存占用,但在 `nvidia-smi` 中却看不到任何关联的进程。此时可采用如下方式解决: ##### 方法一:利用 `fuser` 工具扫描设备文件 执行以下命令查找正在使用的 NVIDIA 设备及其对应的进程号,并结束它们: ```bash sudo fuser -v /dev/nvidia* ``` 上述指令不仅显示哪些进程正访问 `/dev/nvidia*` 文件,还会提供更多信息以便确认目标进程身份。随后可根据反馈结果逐一清除干扰项: ```bash sudo kill -9 $(sudo fuser -k /dev/nvidia*) ``` 这种方法适用于那些隐藏于常规工具检测之外但仍实际持有硬件控制权的情况[^2]。 ##### 方法二:重启 X Server 或整个系统服务 作为最后手段之一,在不影响整体服务器稳定性的前提下考虑重新启动图形界面或者计算机本身的服务链路也可能有效果;不过这通常只应在其他所有选项均失败之后才实施。 #### 自动化管理 Tensorflow/GPU 配置 为了避免未来再次遇到类似问题,建议调整 TensorFlow 应用中的参数设置使其更加合理高效地分配和回收计算资源。例如启用动态增长功能减少不必要的锁定行为: ```python import tensorflow as tf gpus = tf.config.experimental.list_physical_devices('GPU') if gpus: try: # 设置GPU按需增长 for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) except RuntimeError as e: print(e) ``` 这样做的好处在于可以让框架内部更灵活处理物理内存请求从而降低外部干预需求频率[^3]。 另外值得注意的是某些特殊场景可能还需要额外配置环境变量比如 CUDA_VISIBLE_DEVICES 控制可用范围进一步优化多卡协作模式下的表现效果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值