tensorflow固定版本安装及查看是否使用了gpu版本cuda路径设置工程采坑经验

近期在做项目的过程中发现明明指定了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/Hero_Never_GIVE_UP/article/details/83513180?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

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

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值