对于Anaconda,在Windows下挺好用的;对于Ubuntu下,我觉得使用系统自带的Python2和Python3挺方便的,所以内心一直拒绝详细了解Anaconda,直到最近发现实验室电脑环境乱的简直了。所以乖乖的学习下Anaconda的虚拟环境管理机制。
Anaconda简介与安装
Anaconda是Python的一个开源发行版本,主要面向科学计算。我们可以简单理解为,Anaconda是一个预装了很多我们用的到或用不到的第三方库的Python。而且相比于大家熟悉的pip install
命令,Anaconda中增加了conda install
命令。当你熟悉了Anaconda以后会发现,conda install会比pip install更方便一些。比如大家经常烦恼的lxml包的问题,在Windows下pip是无法顺利安装的,而conda命令则可以,后面会详细展示。
从国内开源镜像清华源下载Anaconda安装包。
Anaconda的版本分为Anaconda2和Anaconda3,大家可以自行下载日常常用的版本,提供32位和64位下载。但是这个版本只是说明Anaconda自带的Python版本,我们可以使用任何一个版本的Anaconda创建任意一个新的Python环境,例如可以使用Anaconda2创建一个Python3.6的环境,当然也可以使用Anaconda3创建一个新的Python2.7的环境。
windows安装
对于在Windows安装的用户,会遇到下面这个界面。
第一个勾是是否把Anaconda加入环境变量,这涉及到能否直接在cmd中使用conda、jupyter、ipython等命令,推荐打勾,如果不打勾话问题也不大,可以在之后使用Anaconda提供的命令行工具进行操作;第二个是是否设置Anaconda所带的Python 3.6为系统默认的Python版本,这个自己看着办,问题不大。
对于Windows,若没有将Anaconda添加到环境变量,且需要在非anaconda prompt,则需要在windows系统环境变量中添加:
1 | D:\Anaconda3 |
Linux安装
Linux下安装没有啥好说的,这里就提一下权限的问题。比如说我们安装的路径为/root/miniconda3
,并且安装的时候也是用root安装的。若想要非root用户也使用该conda,需要注意/root
与/miniconda
目录,普通用户也可以读取。
1 | # lh |
若/root
文件夹为dr-xr-x---
,则需要使用chmod 755 /root
设置一下权限。
更换Anaconda源
Anaconda安装成功之后,我们需要修改其包管理镜像为国内源。
Anaconda清华源官网建议直接修改用户目录下的 .condarc
文件。Windows 用户无法直接创建名为 .condarc
的文件,可先执行 conda config --set show_channel_urls yes
生成该文件之后再修改。
1 | channels: |
运行 conda clean -i
清除索引缓存,保证用的是镜像站提供的索引。
若出现错误CondaHTTPError: HTTP 000 CONNECTION FAILED for url
,则将上面的https
改为http
。
更换完Conda源后,可以使用下面指令查看当前源的配置信息:
1 | conda info |
使用conda安装Pytorch:
conda install pytorch torchvision cudatoolkit=9.0
。
conda换回默认源
1 | conda config --remove-key channels |
虚拟环境
生成虚拟环境
因为我现在安装的是最新版Anaconda3,其自带的Python版本为3.6,如果我们需要添加2.7版本的Python,可以进行如下操作。(同理,如果有人安装的是Anaconda2需要添加Python 3.x,之后操作里的2.7改为3.6或3.5即可)
查看所有的
语法格式:
1 | conda create -n name python=version |
实例
1 | conda create -n zd38 python=3.8 |
其中zd38是新添加环境的名字,可以自定义修改。
激活与退出虚拟环境
在Windows系统中,通过activate py27
和deactivate py27
命令激活、退出该环境。
在Linux和OS系统下,激活虚拟环境
1 | 语法格式:source activate name |
在Linux和OS系统下,退出虚拟环境conda deactivate
使用其它用户的环境
如果想要使用其它用户的环境,我们假设其它用户test1的环境位置在/dockerdata/test1/.conda/envs/
,该路径下的环境为:
1 | (zd310) test1@ubuntua:~$ lh /dockerdata/test1/.conda/envs/ |
假设新的用户为test2,且home路径位于/dockerdata/test2
,若想使用test1用户的环境,需要在/dockerdata/test2/.condarc
添加:
1 | envs_dirs: |
当然若不配置,通过
conda activate /dockerdata/test1/.conda/envs/zd310
也可以激活环境。暂时不清楚两者的区别。
Anaconda常用指令
更新conda
1 | # 确认conda已安装 |
其中更新命令不仅仅会更新conda的版本,同时会自动更新相关的包,
其实,我们也可以使用这个命令来更新Anaconda版本
1 | conda update anaconda |
包管理
1 | # 查看所有已安装的软件包 |
可用的完整软件包列表可以在http://docs.continuum.io/anaconda/pkg-docs.html中查找,
所有的软件包都按照Python的版本进行了分类
当我们想要安装某个软件包时,可以直接在命令行中进行查找并安装
1 | # 查找软件包 |
另外,也可以http://anaconda.org网站上搜索想要的软件包,根据页面上的提示执行相应的命令即可安装
最后,在激活新环境后,我们所做的操作便都是在新环境下的,包括pip命令来安装第三方库。我们来试一下在Windows下使用pip安装lxml。
1 | pip install lxml |
不出所料…失败了…如果你执意要自己解决这个问题,会很复杂,至少我在小白阶段直接放弃了解决这个问题…
那么正确的做法是什么呢?一条命令就够了。
1 | conda install -n py27 lxml |
当然了,对于可以正常安装的库,自然可以使用pip命令。另外,一般使用Anaconda安装包的指令为conda install 包名
。
对于conda
来说,其实python也是一个软件包,所以,python
的管理基本和软件包管理相同
查找可用python版本:
1 | conda search --full-name python |
本地包安装
从这里可以下载Pytorch的离线安装包。例如,当本地包名为pytorch-1.3.0-py3.7_cuda10.0.130_cudnn7.6.3_0.tar.bz2
,将其放到~/.conda/pkgs
目录,然后安装:
1 | cd ~/.conda/pkgs |
科学计算包
由于我们现在安装的是Anaconda3,之后又新添加了Python 2.7环境,但是Python 3.6环境中安装了Anaconda自带的科学计算环境,Python 2.7中却没有,那么如何为新添加的环境也装上Anaconda的科学计算包呢,没必要一个一个来,更没有必要再去安装Anaconda2了,只需:
1 | conda install -n py27 anaconda |
但是这会安装非常多,非常多,非常多的包,慎用。
环境拷贝和备份
其实,还可以复制一个和指定环境完全相同的环境,只要在创建时添加--clone
参数指定相应的环境名称即可
1 | # 复制环境 |
另外,环境也可以在不同机器之间进行复制,只要将要复制的环境导出为*.yml
配置文件,再到指定机器上创建时指定配置文件即可
1 | # 导出配置文件 |
查看已有环境
通过conda info -e
命令查看已有的环境。
删除指定环境
通过conda remove -n env_name --all
来删除指定的环境(如果不添—all参数,而是指明某个库名,则是删除该库)。
比如我现在要删除py35这个环境。
删除空闲包
1 | conda clean -p //删除没有用的包 |
pip使用
当使用命令激活一个环境,例如conda activate zdaiot
后直接使用pip
命令是系统的pip
,安装路径也有问题。解决方法为:
首先在该环境下安装pip
:
1 | conda install pip |
然后使用pip
时指定pip
的路径,例如:
1 | /home/lab3/anaconda3/envs/zdaiot/bin/pip install Pillow |
Anaconda移动
当因为某些原因需要移动Anaconda文件夹时,移动后记得使用ln -s
在原位置建立一个软连接。
Anaconda卸载
对于Linux下,直接删除Anaconda文件夹,然后到~/.bashrc
文件中删除掉相应的Anaconda环境。接着重启终端即可。
miniconda使用
我安装的miniconda自带Python3.7,使用conda init
指令可以激活这个环境。并且在不同的终端都会生效。
在某一个终端中,若不想激活,可以使用conda deactivate
命令在该终端中取消激活(仅对于当前终端取消激活)。在该终端中再次使用conda activate
激活。
在激活环境中,可以pip直接安装,不要加sudo。直接敲pip会随着当前Python虚拟环境改变而改变。
使用jupyter Notebook
在虚拟环境中使用:
1 | conda install nb_conda |
在终端输入jupyter-notebook
的时候,点击Conda
如下图所示,
报错为EnvironmentLocationNotFound: Not a conda environment: /home/zdaiot/miniconda3/envs/miniconda3
。解决方法为:打开/home/zdaiot/miniconda3/lib/python3.7/site-packages/nb_conda
下的envmanager.py
文件,将for env in info['envs']]
替换为for env in info['envs'] if env != info['root_prefix']]
Jupyter Notebook多版本Python并存
我们已经说完了Anaconda中的包管理,那么既然Anaconda中可以使Python 2.x和3.x共存,Jupyter Notebook是否可以呢?
当然可以。
在这里我们不展开来介绍Jupyter Notebook,因为后面还会专门再写一篇,大家可以先初步了解。多版本的Python或者R等语言,在Jupyter中被称作kernel。
如果想要给Jupyter添加多个Python版本的kernel,有两种做法。
如果这个Python版本已经存在(比如我们刚才添加的py27环境),那么你可以直接为这个环境安装ipykernel包。即:
1 | conda install -n py27 ipykernel |
然后激活这个环境,输入
1 | python -m ipykernel install --user |
如果所需版本并不是已有的环境,可以直接在创建环境时便为其预装ipykernel。
如:
1 | conda create -n py27 python=2.7 ipykernel |
安装深度学习环境
本来这个部分没啥好说的,但是如果想使用离线安装包的话,这里就得记录一下。
cuda 与 cudatoolkit 的区别
在使用 Anaconda 安装 Pytorch 等深度学习框架时,可以发现 Anaconda 会自动为我们安装 cudatoolkit。这里安装的 cudatoolkit 与通过 Nvidia 官方提供的 CUDA Toolkit 是不一样的。具体而言,Nvidia 官方提供的 CUDA Toolkit 是一个完整的工具安装包,其中提供了 Nvidia 驱动程序、CUDA 程序相关的开发工具包等的安装选项。通过 Nvidia 官网提供的 CUDA Toolkit 安装的是完整的 CUDA 开发工具,包括 CUDA 程序的编译器、IDE、调试器等应用程序,CUDA 所支持的功能所对应的各式库文件以及它们的头文件等,具体的组成可参考 CUDA Toolkit Major Components.
实际上,Nvidia 官方提供安装的 CUDA Toolkit 包含了进行 CUDA 相关程序开发的编译、调试等过程相关的所有组件。但对于 Pytorch 之类的深度学习框架而言,其在大多数需要使用 GPU 的情况中只需要使用 CUDA 的动态链接库支持程序的运行( Pytorch 本身与 CUDA 相关的部分是提前编译好的 ),就像常见的可执行程序一样,不需要重新进行编译过程,只需要其所依赖的动态链接库存在即可正常运行。故而,Anaconda 在安装 Pytorch 等会使用到 CUDA 的框架时,会自动为用户安装 cudatoolkit,其主要包含应用程序在使用 CUDA 相关的功能时所依赖的动态链接库。在安装了 cudatoolkit 后,只要系统上存在与当前的 cudatoolkit 所兼容的 Nvidia 驱动,则已经编译好的 CUDA 相关的程序就可以直接运行,而不需要安装完整的 Nvidia 官方提供的 CUDA Toolkit .
在大多数情况下,上述 cudatoolkit 是可以满足 Pytorch 等框架的使用需求的。但对于一些特殊需求,如需要为 Pytorch 框架添加 CUDA 相关的拓展时( Custom C++ and CUDA Extensions ),需要对编写的 CUDA 相关的程序进行编译等操作,则需安装完整的 Nvidia 官方提供的 CUDA Toolkit.
注意下面的离线安装方法暂时都无法正常使用,因为无法解决依赖问题。所以不推荐使用,等待日后再有时间再弄。
安装cudatoolkit和cudnn
在线安装
对于在线安装的话,直接使用下面方法即可,注意可以指定特定的cuda版本。
1 | conda install tensorflow tensorboard cudatoolkit=10.0 |
离线安装
从这里搜索cudatoolkit
和cudnn
,找到相应版本的tar.bz2
包(注意cudnn版本和cuda版本要对应),下载之后使用如下命名安装:
1 | conda install --use-local cudatoolkit-xxx.tar.bz2 cudnn-xxx.tar.bz2 |
其中,xxx
表示省略的文件名。
安装tensorflow
在线安装
对于在线安装的话,直接使用下面方法即可,注意可以指定特定的cuda版本。
1 | conda install tensorflow-gpu tensorboard cudatoolkit=10.0 |
离线安装
首先,使用如下命令得到conda源的main
下各个安装包的依赖关系:
1 | wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/repodata.json |
在下载好的repodata.json
文件中搜索tensorflow-base-版本号-gpu_py版本
。例如搜索tensorflow-base-1.14.0-gpu_py370
,可以找到8个这样的文件,其中有4个是tag.bz2
格式的文件,在这4个tar.bz2
文件名对应的字典中有其详细的依赖信息,根据cudatoolkit、cudnn版本号可以唯一对应出一个文件。例如当cudatoolkit 为10.0,cudnn为7.6.4时,对应的tensorflow-base-版本号-gpu_py版本
文件名为tensorflow-base-1.14.0-gpu_py37h8d69cac_0.tar.bz2
。在这里搜索该文件名,直接下载即可。或者使用wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/文件名
。也就是Python版本和cudatoolkit版本,唯一确定一个文件。
另外因为tensorflow-base
文件命名比较乱,所以直接通过文件名可能看不出来对应的cuda和cudnn版本。可以下载下来,然后解压,看info/index.json
文件,即可看到其中的依赖信息。其实它的命名是有规律的,这里总结如下:
tensorflow-base文件名 | cudatoolkit版本 | cudnn版本 |
---|---|---|
he45bfe2 | 10.1 | >=7.6.0, <8.0a0 |
h8f37b9b | 9.0 | >=7.3.1, <8.0a0 |
h611c6d2 | 9.2 | >=7.3.1, <8.0a0 |
h8d69cac | 10.0 | >=7.3.1, <8.0a0 |
接着在同一个repodata.json
文件中搜索tensorflow-版本号-gpu_py版本
,例如tensorflow-1.14.0-gpu_py37
。同样的有8个这样的文件,其中有4个是tag.bz2
格式的文件,在这这4个tar.bz2
文件名对应的字典中有其详细的依赖信息,根据tensorflow-base
的名称可以唯一对应出一个文件。例如当tensorflow-base
的名称为tensorflow-base ==1.14.0 gpu_py37h8d69cac_0
时,对应的tensorflow-版本号-gpu_py版本
文件为tensorflow-1.14.0-gpu_py37h4491b45_0.tar.bz2
。在这里搜索该文件名,直接下载即可。或者使用wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/文件名
。也就是Python版本和cudatoolkit版本,唯一确定一个文件。
然后在同一个repodata.json
文件中搜索tensorflow-gpu-版本号
,例如tensorflow-gpu-1.14.0
。可以找到两个这样的文件,其中一个是tar.bz2
文件,例如这里搜索的文件名为tensorflow-gpu-1.14.0-h0d30ee6_0.tar.bz2
,在这里搜索该文件名,直接下载即可。或者使用wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/文件名
。也就是不管什么Python版本,也不管什么cudatoolkit版本,都只有这一个文件。
接着,使用如下命令得到conda源的main
下各个安装包的依赖关系:
1 | wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/linux-64/repodata.json |
在下载好的repodata.json
文件中搜索tensorflow-estimator-版本号-py版本
,例如tensorflow-estimator-1.14.0-py37
。可以找到两个这样的文件,其中一个是tar.bz2
文件,例如这里搜索的文件名为tensorflow-estimator-1.14.0-py37h5ca1d4c_0.tar.bz2
,在这里搜索该文件名,直接下载即可。或者使用wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/linux-64/文件名
。也就是只要确定了Python版本,不管什么cudatoolkit版本,都只有这一个文件。
接着在相同的文件中搜索tensorboard-版本号-py版本
,例如tensorboard-1.14.0-py37
。可以唯一确定一个文件,例如这里找到的文件名称为tensorboard-1.14.0-py37_0.tar.bz2
。在这里搜索该文件名,直接下载即可。或者使用wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/linux-64/文件名
。也就是只要确定了Python版本,不管什么cudatoolkit版本,都只有这一个文件。
下载完这几个安装包后。按照如下命令安装这个五个文件:
1 | conda install --use-local tensorflow-base-1.14.0-gpu_py37h8d69cac_0.tar.bz2 tensorflow-1.14.0-gpu_py37h4491b45_0.tar.bz2 tensorflow-gpu-1.14.0-h0d30ee6_0.tar.bz2 tensorflow-estimator-1.14.0-py37h5ca1d4c_0.tar.bz2 tensorboard-1.14.0-py37_0.tar.bz2 |
当Python版本固定时,若需要调整cudatoolkit版本,需要更改上面的第一个tensorflow-base
和tensorflow
两个文件名;而当Python版本不定时,需要更改tensorflow-base
、tensorflow
、tensorflow-estimator
和tensorboard
文件名。
最后,还要使用如下命令解决依赖问题:
1 | conda install tensorflow-gpu |
但是在使用这个命令安装tensorflow-gpu修复依赖时会再下载一次安装包,这就没有离线安装的意义的。这个问题暂时没有解决。现阶段貌似只能手动安装依赖。
安装Pytorch
在线安装
对于在线安装的话,直接使用下面方法即可,注意可以指定特定的cuda版本。
1 | conda install pytorch torchvision cudatoolkit=10.0 |
离线安装
从这里搜索pytorch
和torchvision
,下载相应的tar.bz2
包。下载之后使用如下命名安装:
1 | conda install --use-local pytorch-xxx.tar.bz2 torchvision-xxx.tar.bz2 |
其中,xxx
表示省略的文件名。
导出Yaml
将当前环境导出为yaml文件:
这种方式不会将使用
pip install -e
安装的包打包放入yaml文件。
1 | conda env export > 环境名.yaml |
使用yaml配置文件创建新环境
1 | conda env create -f 环境名.yaml |
bug
bug1
安装包的时候出现了权限错误
1 | EnvironmentNotWritableError: The current user does not have write permissions to the target environment. |
解决方法:需要更改miniconda文件夹的权限,否则写不进去。我这里的安装路径为/home/zdaiot/miniconda3/
,用户名为zdaiot
1 | sudo chown -R zdaiot /home/zdaiot/miniconda3/ |
bug2
莫名其妙的pip环境混乱了,提示什么from pip._internal import main ModuleNotFoundError: No module named 'pip'
,解决方法:
1 | curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py |
bug3
使用pip安装包的时候,提示FileNotFoundError: [Errno 2] No such file or directory: '/home/zdaiot/miniconda3/lib/python3.7/site-packages/pytz-2019.1.dist-info/METADATA'
。解决方法为:
1 | conda install pytz |
bug4
若报错ModuleNotFoundError: No module named 'yaml'
,类似于这样的,明明已经安装过了,但是还是报错。解决方法为先使用pip卸载,然后在使用conda安装。
bug5
若conda install + 包名
时报错The following specifications were found to be conflict:tensorflow
。解决方法为,先退出虚拟环境,然后执行conda update conda
bug6
在windows下调用某个包的时候,经常出现ImportError: DLL load failed while importing win32file: 找不到指定的模块
或者ImportError: DLL load failed while importing _sparsetools: 拒绝访问
。
1、若在Pycharm下运行,此时需要在需要在Pycharm执行配置中添加一行配置:
1 | CONDA_DLL_SEARCH_MODIFICATION_ENABLE=1 |
配置方法如下图:
2、若在终端运行,则需要输入指令:
1 | import os |
疑惑
激活虚拟环境是只对当前cmd或者终端起作用?
解答:是的
参考
最省心的Python版本和第三方库管理——初探Anaconda
Anaconda 使用技巧之:创建虚拟环境
Why does ‘(base)’ appear in my anaconda command prompt?
ModuleNotFoundError: No module named ‘pip._internal’
Erroneous Environments Showing up in Conda Nb tab with error
Anaconda使用入门
服务器 conda时错误提示 The following specifications were found to be conflict:tensorflow
Anaconda清华镜像源的使用及安装Pytorch失败问题解决
conda 使用本地包安装
Pytorch 使用不同版本的 cuda
Using Pip to install packages to Anaconda Environment
linux上anaconda的卸载
解决Anaconda出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url问题
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available
(Anaconda)ImportError: DLL load failed while importing win32file: 找不到指定的模块。
numpy-mkl-library-load-failed
Setting CONDA_DLL_SEARCH_MODIFICATION_ENABLE env variable breaks pip installation of tensorflow-gpu #11693