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.... python3

2.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 上的活动。

解决方案

  1. 使用fuser -v /dev/nvidia*确认进程实际占用的 GPU 设备
  2. 直接通过 PID 终止进程,而不指定 GPU 索引

3.2 误区二:忽略权限问题导致进程清理失败

问题现象:执行kill命令后,进程仍然存在,返回 "Operation not permitted"。

原因分析:普通用户可能没有权限终止其他用户或系统进程。

解决方案

  1. 使用sudo提升权限:
    sudo kill -9 <PID>
  2. 如果仍然失败,检查进程状态:
    ps aux | grep <PID>
  3. 对于僵尸进程,可能需要重启相关服务或系统

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 服务器进行深度学习训练时,以下经验可能对你有帮助:

  1. 预防优于治疗:在代码中添加适当的信号处理逻辑,确保进程可以优雅退出

    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)
  2. 资源监控:定期检查 GPU 使用情况,避免资源被意外占用

    watch -n 1 nvidia-smi
  3. 隔离环境:使用容器技术(如 Docker)可以更轻松地管理 GPU 资源

    docker run --gpus all -it nvidia/cuda:11.0-base nvidia-smi
  4. 日志记录:保留进程终止记录,便于后续分析和问题排查

    echo "$(date): Killed process $PID" >> /var/log/gpu_clean.log

在多 GPU 环境下进行深度学习训练时,正确的进程管理方法可以节省大量时间和精力。掌握这些工具组合和避免常见误区,将使你能够更高效地利用宝贵的 GPU 资源。