今天开始在 GPU 上面训练深度学习模型,首先遇到的问题就是 kernel dead,究其原因是因为 GPU 被占用,因此需要指定 GPU 来运行,而对于显存的理解,正常来说应该是图形显示的用处,但是在深度学习训练的时候,显存就类似于主板的内存,没有足够大的显存就类似于主板内存太小所导致的一系列问题。
虽然 keras 代码可以自动识别 GPU,存在被占用的情况,因此需要自己设置 GPU,首先是查看 GPU 以及 显存 使用情况。
在 Terminal 中输入 nvidia-smi,如下所示:
(py3.6_tensorflow2.0) (base) [sankuai@xh-deliveryai-mapui01 unet-keras]$ nvidia-smi Tue Jul 13 17:08:00 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.39 Driver Version: 418.39 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla M60 On | 00000000:00:15.0 Off | 0 | | 42% 56C P0 50W / 120W | 7333MiB / 7618MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla M60 On | 00000000:00:16.0 Off | 0 | | 44% 62C P0 122W / 120W | 4236MiB / 7618MiB | 100% Default | +-------------------------------+----------------------+----------------------+ | 2 Tesla M60 On | 00000000:00:17.0 Off | 0 | | 34% 52C P0 48W / 120W | 80MiB / 7618MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 3 Tesla M60 On | 00000000:00:18.0 Off | 0 | | 36% 40C P0 43W / 120W | 80MiB / 7618MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 35317 C ...da3/envs/py3.6_tensorflow2.0/bin/python 7322MiB | | 1 35317 C ...da3/envs/py3.6_tensorflow2.0/bin/python 69MiB | | 1 64279 C python 4153MiB | | 2 35317 C ...da3/envs/py3.6_tensorflow2.0/bin/python 69MiB | | 3 35317 C ...da3/envs/py3.6_tensorflow2.0/bin/python 69MiB | +-----------------------------------------------------------------------------+
界面解读(并非针对本图,原链接)
- GPU : GPU编号,【笔者目前使用的是双卡,编号为0,1】;
- Name:GPU型号,这里为GeForce GTX 1080 Ti;
- Persistence-M :持续模式状态,如果为on,能耗大但新的GPU启动时耗时短,这里为off;
- Fan : 风扇转速,取值为0%~100%;
- Temp : 温度,单位是℃;
- Perf : 显卡性能状态,取值为P0~P12,其中P0表示状态最大性能{未工作},P12表示状态最小性能{达到最大工作限度};
- Pwe:Usage/Cap : 能耗,71w表示当前能耗,250w表示满负荷能耗;
- Bus-Id : 涉及GPU总线的东西,domain:bus:device.function;
- Disp.A : Display Active,表示GPU的显示是否初始化;
- Memory-Usage : 显存使用情况, 11021M表示当前0号显卡使用大显存大小;11178M表示显卡大小;
- Volatile GPU-Util : 表示GPU的实际利用率;
- Uncorr. ECC:Error Correcting Code,错误检查与纠正;
- Compute M:compute mode,计算模式。
实时更新(可以修改数字,下面是 1s 更新一次)
watch -n 1 nvidia-smi
设置可看见的方式,既可以选择想要被看到的 GPU:
上图中的 GPU 0,显存大量被使用,GPU 1,GPU 被大量使用,因此只能选择 2,3,如下的代码所示:
os.environ["CUDA_VISIBLE_DEVICES"] = "2, 3"
注意:一定要确保资源充足才能运行!!