安装Anaconda
下载安装
使用该下载链接下载Anaconda安装脚本,默认Python版本是3.6.5
添加可执行权限后,执行安装
安装完一堆包之后会询问是否要添加环境变量,这里选择no,稍后再添加。然后会继续询问是否安装VSCode,选择no。此时安装完成
因为我们使用Anaconda只是作为虚拟python环境管理,不需要用到其自带的python以及相关包,所以需要将Anaconda的bin放到path后,否则系统的python会失效。所以将下面这一行添加到需要使用Anaconda账户的.bashrc
文件中
1 | export PATH=$PATH:/home/anaconda3/bin |
source一下或者退出重新登陆
然后执行ln -s /home/anaconda3/etc/profile.d/conda.sh /etc/profile.d/conda.sh
,这是为了服务器上所有用户都可以使用conda activate
和conda deactivate
来进入和退出虚拟环境(即source和conda都可以)
修改国内镜像仓库
因为Anaconda默认使用国外的下载地址,为了提高国内的下载速度,可以使用国内的清华镜像源或者中科大镜像源,二选一即可,执行三条命令
加入–system是配置全局的conda config。若个人账户想修改,则取消–system即可,此时在个人账户下会覆盖全局配置(类似 git config )。个人账号相关配置会写在 ~/.condarc 里面
- 清华Anaconda镜像
1 2 3 | conda config --system --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --system --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --system --set show_channel_urls yes |
- 中科大Anaconda镜像
1 2 3 | conda config --system --add channels http://mirrors.ustc.edu.cn/anaconda/pkgs/free/ conda config --system --add channels http://mirrors.ustc.edu.cn/anaconda/pkgs/main/ conda config --system --set show_channel_urls yes |
创建虚拟环境
基本命令为 conda create --name XXX
,–name可缩写为-n
如果在创建虚拟环境时报错(跟urls.txt或者environments.txt有关,一般是第一次使用Anaconda时会出现),参考下方一些错误部分
关于创建虚拟环境,分以下三种情况陈述
conda create --name test1
此时虚拟环境并不起作用,进入test1后会发现实际上使用的依旧是本机Python环境,并且在test1中使用pip安装或者删除包均是对本机环境操作
所以不要使用这种方式
conda create --name test2 python=X.X.X
该命令会创建一个名为test2的纯净虚拟环境,并且会安装python X.X.X版本,无其他Python包。进入test2后,使用python -V
和pip -V
可以看到使用的的确是该虚拟环境,并且在test2中使用pip安装或者删除包均是对该虚拟环境进行操作,不会影响本机环境
这里python的入参有多种
如果只写python,则安装的是Anaconda自带的Python版本(在这里是3.6.5)
如果是python=2或者python=3,则安装的是python2或者python3的最新版本(目前是2.7.15和3.6.5)
如果写了二级版本号,例如python=2.6或者python=3.5,则安装的是python2.6或者python3.5分支的最新版本(目前是2.6.9和3.5.5)
如果写了最小的版本号,例如python=2.7.8或者python=3.6.2,则安装的便是输入的特定版本
conda create --name test3 python=2.7 numpy
该命令会创建一个名为test3的纯净虚拟环境,并且会安装python2.7的最新版本,在此基础上还会额外安装numpy包。当然numpy包也可以类似Python一样指定版本,例如numpy=1.10,则会安装1.10.4版本。不指定则安装的就是最新版本。其他同上
conda create --name test4 numpy
该命令会创建一个名为test4的纯净虚拟环境,并且会安装Anaconda自带的Python版本(在这里是3.6.5),在此基础上还会额外安装numpy包。其他同上
启动和退出虚拟环境
- 启动
1 | source activate XXX(或者conda activate XXX) |
启动成功后在命令行前会有虚拟环境的名字(XXX)
- 退出
1 | source deactivate(或者conda deactivate) |
其他常用指令
查看有哪些虚拟环境:conda env list
删除虚拟环境:conda env remove -n XXX
多版本TensorFlow共存
在不同的虚拟环境中安装不同版本的TensorFlow即可。若不同版本的TensorFlow依赖的CUDA版本不同,则参照下一小节“给虚拟环境指定CUDA版本”来操作
设置全局pip源配置
进入到虚拟环境后,使用pip安装Python包的时候会发现其从原始的国外地址进行下载。有时下载速度较慢,所以我们要更新pip源为国内源
编辑 /etc/pip.conf
文件(若无则创建),添加以下内容
1 2 3 | [global] trusted-host = mirrors.aliyun.com index-url = http://mirrors.aliyun.com/pypi/simple |
该方式可以进行全局pip源配置,便于服务器上所有用户均可使用。若只要某些用户使用,那么编辑的就是~/.pip/pip.conf
文件
一些错误
-
NotWritableError: The current user does not have write permissions to a required path.
path: /home/username/.conda/pkgs/urls.txt
uid: 1001
gid: 1002
If you feel that permissions on this path are set incorrectly, you can manually change them by executing
$ sudo chown 1001:1002 /home/username/.conda/pkgs/urls.txt
In general, it’s not advisable to use ‘sudo conda’.
自己创建该文件。类似的还有 /home/username/.conda/environments.txt
给虚拟环境指定CUDA版本
处理环境变量
假设此时服务器上安装了两个CUDA版本,分别为CUDA 8.0(/usr/local/cuda-8.0)和CUDA 9.0(/usr/local/cuda-9.0),并且在本机上配置了一个版本(例如8.0)的环境变量($CUDA_HOME, $LD_LIBRARY_PATH)。没配置更好,这里配置是为了验证切换虚拟环境时指定的CUDA版本是否发生相应的改变
首先创建一个虚拟环境,让这个虚拟环境使用CUDA 9.0的lib
1 | conda create -n cuda_test python=3 |
然后设定启动虚拟环境以及退出时需要执行的脚本,为了使虚拟环境启动时环境变量不同于本机环境,退出时又恢复为本机环境
1 2 | mkdir -p /home/username/.conda/envs/cuda_test/etc/conda/activate.d mkdir -p /home/username/.conda/envs/cuda_test/etc/conda/deactivate.d |
- 编辑启动脚本
vim /home/username/.conda/envs/cuda_test/etc/conda/activate.d/activate.sh
输入以下内容
1 2 3 4 | ORIGINAL_CUDA_HOME=$CUDA_HOME ORIGINAL_LD_LIBRARY_PATH=$LD_LIBRARY_PATH export CUDA_HOME=/usr/local/cuda-9.0 export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH |
添加执行权限 chmod +x /home/username/.conda/envs/cuda_test/etc/conda/activate.d/activate.sh
- 编辑退出脚本
vim /home/username/.conda/envs/cuda_test/etc/conda/deactivate.d/deactivate.sh
输入以下内容
1 2 3 4 | export CUDA_HOME=$ORIGINAL_CUDA_HOME export LD_LIBRARY_PATH=$ORIGINAL_LD_LIBRARY_PATH unset ORIGINAL_CUDA_HOME unset ORIGINAL_LD_LIBRARY_PATH |
添加执行权限 chmod +x /home/username/.conda/envs/cuda_test/etc/conda/deactivate.d/deactivate.sh
测试
首先先在本机查看环境变量 CUDA_HOME 和 LD_LIBRARY_PATH
echo $CUDA_HOME
结果为/usr/local/cuda-8.0
echo $LD_LIBRARY_PATH
结果为/usr/local/cuda-8.0/lib64
进入虚拟环境(退出重新进入测试)
1 | source activate cuda_test |
查看此时的环境变量
echo $CUDA_HOME
结果为/usr/local/cuda-9.0
echo $LD_LIBRARY_PATH
结果为/usr/local/cuda-9.0/lib64:/usr/local/cuda-8.0/lib64
退出虚拟环境
1 | source deactivate |
再次查看环境变量,会发现恢复为/usr/local/cuda-8.0和/usr/local/cuda-8.0/lib64,证明在虚拟环境中指定CUDA版本lib成功
PS:也可以通过在虚拟环境中安装1.8.0版本的tensorflow-gpu来验证,因为其必须使用CUDA 9.0才能正确import,否则会报错ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory
小结
至此,完成以上操作后,在服务器上即可达到多版本CUDA、TensorFlow共存的目的
注意事项
通过第四小节可以看到,可以通过编写虚拟环境的启动脚本和退出脚本来管理虚拟环境中的环境变量,使其启动时不同于本机环境,退出时又恢复为本机环境。但是如果需要在脚本中对PATH环境变量做改变的话,会发生一些问题——退出时没有正确恢复PATH环境变量
在对虚拟环境启动和退出的过程做了梳理后,可以有办法解决这个问题(使用上述ORIGINAL_的方式做中间转换是无法解决的)
假设启动前PATH内容为/usr/bin
启动过程:
- 在启动时,conda会先修改PATH,在本机PATH的前面加上
/home/username/.conda/envs/cuda_test/bin:
,这是为了在虚拟环境中能够使用虚拟环境自己的Python。此时PATH内容为PATH=/home/username/.conda/envs/cuda_test/bin:/usr/bin
,然后export该PATH - 然后执行添加的启动脚本activate.sh。假如在其中对PATH做了添加,此时PATH内容为
PATH=/xxxx/bin:/home/username/.conda/envs/cuda_test/bin:/usr/bin
。进入虚拟环境中echo $PATH得到的内容也是/xxxx/bin:/home/username/.conda/envs/cuda_test/bin:/usr/bin
- 然后conda会将此时的PATH在某个地方备份记录一下,并且将其在第一步添加的内容删掉。也就是说这时conda会保留一个内容为
/xxxx/bin:/usr/bin
的PATH
退出过程:
- 首先执行添加的退出脚本deactivate.sh
- 将启动第三步存下来的PATH拿出来直接export。所以在deactivate.sh中使用ORIGINAL_的方式做恢复是无效的
当恢复到本机环境时,PATH的内容为/xxxx/bin:/usr/bin
的PATH,与启动前不一样
启动过程主要执行的是/home/anaconda3/etc/profile.d/conda.sh
中的_conda_activate()
方法。退出过程主要执行的是/home/anaconda3/etc/profile.d/conda.sh
中的_conda_deactivate()
方法
目前想到的一种解决方案如下:(未尝试)
- 在退出脚本deactivate.sh的头部添加
FIX_PATH=$CUDA_HOME
- 在
/home/anaconda3/etc/profile.d/conda.sh
的_conda_deactivate()
方法中的eval "$ask_conda"
之后,在PATH中正则匹配FIX_PATH的内容并将其删掉,再重新export PATH