近期在做项目的过程中发现明明指定了gpu去进行训练,但是训练的时候发现仍然是使用的cpu,于是进行了一系列的探索,基本上该踩的坑也都踩到了,希望能帮到大家
明明nvidia-smi是有gpu的啊,肿么回事!?
ps -ef | grep 用户名
ll /proc/pid
根本找不到gpu上的进程号!
一、首先,查看自己的服务器上tensorflow安装的是不是gpu版本,是不是能够看到gpu的设备
python
import os
from tensorflow.python.client import device_lib
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "99"
print(device_lib.list_local_devices())
结果,看到的果然没有gpu:
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 14785991839664470901
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 14583628334766077791
physical_device_desc: "device: XLA_CPU device"
]
或者你可以通过这个来看,更简单,但是不保证安装的是gpu版本的tf,就一定能使用,因为后面还有环境配置的问题,所以还是上面的代码更可靠:
pip list | grep tensorflow
得到的结果,依然不是gpu版本,如果是gpu版本的话,后面会有gpu的后缀:
可以用下面的方法查看tf的版本号:
python
import tensorflow as tf
tf.__version__ #查询tensorflow版本
tf.__path__ #查询tensorflow安装路径
所以,首先问题定位到了,安装的tensorflow版本不对。所以下一步就是创建新的环境,安装gpu版本的tensorflow。
二、python创建新的虚拟环境,并安装gpu版本的tf,和各种需要的安装包
注意,一定要把python和gpu的版本信息相匹配,可以用这个指令查看自己的cuda版本:
cat /usr/local/cuda/version.txt
根据CUDA和tensorflow版本对应的关系表,检查自己的版本是否匹配,可以用这个连接查看:https://blog.csdn.net/yuejisuo1948/article/details/81043962
如果不匹配可能会报类似这样的错误,当然匹配也可能会遇到这样的错误,那是因为cuda环境变量配置有误,这个后面会讲到。
ImportError: libcublas.so.9.0: cannot open shared object file: No such file
conda list #查看安装了哪些包。
conda env list 或 conda info -e 查看当前存在哪些虚拟环境
conda update conda #检查更新当前conda
创建python版本为X.X、名字为your_env_name的虚拟环境。your_env_name文件可以在Anaconda安装目录envs文件下找到。
conda create -n your_env_name python=X.X #(2.7、3.6等)命令
我这边是用的:
conda create -n py36 python=3.6
然后激活:
conda activate py36
然后安装tensorflow的gpu版本,注意如果不加-gpu的后缀的话,安装的是cpu版本的tf
pip install tensorflow-gpu==版本号
直接使用这个指令去安装是可以的,但是太慢了,可以使用国内镜像。不止限于tensorflow,可以利用国内镜像快速安装各种python包的。常用的有两个,差不多,豆瓣的 https://pypi.douban.com/simple,
清华大学的 https://pypi.tuna.tsinghua.edu.cn/simple,清华的更全一些。
比如,安装pyqt5包:
pip install PyQt5 -i https://pypi.douban.com/simple
所以安装
tensorflow的gpu版本:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu==1.13.2
如果嫌弃这种方式比较麻烦,可以永久修改。Linux下,修改 ~/.pip/pip.conf (没有就创建一个), 修改 index-url至tuna,内容如下:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
这样就好了。
中间我安装过不符合版本要求的tensorflow,会出现类似这样的错误,当然后面发现这也可能是环境没有配置好造成的原因,这里的libcublas.so.9.0确实不符合版本要求。
ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory
我以为是版本的问题,于是乎,我就把新建的环境给删除了,
退出当前虚拟环境:
conda deactivate
查看当前存在哪些虚拟环境:
conda env list
删除你不想要的环境:
conda remove -n your_env_name(虚拟环境名称) --all
然后重新创建虚拟环境,重新安装tf的正确版本,就是
conda create -n py36 python=3.6
conda activate py36
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu==1.13.2
然后再安装各种需要的安装包,比如我这里要pandas,sklearn,pyarrow等等。仍然用豆瓣或者清华的镜像,但是,又出现了问题:
这个还是超时啊,怎么办?
解决方法之一:添加 --default-timeout:自定义timeout时间,一般能解决大部分timeout问题,但是无法提升下载速度。
pip --default-timeout=1000 install pyarrow -i https://pypi.tuna.tsinghua.edu.cn/simple
但是还是不行,又出现了这样的问题:
ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.
pyarrow from https://pypi.tuna.tsinghua.edu.cn/packages/8c/d8/ff07b4cf88362ae4bebe5b7ffc357e2e6c773cdf2db8fec1bf9e973012dd/pyarrow-0.17.0-cp36-cp36m-manylinux2014_x86_64.whl#sha256=d3ccfe1408c93abefa5ea79a295782136c8ad9bb8efd025b9df4685e081f021e:
Expected sha256 d3ccfe1408c93abefa5ea79a295782136c8ad9bb8efd025b9df4685e081f021e
Got 7d3d38d64c61ff2d4b66cd6f4a1ec9a6b6b8c317b35c804839f1472464a5e2c0
好吧,那我们只能用终极解决方案了,使用wget断点续传。使用wget -c
重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用-c
参数。
wget -c https://pypi.tuna.tsinghua.edu.cn/packages/8c/d8/ff07b4cf88362ae4bebe5b7ffc357e2e6c773cdf2db8fec1bf9e973012dd/pyarrow-0.17.0-cp36-cp36m-manylinux2014_x86_64.whl
如果在服务器上下载速度还是慢,那么可以用这个链接,下载到本地,然后,scp到服务器上去。https://pypi.tuna.tsinghua.edu.cn/packages/8c/d8/ff07b4cf88362ae4bebe5b7ffc357e2e6c773cdf2db8fec1bf9e973012dd/pyarrow-0.17.0-cp36-cp36m-manylinux2014_x86_64.whl
pip install pyarrow-0.17.0-cp36-cp36m-manylinux2014_x86_64.whl
然后就成功了。
然后我就开始用指定gpu去训练了,结果发现还是不行啊,报错如下:
ImportError: Traceback (most recent call last):
File "/home/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow.py", line 58, in <module>
from tensorflow.python.pywrap_tensorflow_internal import *
File "/home/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 28, in <module>
_pywrap_tensorflow_internal = swig_import_helper()
File "/home/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 24, in swig_import_helper
_mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
File "/home/anaconda3/envs/py36/lib/python3.6/imp.py", line 243, in load_module
return load_dynamic(name, filename, file)
File "/home/anaconda3/envs/py36/lib/python3.6/imp.py", line 343, in load_dynamic
return _load(spec)
ImportError: libcublas.so.10.0: cannot open shared object file: No such file or directory
难道tensorflow的gpu版本没有安装好?查看tf的版本:
pip list | grep tensorflow
显示如下:
tensorflow-estimator 1.13.0
tensorflow-gpu 1.13.2
对着呢啊。
然后,我们用这个代码查看一下是不是能用:
python
import os
from tensorflow.python.client import device_lib
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "99"
print(device_lib.list_local_devices())
显示如下:
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 14785991839664470901
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 14583628334766077791
physical_device_desc: "device: XLA_CPU device"
]
果然还是不能用啊 。原因在于我们没有配置好环境变量,设置好cuda路径。
三、配置好环境变量,设置cuda路径
vim ~/.bashrc
得到:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/home/anaconda3/etc/profile.d/conda.sh" ]; then
. "/home/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/home/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
# cuda
在尾巴上加上:
export C_INCLUDE_PATH=/usr/local/cuda-10.0/include:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH
export PATH=$PATH:/usr/local/cuda-10.0/bin:/home/local/bin
保存。再看一下行不行。结果依然
ImportError: libcublas.so.10.0: cannot open shared object file: No such file or directory
要疯了。到底要闹哪样啊
别急,是因为bashrc修改也许没有生效。登出再登入服务器一次,就可以了。来自老司机小韩老师的经验之谈。
于是,再次用这个美丽的代码去测试
python
import os
from tensorflow.python.client import device_lib
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "99"
print(device_lib.list_local_devices())
得到了这样美丽的结果:
name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 10294405243441403847
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 12225911303072191826
physical_device_desc: "device: XLA_GPU device"
, name: "/device:XLA_GPU:1"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 11318042704984987668
physical_device_desc: "device: XLA_GPU device"
, name: "/device:XLA_GPU:2"
device_type: "XLA_GPU"
可以看到有gpu了,再次进行实验,就可以了
完美!
下面是鸡汤:不要急躁,相信问题一定能解决,时间慢慢打磨,费力的努力会换来不费力的神气,一定要耐住性子去做。
参考链接:
https://blog.csdn.net/sinat_29957455/article/details/80636683
https://blog.csdn.net/lyy14011305/article/details/59500819
https://blog.csdn.net/u013044310/article/details/86696879
https://www.cnblogs.com/cchenyang/p/11566472.html
https://www.cnblogs.com/pretty-ru/p/10936023.html
https://jingyan.baidu.com/article/fec4bce2897e37f2618d8be1.html
https://blog.csdn.net/fst438060684/article/details/87340943
https://blog.csdn.net/qq_40614981/article/details/83035783
https://blog.csdn.net/weixin_43922901/article/details/90715779
https://blog.csdn.net/qq_42223751/article/details/97909911
https://blog.csdn.net/yuejisuo1948/article/details/81043962