Linux Nvidia 多卡进程清理:fuser 与 kill 指令的 3 种组合与 2 个关键误区
在深度学习训练过程中,尤其是使用 PyTorch 的 DistributedDataParallel (DDP) 进行多 GPU 并行计算时,经常会遇到需要手动终止进程的情况。然而,简单的kill命令往往无法彻底清理 GPU 上的进程,导致资源被持续占用。本文将深入探讨三种高效的进程清理组合方法,并揭示两个常见的操作误区。
1. 多 GPU 进程清理的基础工具
在开始之前,我们需要了解几个关键命令的作用和使用场景:
nvidia-smi:查看 GPU 使用情况和进程信息fuser:显示正在使用特定设备或文件的进程kill:终止指定进程
nvidia-smi的基本输出解读:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:1B.0 Off | 0 | | N/A 42C P0 54W / 300W | 2423MiB / 32510MiB | 100% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ | 1 Tesla V100-SXM2... On | 00000000:00:1C.0 Off | 0 | | N/A 39C P0 43W / 300W | 242MiB / 32510MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 12345 C python3 2421MiB | | 1 N/A N/A 12345 C python3 240MiB | +-----------------------------------------------------------------------------+2. 三种高效的进程清理组合方法
2.1 单 GPU 进程清理
对于运行在单个 GPU 上的进程,可以使用以下组合命令:
# 查看特定 GPU 上的进程 nvidia-smi -i 0 # 查看 GPU 0 上的进程 # 终止特定 GPU 上的特定进程 kill -9 <PID>适用场景:进程确实只运行在单个 GPU 上,且nvidia-smi显示的进程信息准确。
2.2 多 GPU 进程清理
当进程可能跨多个 GPU 运行时,更可靠的方法是:
# 查看所有 GPU 设备上的进程 sudo fuser -v /dev/nvidia* # 终止所有相关进程 sudo kill -9 <PID>示例输出:
USER PID ACCESS COMMAND /dev/nvidia0: user1 12345 F.... python3 /dev/nvidia1: user1 12345 F.... python3 /dev/nvidia2: user1 12345 F.... python32.3 批量清理所有 GPU 进程
对于需要彻底清理所有 GPU 进程的情况:
# 查找所有使用 GPU 的进程并终止 sudo fuser -v /dev/nvidia* | awk '{print $3}' | xargs sudo kill -9安全提示:此命令会终止所有使用 GPU 的进程,请谨慎使用。
3. 两个关键误区与解决方案
3.1 误区一:过度依赖 nvidia-smi 的进程信息
问题现象:使用nvidia-smi查看进程后,按照显示的 GPU 索引和 PID 进行终止,但进程仍然存在。
原因分析:nvidia-smi显示的进程信息可能不完整。一个进程可能在多个 GPU 上运行,但nvidia-smi只显示它在部分 GPU 上的活动。
解决方案:
- 使用
fuser -v /dev/nvidia*确认进程实际占用的 GPU 设备 - 直接通过 PID 终止进程,而不指定 GPU 索引
3.2 误区二:忽略权限问题导致进程清理失败
问题现象:执行kill命令后,进程仍然存在,返回 "Operation not permitted"。
原因分析:普通用户可能没有权限终止其他用户或系统进程。
解决方案:
- 使用
sudo提升权限:sudo kill -9 <PID> - 如果仍然失败,检查进程状态:
ps aux | grep <PID> - 对于僵尸进程,可能需要重启相关服务或系统
4. 高级场景处理
4.1 僵尸进程处理
当进程显示为 "defunct" 或 GPU 显存未被释放时:
# 查找僵尸进程 ps aux | grep 'Z' # 终止父进程以清理僵尸进程 kill -9 <PPID>4.2 自动化清理脚本
创建一个可重用的清理脚本gpu_clean.sh:
#!/bin/bash # 检查参数 if [ "$#" -ne 1 ]; then echo "Usage: $0 <username>" exit 1 fi USERNAME=$1 # 查找并终止该用户的所有 GPU 进程 sudo fuser -v /dev/nvidia* | grep $USERNAME | awk '{print $2}' | xargs sudo kill -9 echo "Cleaned up GPU processes for user: $USERNAME"使用方式:./gpu_clean.sh your_username
5. 最佳实践与经验分享
在实际使用多 GPU 服务器进行深度学习训练时,以下经验可能对你有帮助:
预防优于治疗:在代码中添加适当的信号处理逻辑,确保进程可以优雅退出
import signal import sys def signal_handler(sig, frame): print('Received shutdown signal, exiting...') # 执行清理操作 sys.exit(0) signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler)资源监控:定期检查 GPU 使用情况,避免资源被意外占用
watch -n 1 nvidia-smi隔离环境:使用容器技术(如 Docker)可以更轻松地管理 GPU 资源
docker run --gpus all -it nvidia/cuda:11.0-base nvidia-smi日志记录:保留进程终止记录,便于后续分析和问题排查
echo "$(date): Killed process $PID" >> /var/log/gpu_clean.log
在多 GPU 环境下进行深度学习训练时,正确的进程管理方法可以节省大量时间和精力。掌握这些工具组合和避免常见误区,将使你能够更高效地利用宝贵的 GPU 资源。