conda & pip

为 conda 和 pip 添加镜像

由于国内访问 repo.continuum 和 pypi 的速度较慢,用户可自行设置清华镜像,会 极大提高下载速度(不会提高环境解析速度)。

conda 在解析环境时,由于要将所有 channel 扫一遍,在遇到 repo.continuum 时 会非常慢。根据清华源的文档设置镜像后,可进一步手动修改 ~/.condarc 屏蔽 默认的 channel (defaults) 以提高解析速度。

~/.condarc
channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - defaults  << 去掉这一行!
show_channel_urls: true

conda 包&环境管理器

anaconda 中提供的 conda 是包&环境管理器,不只是 python 包管理器。python 包既可以 使用 conda 安装也可以使用 python 自带的 pip 安装。

conda 环境管理器允许用户创建多个隔离环境,注意这里的环境与 module 环境管理不同, 我们所用到的 conda 更多用于管理不同版本的 python 的不同版本的库:env1,env2,…, 允许其中每个 env[1-n]中的 numpy、scipy、torch、tensorflow…版本互不相同, 只需要环境内部保证版本依赖性兼容即可。

例如 A,B 两个库都依赖 C, 但 A 要求 C 的版本不能超过1.0,B 要求 C 的版本超过1.1,这时用户可以按照如下方式设置环境:

  • env0: B & C-v1.1 & 其他常用库

  • env1: A & C-v1.0 & 其他常用库 当用户需要使用 A 时切换到环境 env1,想使用 B 时切换到环境 env0。

这里我们简要介绍一下 conda 作为环境管理器的使用方法,网上也有很多的介绍。

服务器目前 anaconda/3-5.0.0.1 中默认的环境是 base,其中的 tensorflow 版本为1.3.0。 下面我们演示一个例子:普通用户安装一个版本为 1.5.0 的 tensorflow-gpu。

注意:由于我们系统的版本较旧,使用 pip 安装的 tensorflow 依赖高版本 GLIBC 库, 从而无法正常使用。此例子只用来说明如何使用 conda。

查看当前已安装的 conda env

liuhy@admin:~$ module add anaconda/3-5.0.0.1
liuhy@admin:~$ conda info -e # 或者 conda info --env

打开 jupyter-console 验证一下当前环境里所用的确实是 tensorflow-gpu 1.3.0,

liuhy@admin:~$ jupyter-console
Jupyter console 5.2.0

Python 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:51:32)

In [1]: import tensorflow as tf
# some warning
In [2]: tf.__version__
Out[2]: '1.3.0'

使用 conda create -n <ENVNAME> 可以创建一个与原环境相隔离的环境,当用户不具有在原来的 anaconda 中增添一个环境的权限时,这条命令会自动帮用户在 ~/.conda/envs/ 下创建环境。 如下,我们指定新 env 的名字为 tf15,同时指定其初始包为 python,scipy,jupyter, 其中指定python的版本为3.6。

这里注意,conda 是一个完全独立于 python 的包&环境管理器,python 对于 conda 来说 只是 conda 的一个包,就如同 Linux 把 conda 当成一个包一样, scipy、jupyter 对于 conda 来说也都是包 — -虽然 scipy 对于 python 来说 也是一个包,而 jupyter 与 python 则是相互独立的。

liuhy@admin:~$ module add anaconda/3-5.0.0.1
liuhy@admin:~$ conda create -n tf15 python=3.6 scipy jupyter
...
Fetching package metadata ...
........
Solving package specifications: .

Package plan for installation in environment /public/home/liuhy/.conda/envs/tf15:
...

现在再执行 conda info –env ,这个用户所独有的名为 tf15 的 env 已经在列表中

liuhy@admin:~$ conda info --env
# conda environments:
#
tf15                     /public/home/liuhy/.conda/envs/tf15
base                  *  /public/software/anaconda/3-5.0.0.1

使用 source activate <ENVNAME> 可以加载已安装的 env,而使用 source deactivate 退出当前 env。在加载某个 env 之后,命令行前缀会加上这一 env 的名字,在当前 env 下, 所使用的 python,pip 等命令是当前 env 所独有的。

liuhy@admin:~$ source activate tf15
(tf15) liuhy@admin:~$ which pip
~/.conda/envs/tf15/bin/pip
(tf15) liuhy@admin:~$ which python
~/.conda/envs/tf15/bin/python

我们可以用当前环境的 pip 安装 tensorflow-gpu 的1.5.0 版,这个版本的预编译版使用 cuda 9.0, 由于当前环境所在目录就在我的个人目录 .conda/envs 下,我已经有当前环境的读写权限, 因此在使用 pip 时并不需要 --user 参数。相信很多用户已经试过,如果在 base 环境下执行 pip 会遇到 PermissionError 的问题,原因是 base 环境并不属于普通用户,在 base 环境下需要增加 --user 参数。

(tf15) liuhy@admin:~$ pip install tensorflow-gpu==1.5.0
...
Successfully installed ...

现在打开当前 env 的 jupyter-console 验证一下 tensorflow 的版本:

(tf15) liuhy@admin:~$ jupyter-console
Jupyter console 5.2.0

Python 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:51:32)

In [1]: import tensorflow as tf
# some warning
In [2]: tf.__version__
Out[2]: '1.5.0'

最后,使用 source deactivate 退出当前 env。顺便,如果你发现自己的某个 env 不想用了 可以用 conda env remove -n <ENVNAME> 来删除这个环境。

(tf15) liuhy@admin:~$ source deactivate
liuhy@admin:~$ conda env remove -n tf15

常用命令总结

liuhy@admin ~$ conda create -n <ENVNAME> python=<VER> jupyter
# 创建环境

liuhy@admin ~$ conda info -e
# 列出所有可用环境

liuhy@admin ~$ source activate <ENVNAME>
# 加载相应环境

(ENVNAME)liuhy@admin ~$ pip install <MODULENAME>==<VER>
# 在相应环境下安装 python module
# conda 指定版本需要一个 = 号,而 pip 需要两个: ==

(ENVNAME)liuhy@admin ~$ source deactivate
# 退出当前环境

liuhy@admin ~$ conda env remove -n <ENVNAME>

一些说明

我们使用 conda create -n <ENVNAME> 可以创建一个环境,但大家注意到上面创建环境的 同时还指定了一些初始包:python=3.6 scipy jupyter

如果不加这三个初始包,会发生什么?

我们看一下不加python这个包会发生什么。

我们创建一个名为 tmp 的 env,根据默认设定,新环境的所有文件都将放在 .conda/envs/tmp 下, 由于是空的 env,所以不需要联网。

liuhy@admin:~$ conda create -n tmp

加载当前环境,并看一下用的是哪个 python 和 pip

liuhy@admin:~$ source activate tmp
(tmp) liuhy@admin:~$ which pip
/public/software/anaconda/3-5.0.0.1/bin/pip
(tmp) liuhy@admin:~$ which python
/public/software/anaconda/3-5.0.0.1/bin/python

可以发现,由于没有安装 python 包(重复说明,对于 conda 来说 python 就是一个包, 就好像对于 Linux 来说,conda 也只是一个包而已),python,pip 还是原来环境中的 python 和 pip

这时我们执行 base 环境中的 pip 安装命令,它会尝试安装包到 base 环境中, 自然会遇到 PermissionError 的问题

(tmp) liuhy@admin:~$ pip install tensorflow-gpu==1.5.0
PermissionError:

用 conda 装上 python,有了自己独立的 pip,再装 tensorflow-gpu==1.5.0,就可以成功了。

(tmp) liuhy@admin:~$ conda install python=3.6
(tmp) liuhy@admin:~$ which pip
~/.conda/envs/tmp/bin/pip
(tmp) liuhy@admin:~$ pip install tensorflow-gpu==1.5.0
Successfully installed

同理,如果不安装 jupyter 包,那么在这个环境下使用的 jupyter-console, jupyter-notebook 也将都是原来环境中的 jupyter-console, jupyter-notebook。

最后提一下:如果使用

liuhy@admin:~$ conda create -n <ENVNAME> python=2.7

那么你将得到一个内置 python 2.7 的可用环境,注意到原来的 python 是3.6。