跑tensorflow代码训练模型的时候发现tensorflow把参数copy进了GPU却仍然在CPU上训练,现象就是用nvidia-smi
查出的GPU使用情况中 Memory-Usage不为0,而Volatile GPU-Util 为0。正常情况下应该两个都不为0,下图是正常情况:
查看输出log发现是tensorflow加载一些CUDA10.0的库失败了,安装的CUDA并不是10.0,说明tensorflow和CUDA版本不兼容。更换tensorflow版本或者CUDA版本即可。
奇怪的现象是,更换完之后再跑模型仍然是不能使用GPU。
偶然发现,如果在xshell中登录ssh运行代码就会在GPU上训练,执行
import tensorflow as tf
tf.test_is_gpu_available()
返回True;
如果在vscode-remote中打开终端运行代码就不会在GPU上训练,会报错加载CUDA的一些库失败。执行tf.test_is_gpu_available()
返回False。
分别在xshell下和vscode-remote Terminal中查看 LD_LIBRARY_PATH
环境变量,发现二者不一致。vscode-remote中的环境变量少了CUDA库的路径。
网上查阅到这篇博客ssh连接远程主机执行脚本的环境变量问题
从中了解到vscode-remote 中的Terminal 属于 non login 模式。但通过实验可以发现,vscode-remote Terminal是会加载 ~/.bashrc中的环境变量的,似乎是vscode做了额外的操作或者是bash版本的缘故。
总之,如果在vscode-remote Terminal运行代码,要注意环境变量是否和xshell ssh Terminal下的一致。