Linux Nvidia 多卡进程清理:fuser 与 kill 指令的 3 种组合与 2 个关键误区
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 PPID4.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_username5. 最佳实践与经验分享在实际使用多 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 资源。