vlambda博客
学习文章列表

开发的基础架构(1)|如何在Linux上配置用于Python开发的conda虚拟环境?

Linux系统上配置conda虚拟环境的步骤

这个文档记录了如何从零开始在Linux系统上配置conda虚拟环境。

最初的问题:在使用Python的开发中,为什么要使用conda虚拟环境?

这是因为,不同的代码会运行在不同版本的依赖环境中。这些依赖环境通常是指不同版本的软件包。比如,Swin Transformer需要python=3.7PyTorch==1.7.1torchvision==0.8.2timm==0.3.2的安装环境,而其他一些开源代码或许需要其他版本的一些依赖环境。使用conda来创建不同版本的依赖环境,做到不同版本的环境彼此隔离,是一个非常有效的办法。

创建相互隔离的依赖环境的另一个办法是使用docker,这个办法比较复杂,我暂时还没有打通相关流程,或许以后再更新吧。

一般来说,我会使用Visual Studio Code(VS Code)和Remote-SSH进行远程开发。在使用ssh远程连接Linux开发机后,使用Ctrl + `快捷键打开vscode的Linux终端,输入如下的命令:

lsb_release -a

得到如下的输出:

LSB Version:    :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.5.1804 (Core) 
Release:        7.5.1804
Codename:       Core

由此可知,我是在安装了CentOS这个Linux发行版的开发机上进行远程开发的。 或者,如果上述命令无法使用,可以使用下述命令:

cat /etc/redhat-release

在我的测试中,这个命令输出了如下的内容:

CentOS Linux release 7.6.1810 (Core)

由此可知,我使用的开发机安装的是CentOS Linux release 7.6.1810版本的Linux发行版。

安装Miniconda的步骤

首先,我们需要在我们的Linux操作系统上安装Miniconda。步骤如下:

1.使用下述命令,下载最新版本的Miniconda:

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_4.11.0-Linux-x86_64.sh

注意,这是2022年4月26日看到的。以后最新版本肯定还会更新,只需进入清华源Miniconda官方镜像站查看最新版本的Miniconda即可(按照日期的降序排列)。

如果开发机网络无法访问,可以先在本地下载,再使用MobaXterm上传开发机。

2.使用如下命令安装Miniconda:

bash Miniconda3-py39_4.11.0-Linux-x86_64.sh

3.设置打开终端后,不激活默认的base虚拟环境:

conda config --set auto_activate_base false

之所以要设置成不激活默认的base虚拟环境,是因为一般来说,都不会使用这个base虚拟环境。一般都是使用自己建的特殊的conda虚拟环境。

4.添加清华源:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

添加清华源的目的是:方便之后下载conda虚拟环境中的各种包。如果直接从位于国外的服务器下载,会非常慢。使用清华源,速度会很快(至于原因嘛,是众所周知的)。

5.修改conda虚拟环境的默认安装路径:

(注意:这一步是可选的。如果/home目录空间足够大,这一步是不需要的。)

众所周知,一般来说,home目录无法存放过多的环境,因此有必要换一个空间足够大的地方,来安装以后的众多conda虚拟环境。在home目录下,有一个隐藏的文件.condarc。使用code .condarc命令打开.condarc文件,在最下面添加如下的代码:

envs_dirs:  
  - /data/XXX/conda_env

表明今后的conda虚拟环境都会被装在/data/XXX/conda_env目录下。

至此,Miniconda的安装和配置工作就算是完成了。下面,我们来实际安装一个conda虚拟环境。

安装conda虚拟环境的步骤

1.使用下述命令,新建conda虚拟环境:

conda create --name leaves python=3.9

本次新建一个名为leaves的conda虚拟环境,安装最新的python3.9版本(本次安装的是python3.9.12)

2.激活conda虚拟环境:

conda activate leaves

3.把pip设为清华源:

以下步骤参考这里的教程。 首先使用pip --version命令查看我目前正在使用的pip是否为当前虚拟环境下的pip 然后在~/.pip/pip.conf文件里(如果没有这个文件,就自己创建),添加如下的代码:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn

使用命令

pip config list

测试是否成功修改了pip的源为清华源。

至此,conda虚拟环境配置完成了,可以按照项目的需要来安装具体的包了。

在conda虚拟环境中安装PyTorch的步骤

接下来我们进入我们刚刚安装好的conda虚拟环境leaves。运行下述命令:

conda activate leaves

然后在这个conda虚拟环境中安装PyTorch。 我们在清华源PyTorch安装包列表页面中找到下述的两个包:

pytorch-1.10.1-py3.9_cuda11.1_cudnn8.0.5_0.tar.bz2
torchvision-0.11.1-py39_cu111.tar.bz2

为什么安装这两个版本的包呢?我们在运行一下nvcc命令。运行下述命令:

nvcc -V

产生了如下的输出:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Tue_Sep_15_19:10:02_PDT_2020
Cuda compilation tools, release 11.1, V11.1.74
Build cuda_11.1.TC455_06.29069683_0

这说明,我的开发机上安装的cuda版本是11.1。因此,我们选择cuda-11.1版本的PyTorchtorchvision包,我们选择两个相对较新的,因此选择了pytorch-1.10.1-py3.9_cuda11.1_cudnn8.0.5_0.tar.bz2torchvision-0.11.1-py39_cu111.tar.bz2这两个包。

我们现在自己的本地下载这两个包,再用MobaXterm把这两个安装包上传到开发机上的/home/users/XXX/miniconda3/pkgs目录下。然后进入/home/users/XXX/miniconda3/pkgs目录,在这个目录为当前目录的前提下,运行下述两个命令:

conda install --use-local pytorch-1.10.1-py3.9_cuda11.1_cudnn8.0.5_0.tar.bz2
conda install --use-local torchvision-0.11.1-py39_cu111.tar.bz2

运行pip list命令,可以看到如下的内容:

Package     Version
----------- -------
pip         22.0.4
setuptools  62.1.0
torch       1.10.1
torchvision 0.11.1
wheel       0.37.1

表明我们已经在当前的leaves虚拟环境下成功安装了torchtorchvision这两个库。 然后我们运行下述命令:

conda install pytorch==1.10.1 torchvision==0.11.1 cudatoolkit=11.1

这个命令是为了安装PyTorch所需的其他依赖项。在我的安装过程中,这个命令还自动修复了我的torch和torchvision版本不匹配的问题。这条命令执行完毕之后,我们重新运行pip list命令,看到了如下输出:

Package           Version
----------------- -------
black             22.3.0
click             8.1.2
mkl-fft           1.3.1
mkl-random        1.2.2
mkl-service       2.4.0
mypy-extensions   0.4.3
numpy             1.21.5
pathspec          0.9.0
Pillow            9.1.0
pip               22.0.4
platformdirs      2.5.2
setuptools        62.1.0
six               1.16.0
tomli             2.0.1
torch             1.10.1
torchvision       0.11.2
typing_extensions 4.2.0
wheel             0.37.1

可以看到,torchvision包的版本已经由0.11.1修正为0.11.2了。因此,conda install命令自动帮我们修正了包的版本不一致的问题。

最后我们在一个空白脚本中运行下述命令:

import torch

print("torch版本:", torch.__version__)
print("torch对应的cuda版本:", torch.version.cuda)

结果为:

torch版本:1.10.1
torch对应的cuda版本:11.1

这就是我使用的PyTorch的版本和它对应的cuda版本。

至此,我们的conda虚拟环境leaves就算是初步构建好了。剩下的工作可以安装一些常用的包。比如,我一般会用:

pip install black

命令安装一个强制格式化代码的工具black,使得自己写的Python代码可以被比较规范地格式化。

常用的conda命令整理

以下为一些常用的conda命令

1.显示目前已有的所有conda虚拟环境

conda env list
conda info --envs

这两个命令显示目前已经安装的所有conda虚拟环境。

2.删除conda虚拟环境

conda remove --name superglue --all

这个命令删除了一个名为superglue的conda虚拟环境以及里面的所有包。

3.查看当前虚拟环境中的包

在激活当前的名为leaves的conda虚拟环境的条件下,运行下述命令:

conda list

看到了如下输出:

# packages in environment at /home/users/XXX/miniconda3/envs/leaves:
#
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                 conda_forge    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
_openmp_mutex             4.5                       2_gnu    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
black                     22.3.0                   pypi_0    pypi
blas                      1.0                         mkl    https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
bzip2                     1.0.8                h7f98852_4    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
ca-certificates           2021.10.8            ha878542_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
click                     8.1.2                    pypi_0    pypi
cudatoolkit               11.1.1              h6406543_10    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
ffmpeg                    4.3                  hf484d3e_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
freetype                  2.10.4               h0708190_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
giflib                    5.2.1                h36c2ea0_2    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
gmp                       6.2.1                h58526e2_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
gnutls                    3.6.13               h85f3911_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
intel-openmp              2021.4.0          h06a4308_3561    https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
jbig                      2.1               h7f98852_2003    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
jpeg                      9e                   h166bdaf_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
lame                      3.100             h7f98852_1001    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
lcms2                     2.12                 hddcbb42_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
ld_impl_linux-64          2.36.1               hea4e1c9_2    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
lerc                      3.0                  h9c3ff4c_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libdeflate                1.10                 h7f98852_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libffi                    3.4.2                h7f98852_5    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libgcc-ng                 11.2.0              h1d223b6_16    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libgomp                   11.2.0              h1d223b6_16    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libiconv                  1.16                 h516909a_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libnsl                    2.0.0                h7f98852_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libpng                    1.6.37               h21135ba_2    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libstdcxx-ng              11.2.0              he4da1e4_16    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libtiff                   4.3.0                h542a066_3    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libuuid                   2.32.1            h7f98852_1000    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libuv                     1.43.0               h7f98852_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libwebp                   1.2.2                h3452ae3_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libwebp-base              1.2.2                h7f98852_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libxcb                    1.13              h7f98852_1004    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
libzlib                   1.2.11            h166bdaf_1014    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
lz4-c                     1.9.3                h9c3ff4c_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
mkl                       2021.4.0           h06a4308_640    https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
mkl-service               2.4.0            py39h7e14d7c_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
mkl_fft                   1.3.1            py39h0c7bc48_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
mkl_random                1.2.2            py39hde0f152_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
mypy-extensions           0.4.3                    pypi_0    pypi
ncurses                   6.3                  h27087fc_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
nettle                    3.6                  he412f7d_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
numpy                     1.21.5           py39he7a7128_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
numpy-base                1.21.5           py39hf524024_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
openh264                  2.1.1                h780b84a_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
openjpeg                  2.4.0                hb52868f_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
openssl                   3.0.2                h166bdaf_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
pathspec                  0.9.0                    pypi_0    pypi
pillow                    9.1.0            py39hae2aec6_2    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
pip                       22.0.4             pyhd8ed1ab_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
platformdirs              2.5.2                    pypi_0    pypi
pthread-stubs             0.4               h36c2ea0_1001    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
python                    3.9.12          h2660328_1_cpython    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
python_abi                3.9                      2_cp39    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
pytorch                   1.10.1          py3.9_cuda11.1_cudnn8.0.5_0    <unknown>
pytorch-mutex             1.0                        cuda    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
readline                  8.1                  h46c0cb4_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
setuptools                62.1.0           py39hf3d152e_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
six                       1.16.0             pyh6c4a22f_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
sqlite                    3.38.2               h4ff8645_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
tk                        8.6.12               h27826a3_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
tomli                     2.0.1                    pypi_0    pypi
torchvision               0.11.2               py39_cu111    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
typing_extensions         4.2.0              pyha770c72_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
tzdata                    2022a                h191b570_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
wheel                     0.37.1             pyhd8ed1ab_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
xorg-libxau               1.0.9                h7f98852_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
xorg-libxdmcp             1.1.3                h7f98852_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
xz                        5.2.5                h516909a_1    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
zlib                      1.2.11            h166bdaf_1014    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
zstd                      1.5.2                ha95c52a_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge

这就是leaves环境下安装的软件包。或者,在当前虚拟环境激活的条件下,运行下述令:

pip list

也可以查看当前虚拟环境安装的软件包。

至此,环境就算是配置好了,更多的问题可以搜索网上的资料自行解决。可以开始进行正式的开发了。

(本文的原文是我自己整理的笔记。文中的超链接都可以在原文中打开,参见阅读原文/Read more)