服务器GPU管理:禁用特定显卡的正确姿势

最近在部署深度学习模型的时候,遇到了一个挺头疼的问题。我们服务器上有四块GPU,其中一块老是出问题,导致训练任务经常中断。同事建议我把那块有问题的GPU禁用掉,这样任务就能在其他正常的GPU上运行了。听起来很简单对吧?但实际操作起来,还真踩了不少坑。

设置服务器上某块GPU为0

为什么要禁用某块GPU?

可能有人会问,GPU这么宝贵的资源,为什么要禁用呢?其实原因还挺多的。比如我们遇到的情况就是硬件故障,那块GPU时不时就出现内存错误,搞得训练任务老是失败。还有些时候,不同型号的GPU混用也会出问题,新卡和老卡的兼容性不好,反而影响整体性能。

在多用户的环境下,有时候需要把某块GPU专门留给某个重要的任务,这时候也需要把其他GPU屏蔽掉。还有就是在调试代码的时候,如果只想在单卡上测试,禁用其他卡会让调试过程更清晰。

查看服务器上的GPU信息

在开始操作之前,得先搞清楚服务器上到底有几块GPU,它们的状态怎么样。最常用的工具就是NVIDIA的nvidia-smi命令了。

直接在终端输入nvidia-smi,就能看到所有GPU的详细信息,包括型号、内存使用情况、温度等等。

这个命令会显示一个表格,里面列出了所有可用的GPU。每块GPU都有一个编号,从0开始。这个编号很重要,因为后面禁用GPU的时候,就是通过这个编号来指定要操作哪块卡的。

除了nvidia-smi,还可以用CUDA的环境变量来查看。比如设置CUDA_VISIBLE_DEVICES这个环境变量,就能控制哪些GPU对程序可见。这个我们后面会详细说。

方法一:使用CUDA_VISIBLE_DEVICES环境变量

这是最常用也是最简单的方法,基本上不会对系统造成什么影响。原理就是告诉CUDA,哪些GPU可以被程序使用。

具体怎么做呢?假如我想禁用编号为0的GPU,只使用1、2、3号GPU,就可以这样设置:

  • 在Linux系统上:export CUDA_VISIBLE_DEVICES=1,2,3
  • 在Windows系统上:set CUDA_VISIBLE_DEVICES=1,2,3

设置完之后,再运行nvidia-smi,你会发现系统好像只剩下三块GPU了,编号也重新从0开始排列。这种方法的好处是临时性的,重启终端或者重新登录就会失效,不会影响其他用户。

如果要在Python程序中使用,可以在代码开头加上:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2,3"

方法二:使用NVIDIA-smi命令禁用GPU

如果需要更彻底的禁用,比如那块GPU确实坏了,不想让任何程序使用,可以用nvidia-smi的命令行工具。

具体的命令是:

sudo nvidia-smi -i 0 -pm 0
sudo nvidia-smi -i 0 -pl 0

这里的-i 0指的是要操作0号GPU,-pm 0是禁用持久化模式,-pl 0是把功率限制设到最低。这样基本上就没有程序能使用这块GPU了。

不过要提醒大家,这种方法需要管理员权限,而且影响的是所有用户。如果是共享服务器,用之前最好跟其他用户打个招呼。

方法三:修改GPU驱动设置

对于更极端的情况,比如GPU彻底坏了,需要永久禁用,可以尝试修改驱动设置。这个方法比较底层,操作要小心。

在Linux系统上,可以编辑 /etc/modprobe.d/blacklist.conf 文件,添加黑名单:

blacklist nvidia-0

然后更新initramfs并重启系统。重启后,系统就不会加载那块GPU的驱动了。

在Windows系统上,可以在设备管理器里找到对应的GPU,右键选择禁用设备。不过说实话,在服务器环境里,用Windows的情况还是比较少的。

不同场景下的选择建议

这么多方法,到底该选哪个呢?我来给大家分析一下:

使用场景 推荐方法 优点 缺点
临时测试 CUDA_VISIBLE_DEVICES 简单安全,不影响他人 重启失效
多用户环境 CUDA_VISIBLE_DEVICES 用户间互不干扰 需要每个用户单独设置
硬件故障 nvidia-smi命令 彻底禁用,防止误用 需要管理员权限
永久禁用 驱动黑名单 一劳永逸 风险较高,需要重启

实际操作中遇到的坑

说起来都是泪,我在实际操作中遇到了不少问题。比如有一次,我用CUDA_VISIBLE_DEVICES设置了可见GPU,但程序还是报错说找不到设备。后来发现是因为我在Python代码里又用torch.cuda.set_device设置了另一块GPU,两个设置冲突了。

还有一次更离谱,我明明用环境变量屏蔽了0号GPU,但程序运行的时候还是出现了内存不足的错误。排查了半天才发现,是有个后台进程没受影响,还在使用那块GPU。

另外要注意的是,不同深度学习框架对GPU设置的支持也不太一样。PyTorch和TensorFlow虽然都支持CUDA_VISIBLE_DEVICES,但在一些细节处理上还是有差异的。

验证禁用效果的正确方式

设置完之后,怎么知道真的生效了呢?我总结了几种验证方法:

  • 首先用nvidia-smi查看GPU使用情况,确认目标GPU确实没有程序在使用
  • 运行一个测试程序,比如简单的矩阵运算,看看它是否在使用你期望的GPU
  • 在Python中可以用torch.cuda.current_device来查看当前使用的GPU编号
  • 监控GPU的温度和功率,被禁用的GPU这些指标应该会明显降低

最重要的是,要实际运行你的目标任务,观察一段时间,确保真的没有问题。

最佳实践和注意事项

经过这么多次的折腾,我也总结出了一些经验。能用环境变量解决的问题,就不要用更底层的方法。环境变量足够应付90%的场景了,而且安全系数最高。

在做任何修改之前,一定要记录下当前的状态。比如拍照保存nvidia-smi的输出,这样出了问题还能回退。

如果是在生产环境操作,最好选择在业务低峰期进行,而且要准备好回滚方案。有一次我就是在高峰期操作,结果影响了正在运行的线上服务,被老大训了一顿。

记得跟团队成员沟通。你在这边禁用GPU,可能那边就有人在奇怪为什么任务跑不起来了。好的沟通能避免很多不必要的麻烦。

内容均以整理官方公开资料,价格可能随活动调整,请以购买页面显示为准,如涉侵权,请联系客服处理。

本文由星速云发布。发布者:星速云。禁止采集与转载行为,违者必究。出处:https://www.67wa.com/148149.html

(0)
上一篇 2025年12月2日 下午4:29
下一篇 2025年12月2日 下午4:29
联系我们
关注微信
关注微信
分享本页
返回顶部