系统配置
Ubuntu18.04
Anaconda4.9.2
Cuda10.0+Cudnn7.6.5
CPU版本
执行pip install tensorflow默认安装的是CPU版本,并且安装后会有较多import依赖问题,部分记录如下,基本都属于"No module named xxxx"。
1.找不到wrapt
通过conda install wrapt解决该问题。
2.找不到GLIBCXX
问题描述:ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.29' not found
这个问题比较麻烦,看上去是C++库链接出错,好在找到一个比较完美的解决方案(https://zhuanlan.zhihu.com/p/615111375),主要步骤总结如下:
1)终端查看报错信息中的地址,确认是否缺失对应的GLIBCXX
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
strings之后带的参数根据报错的具体信息调整(一般相差不大)。
2)查看当前系统中是否有较高版本的同类型文件
sudo find / -name "libstdc++.so.6*"
此命令需要sudo管理员权限,搜索结果也比较多,对于某个虚拟环境env_name,如果该环境中有较高版本的 libstdc++.so.6就能用,比如我的搜索结果中有/home/xxx/anaconda3/envs/env_name/lib/libstdc++.so.6.0.29(个人信息和环境名实际会有出入)。
3)对第2步中找到的libstdc++.so.6执行第1步的命令,查看其是否包含缺失的GLIBCXX版本
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.29 | grep GLIBCXX
4)确认其包含GLIBCXX_3.4.29之后,用cp命令将其复制到/usr/lib/x86_64-linux-gnu中(注意两个路径之间的空格,权限不够加sudo)
cp /home/xxx/anaconda3/envs/env_name/lib/libstdc++.so.6.0.29 /usr/lib/x86_64-linux-gnu
5)最后更新libstdc++.so.6的链接,同样如果权限不够就加sudo
先删除/usr/lib/x86_64-linux-gnu中原有的libstdc++.so.6(保守起见我只是将其重命名):
rm /usr/lib/x86_64-linux-gnu/libstdc++.so.6 # 删除
mv /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/x86_64-linux-gnu/libstdc++.so.6-old # 重命名
然后将复制的 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.29链接为/usr/lib/x86_64-linux-gnu/libstdc++.so.6:
ln /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.29 /usr/lib/x86_64-linux-gnu/libstdc++.so.6
链接效果如下:
可以看到保留的libstdc++.so.6-old连接到0.25版本的,因此缺少了GLIBCXX_3.4.29,0.29版本解决了这个问题。
3.找不到typing_extensions
当前环境中已安装4.5.0的typing_extensions,但依旧有ImportError,并且重装也没有解决。然后想到是不是版本太高,便去PyPI官网找一个稍低的版本,pip install typing_extensions==4.4.0之后问题解决。
4.找不到flatbuffers
参考typing_extensions的解决思路,同样到PyPI找了个较低版本重新安装,完美解决。
PS:如果遇到其他找不到依赖的问题,可以参考上面的解决办法,一般缺少的需要手动安装,已安装依旧报错可能要考虑版本匹配的问题。
GPU版本
失败安装记录
某个教程说cudatoolkit和cudnn可以用conda安装,但tensorflow必须用pip安装,于是创建conda虚拟环境后,先安装了cudatoolkit和cudnn:
conda install cudatoolkit=11.2 cudnn=8.1
接着pip安装tensorflow的GPU版本(选的是2.8.0):
pip install tensorflow-gpu==2.8.0
通过终端查看可用设备:
# 终端启动python
>>>import tensorflow as tf
>>>tf.config.list_physical_devices()
这次tensorflow的import没有问题了,但仍旧不可用GPU,理论上分开安装也许也是可以的,现在想可能是cuda相关的安装和系统实际不匹配(系统Cuda版本是10.0,,而上面安装的是11)导致的,后续通过conda成功安装的记录中,conda安装的也是和系统匹配的cudatoolkit和cudnn。
成功安装记录
尝试上面的一些方法之后,还是回到使用conda安装。
先是尝试conda install tensorflow-gpu=2.6.0,出现conda错误信息,提示找不到对应的package。
根据提示去https://anaconda.org上搜索tensorflow-gpu,可以找到以下页面:
也就是conda的channel有tensorflow-gpu,但2.6.0版本是Windows系统的,Linux系统有2.4.1版本,根据提示,直接执行conda install -c anaconda tensorflow-gpu,conda会自动安装与系统一致的cudatoolkit和cudnn,然后就能正常安装和使用GPU版本的tensorflow了。
之后顺便安装了一些会用到的库:
pip install pandas matplotlib notebook
安装了Jupyter Notebook(pip install notebook会自动安装ipykernel)之后,可以通过以下命令将虚拟环境env_name添加到notebook的kernel里:
python -m ipykernel install --user --name=env_name
执行以下命令可以看到jupyter notebook的kernel中已经成功添加该环境:
jupyter kernelspec list
jupyter kernelspec uninstall env_name # 如果需要删除某个环境,用uninstall
这样就能在notebook里使用该环境配置。