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

为什么要禁用某块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