BUG记录:conda环境使用的包版本与conda list显示不一致

问题场景:

组内公共服务器,配有3090 * 8,供多人使用,用于深度学习代码开发。
同一Linux用户,使用conda进行环境管理。

问题描述:

昨天还正常使用的conda环境,在今天运行代码时突然显示GPU不支持该版本。
在这里插入图片描述

原因分析:

  1. 首先怀疑是不是其他人误用了该环境,并且更换了pytorch版本。通过conda list查看该坏境下安装的包,发现目前该环境下仅有1.8.0版本的pytorch,可以适配3090。同时,也询问了其他使用人员,未在该环境进行操作。
    在这里插入图片描述

2. 既然仅有1.8.0版本的pytorch为什么会报pytorch版本过低的错误呢?通过在该环境中验证torch.__version__发现,该环境实际调用的是1.10版本的pytorch。这里产生疑问:conda list显示的不是该环境下所有的包吗?1.10版本的pytorch是在哪安装的?

答:经查看发现,系统环境中安装的正是1.10版本的pytorch,在环境内import torch时并不是首先在该环境下安装的包里寻找,而是去系统环境下寻找。同时使用conda list查看时只能看到使用该环境下的conda和pip安装的包,而所以看不到1.10版本的pytorch。这时候在conda环境中输入pip list发现确实显示存在1.10版本的pytorch,因为此时调用的是系统pip而不是conda环境内的pip,从下图可以看出conda环境中的pip与现在正在使用的pip不一致,此时调用的是/.local/lib/python3.8/即系统环境下的pip,而不是.conda/envs/pytorch1.8的。

在这里插入图片描述

3.经过以上两点分析,将问题锁定在conda环境import包时,包的优先搜索路径上。使用“python -m site”查看当前环境的包搜索路径,可以看到’/home/siton/.conda/envs/pytorch1.8/lib/python3.8/site-packages’是在’/home/siton/.local/lib/python3.8/site-packages’之后的,所以会优先检索.local/lib/python3.8下安装的包,而外部环境的pip及pip安装的包都在这里。
BUG记录:conda环境使用的包版本与conda list显示不一致_第1张图片

解决方案:

参考:https://www.cnblogs.com/bigtreei/p/15094293.html

修改环境下的site.py文件:

vim /home/siton/.conda/envs/pytorch1.8/lib/python3.8/site.py

BUG记录:conda环境使用的包版本与conda list显示不一致_第2张图片
改完之后再去当前环境看一下包搜索路径:
BUG记录:conda环境使用的包版本与conda list显示不一致_第3张图片
site.py,USER_BASE即USER_SITE的相关解释可参照此博客:

https://blog.csdn.net/The_Time_Runner/article/details/106748763

我们可以看到当前已经成果将包的检索目前改为了当前环境。
在这里插入图片描述
当前使用的pip也改为了当前环境中的pip,与conda list显示一致。

其他收获:

conda install 和 pip install的区别
众所周知,pip的确是python官方(PyPA)推荐的Python软件包安装管理工具,在安装Python软件包时,第一反应应该是pip。正是由于pip是Python官方推荐的“正统”工具,所以pip只专注于Python软件包之间的依赖,不考虑Python软件包与非Python软件包之间的依赖关系。
而Tensorflow不仅依赖于Python软件包,还依赖于非Python软件包,如cudatoolkit、cudnn、interl-openmp、intel-MKL及protoc等。
conda在安装Tensorflow时,会同时解决TensorFlow所依赖的Python软件包和非Python软件包的问题,让安装变得简单。

此处需要留意conda对于多个环境的包是统一进行管理的,不管在什么环境下载的包,都会额外在一个目录(Anaconda3\pkgs\fasttext)里面备份一份,因此如果使用conda install安装一个别的环境已经装过的包时,不用重新下载,直接copy一份到该环境即可。
但是如果使用pip因为每个环境安装使用的pip在不同的路径下,故会重复安装。

3.22补充问题:

从系统环境直接conda activate调用的是本环境的包,但是从base或者其他环境调用时就会默认用.local的?奇怪,需要解决一下
关于环境变量的读取顺序需要研究一下。

你可能感兴趣的:(Bug记录,pytorch,深度学习,python)