当前位置: 首页 > news >正文

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 资源。

http://www.jsqmd.com/news/1134624/

相关文章:

  • Linux 磁盘扩容后处理:fdisk 与 parted 工具实战对比与5步操作指南
  • Ubuntu移动硬盘即插即用系统:从分区到引导修复的完整避坑指南
  • Windows Server 2016 DNS 服务器配置:3步完成正向/反向解析与防火墙排错
  • Windows 10/11 与 Linux (Ubuntu 22.04) 系统WOL配置:5个关键驱动与电源设置差异
  • 熵权TOPSIS Python 实战:3步实现企业人才价值评估(附完整代码)
  • CentOS 7 升级 GCC 9.3 实战:3步SCL部署,兼容Python 3.12与Node.js 21
  • AI搜索时代企业获客新赛道 国内专业GEO服务公司盘点
  • OpenAI o3深度解析:推理模型如何重塑AI应用开发与智能体范式
  • 统信UOS V20 双系统引导实战:GRUB 配置 Windows 10 与 UOS 双启动 3 步指南
  • 从零搭建Linux虚拟机:VMware+Ubuntu实战指南与免费激活方案
  • Bash 环境变量与 PATH 配置:Ubuntu 22.04 下 5 个实用自定义技巧
  • 统信UOS V20 终端进阶:3种方式进入tty2命令行修复系统桌面
  • Ubuntu截图全攻略:从快捷键到专业工具
  • Ubuntu 22.04 LVM 扩容实战:3步将2块新硬盘合并挂载到 /data 目录
  • 统信UOS V20 桌面版 tty9 超管模式实战:3步进入与5个关键修复场景
  • 黑群晖 DSM 7.2 旧电脑部署:3步完成引导盘制作与局域网访问
  • 雷蛇鼠标板载内存配置:1次Windows设置,实现Mac 5键自定义(附XML文件)
  • Linux passwd 命令 10 个实战参数详解:从锁定账户到设置密码有效期
  • Linux 后台任务管理:nohup、jobs、ps 与 kill 命令的 4 步协同实战
  • MacBook Pro M3 系列外接 4K 显示器 5 个关键设置:从 HiDPI 到色彩匹配
  • Windows API SetWindowsHookEx 实战:C++ 实现全局键盘监听与3种消息过滤
  • Linux echo 命令 5 个高级转义符实战: 退格、 回车的 3 种脚本应用
  • fdisk 分区实战:1块20GB磁盘创建3主1扩2逻辑分区完整流程
  • Jboss安全配置实战:从弱口令防护到网站根目录加固
  • Windows 10 家庭版 Administrator 账户救急:PE 环境下 3 步解锁与密码重置
  • Linux /proc/<pid>/fd 实战:3种方法实时捕获进程标准输出与错误流
  • glibc 2.31 源码升级风险规避:3个关键备份与回滚策略(附CentOS 7实测)
  • Windows 10 22H2 外置SSD原生安装:diskpart + DISM 命令7步部署,跨电脑启动实测
  • STM32驱动WS2812B灯带:SPI+DMA实现高效灯光控制
  • Windows 11/10 系统配置工具 msconfig 的5个高级调试功能实战