当前位置: 首页 > 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.gsyq.cn/news/1646613.html

相关文章:

  • OpenAI Realtime API实时语音交互系统深度实践指南
  • CentOS 7 嵌套虚拟化实战:在KVM虚拟机中部署Xen 4.x的3步配置
  • Ubuntu移动硬盘即插即用系统:从分区到引导修复的完整避坑指南
  • 图像增强实战:从灰度变换到视觉优化
  • Linux 磁盘扩容后处理:fdisk 与 parted 工具实战对比与5步操作指南
  • Bash 环境变量与 PATH 配置:Ubuntu 22.04 下 5 个实用自定义技巧
  • OpenAI o3深度解析:推理模型如何重塑AI应用开发与智能体范式
  • MacBook Pro M3 系列外接 4K 显示器 5 个关键设置:从 HiDPI 到色彩匹配
  • Linux echo 命令 5 个高级转义符实战: 退格、 回车的 3 种脚本应用
  • Windows 10 家庭版 Administrator 账户救急:PE 环境下 3 步解锁与密码重置
  • Jboss安全配置实战:从弱口令防护到网站根目录加固
  • Linux 日志分析实战:grep 组合 awk/sed 实现 5 类复杂多关键字过滤
  • STM32驱动WS2812B灯带:SPI+DMA实现高效灯光控制
  • CentOS 7.6 Swap 分区动态调整:从 1.2G 扩容至 2.2G 的 8 步操作实录
  • Wand-Enhancer完整指南:快速免费解锁WeMod专业版功能的终极解决方案
  • YOLO目标检测演进史:从v1到v13,如何解决速度、精度与部署难题
  • 为什么文件明明是 UTF-8,PowerShell 里还是中文乱码?一篇讲透 Codex、Claude 等 AI 编码工具下的排查与修复
  • 前缀和题解:多加一个哨兵,少掉一堆边界判断
  • WinBtrfs终极指南:如何在Windows上无缝读写Linux Btrfs文件系统
  • DeepL Chrome扩展:5分钟实现专业级浏览器划词翻译的完整指南
  • Windows 11 右键菜单管理:Git Bash 等3类工具的自定义与清理
  • 美加墨世界杯:大模型预测翻车,却在营销与应用场景中大放异彩!
  • Wig/BigWig 格式实战:3步从BAM文件生成UCSC基因组浏览器轨迹
  • Linux Swap 分区实战:CentOS 7.6 下 3 种方法动态调整 1-8GB 交换空间
  • C++和C中const的区别详解
  • Windows与Mac系统锁屏密码重置全攻略
  • 老旧Mac系统重生指南:突破官方限制的硬件兼容方案
  • Windows 11 右键菜单修复:3种方法恢复被折叠的 Git Bash Here 选项
  • Servlet 3.0 与 JSP 2.3 实战:5分钟构建一个带登录验证的简易留言板
  • Spring Boot+Vue课程作业管理系统毕业设计实战指南