Anaconda使用

对于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
2
3
D:\Anaconda3 
D:\Anaconda3\Scripts
D:\Anaconda3\Library\bin

Linux安装

Linux下安装没有啥好说的,这里就提一下权限的问题。比如说我们安装的路径为/root/miniconda3,并且安装的时候也是用root安装的。若想要非root用户也使用该conda,需要注意/root/miniconda目录,普通用户也可以读取。

1
2
3
4
5
# lh 
total 56K
drwxr-xr-x 5 root root 4.0K Apr 18 11:00 .
dr-xr-xr-x 22 root root 4.0K Apr 18 11:02 ..
drwxr-xr-x 17 root root 4.0K Apr 18 10:35 miniconda3

/root文件夹为dr-xr-x---,则需要使用chmod 755 /root设置一下权限。

更换Anaconda源

Anaconda安装成功之后,我们需要修改其包管理镜像为国内源。

Tsinghua Open Source Mirror

Anaconda清华源官网建议直接修改用户目录下的 .condarc 文件。Windows 用户无法直接创建名为 .condarc 的文件,可先执行 conda config --set show_channel_urls yes 生成该文件之后再修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

运行 conda clean -i 清除索引缓存,保证用的是镜像站提供的索引。

若出现错误CondaHTTPError: HTTP 000 CONNECTION FAILED for url,则将上面的https改为http

更换完Conda源后,可以使用下面指令查看当前源的配置信息:

1
2
3
4
conda info

# 或者
cat ~/.condarc

使用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
2
3
conda create -n zd38 python=3.8
# 若想指定安装路径
conda create -p /dockerdata/zhaodali/.conda/envs/zd38/ python=3.8

其中zd38是新添加环境的名字,可以自定义修改。

激活与退出虚拟环境

在Windows系统中,通过activate py27deactivate py27命令激活、退出该环境。

在Linux和OS系统下,激活虚拟环境

1
2
3
语法格式:source activate name

实例:source activate py27

在Linux和OS系统下,退出虚拟环境conda deactivate

使用其它用户的环境

如果想要使用其它用户的环境,我们假设其它用户test1的环境位置在/dockerdata/test1/.conda/envs/,该路径下的环境为:

1
2
3
4
5
6
7
(zd310) test1@ubuntua:~$ lh /dockerdata/test1/.conda/envs/
total 8.0K
drwxrwsr-x 4 test1 test1 75 Mar 20 14:28 .
drwxrwsr-x 4 test1 test1 70 Mar 13 14:56 ..
-rw-rw-r-- 1 test1 test1 0 Mar 13 14:54 .conda_envs_dir_test
drwxrwsr-x 28 test1 test1 4.0K Mar 20 14:16 zd310
drwxrwsr-x 11 test1 test1 4.0K Mar 13 14:56 zd38

假设新的用户为test2,且home路径位于/dockerdata/test2,若想使用test1用户的环境,需要在/dockerdata/test2/.condarc添加:

1
2
envs_dirs:
- /dockerdata/test1/.conda/envs

当然若不配置,通过conda activate /dockerdata/test1/.conda/envs/zd310也可以激活环境。暂时不清楚两者的区别。

Anaconda常用指令

更新conda

1
2
3
4
5
# 确认conda已安装
conda --version

# 更新conda版本
conda update conda

其中更新命令不仅仅会更新conda的版本,同时会自动更新相关的包,
其实,我们也可以使用这个命令来更新Anaconda版本

1
conda update anaconda

包管理

1
2
3
4
5
6
7
8
9
10
11
12
# 查看所有已安装的软件包
conda list

# 查看某个包,例如scipy
conda list scipy

# 安装包
conda install 包名

# 卸载包, 下面两种方式等价
conda uninstall 包名
conda remove 包名

可用的完整软件包列表可以在http://docs.continuum.io/anaconda/pkg-docs.html中查找,
所有的软件包都按照Python的版本进行了分类

当我们想要安装某个软件包时,可以直接在命令行中进行查找并安装

1
2
3
4
5
6
# 查找软件包
# 罗列出所有可用的版本并在已经安装的版本前加*
conda search beautifulsoup4

# 安装软件包
conda install --name beautifulsoup4=4.4.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
2
cd ~/.conda/pkgs
conda install --use-local pytorch-1.3.0-py3.7_cuda10.0.130_cudnn7.6.3_0.tar.bz2

科学计算包

由于我们现在安装的是Anaconda3,之后又新添加了Python 2.7环境,但是Python 3.6环境中安装了Anaconda自带的科学计算环境,Python 2.7中却没有,那么如何为新添加的环境也装上Anaconda的科学计算包呢,没必要一个一个来,更没有必要再去安装Anaconda2了,只需:

1
conda install -n py27 anaconda

但是这会安装非常多,非常多,非常多的包,慎用。

环境拷贝和备份

其实,还可以复制一个和指定环境完全相同的环境,只要在创建时添加--clone参数指定相应的环境名称即可

1
2
# 复制环境
conda create --name flowers --clone snowflakes

另外,环境也可以在不同机器之间进行复制,只要将要复制的环境导出为*.yml配置文件,再到指定机器上创建时指定配置文件即可

1
2
3
4
5
# 导出配置文件
conda env export --name snowflakes > snowflakes.yml

# 根据配置文件导入环境
conda env create -f snowflakes.yml

查看已有环境

通过conda info -e命令查看已有的环境。

删除指定环境

通过conda remove -n env_name --all来删除指定的环境(如果不添—all参数,而是指明某个库名,则是删除该库)。

比如我现在要删除py35这个环境。

删除空闲包

1
2
3
conda clean -p      //删除没有用的包
conda clean -t //删除tar包
conda clean -y --all //删除所有的安装包及cache

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

离线安装

这里搜索cudatoolkitcudnn,找到相应版本的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版本
he45bfe210.1>=7.6.0, <8.0a0
h8f37b9b9.0>=7.3.1, <8.0a0
h611c6d29.2>=7.3.1, <8.0a0
h8d69cac10.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
2
3
4
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

# 或者使用如下命令
conda install --use-local tensor*

当Python版本固定时,若需要调整cudatoolkit版本,需要更改上面的第一个tensorflow-basetensorflow两个文件名;而当Python版本不定时,需要更改tensorflow-basetensorflowtensorflow-estimatortensorboard文件名。

最后,还要使用如下命令解决依赖问题:

1
conda install tensorflow-gpu

但是在使用这个命令安装tensorflow-gpu修复依赖时会再下载一次安装包,这就没有离线安装的意义的。这个问题暂时没有解决。现阶段貌似只能手动安装依赖。

安装Pytorch

在线安装

对于在线安装的话,直接使用下面方法即可,注意可以指定特定的cuda版本。

1
conda install pytorch torchvision cudatoolkit=10.0

离线安装

这里搜索pytorchtorchvision,下载相应的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
2
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py --force-reinstall

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

配置方法如下图:

image.png

image.png

2、若在终端运行,则需要输入指令:

1
2
import os
os.environ['CONDA_DLL_SEARCH_MODIFICATION_ENABLE'] = '1' #setting the env variable

疑惑

  • 激活虚拟环境是只对当前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

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道