博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手机购书页面。 |
想要正确配置 Channel,特别是 Mirror Channel (镜像源),必须先得搞清楚 Channels 的默认配置,然后才能理解怎样配置镜像源才是正确的。网上很多添加镜像源的做法都不尽相同,解释也很混乱(这种情况在 Python 世界很常见,很多阿猫阿狗写的都是劣质文章,然后再以讹传讹,导致了更糟糕的局面),本文一切以官方文档为准,争取给出最准确的解释。
我们先看一下默认情况下,即:不做任何配置时,Conda 的 Channels 是什么,又是怎么配置的。首先,Conda 从设计上就根据包的来源分成了两类,使用了两个不同的站点,一类是 defaults channel,另一类是 community channel,要特别注意的是:defaults channel 不是各种 channel 的默认值,而是一个(一组)独立的 channel,当命令行没有显式指定 channel 名时,就会从这它这去查找包。
Conda 将 channels 分成 defaults 和 community 两类的设计直接体现在了配置上,所有的 default channels 统一使用defaults
这个名称,具体有哪些源,配置在default_channels
中,community channels 则由 channel_alias
和 custom_channels
来配置,前者统一指向一个站点,后都可以单独配置部分 channel 的站点地址。
在不提供任何配置的情况下( %USERPROFILE%\.condarc
文件为空),两类 channel 都有默认值,default channels 的默认站点是 repo.anaconda.com,community channel 的默认站点是 conda.anaconda.org。默认站点不会也不需要显式配置在%USERPROFILE%\.condarc
文件中,他们都 hard code 在了conda里,但我们要清楚默认这些配置的默认值,因为在配置镜像源时,需要对等地替换站点。
关于 conda channel相关的所有默认配置,都可以通过以下命令打印出来:
conda config --show
在详细介绍 channel 的配置时,有必要介绍一些常见的 channel。
Default Channel:严格地说,它是指 defaults
这个 channel 的默认值,站点地址是 https://repo.anaconda.com
,由 Anaconda 公司维护,下一节会重点介绍。该站点有详细的自我介绍:https://repo.anaconda.com/pkgs/ ,在 conda 默认配置中,defaults
这个 channel 只配了三个子的 channel, 分别是:
Community Channel:严格地说,它是 Conda 的 Community Channel 的默认值,站点地址是 https://conda.anaconda.org
,该 Channel 通常比默认 Channel 包含更多的包,更新也更快 (但可能未经完全测试)
Conda-Forge Channel:最常用的一个 Channel,也是由社区维护的,包含的包很全,更新也很即时
Bioconda Channel:这是 Bioconda 的一个 Channel,Bioconda 是一个管理生物信息软件的工具软件,它基于 anaconda 可以进行生物软件的搜索、下载、安装、升级、删除等操作,Bioconda 可以视作生物信息软件的AppStore,所以这个 Channel 包含的主要是 7000 多个 Bioinformatics(生物信息学)领域的包
Pytorch Channel:与 Pytorch 及其依赖相关的 Channel
我们先看一下 defaults channel 的默认配置,如果显式地展开,它的实际配置应该是这样:
channels:
- defaults
default_channels:
- https://repo.anaconda.com/pkgs/main
- https://repo.anaconda.com/pkgs/r
- https://repo.anaconda.com/pkgs/msys2
也就是说: defaults
是一个独立的 channel,且名称固定,不可修改。这个 channel 实际包含哪些源(站点)是由 default_channels
来“展开”描述的,因为默认 channel 只有一个名称(即 defaults),但是需要作为默认源的 channel 可能会有很多,所以必然是个一对多的关系,因此需要引入default_channels
以列表结构描述。
下面是 community channels 的默认配置,如果显式地展开,它的实际配置应该是这样:
channel_alias: https://conda.anaconda.org
当我们使用conda install -c conda-forge ...
时,访问的 channel 地址就是:https://conda.anaconda.org/conda-forge/
如果我们不想改动全部的 community channel 的源,只是想修改一部分,则应该使用custom_channels
,后续的镜像源配置中会看到。
最清晰,也是最标准的镜像源配置方式应该是:在默认配置中的替换相应站点地址!我们以北外镜像为例,配置如下:
channels:
- defaults
default_channels:
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/main
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/r
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/msys2
channel_alias: https://mirrors.bfsu.edu.cn/anaconda/cloud
show_channel_urls: true
修改后,可以使用下面的测试命令快速构建一个虚拟环境,看一下包的下载地址和速度如何:
set ENV=test-env
conda deactivate
conda remove -y -n %ENV% --all
conda clean -y -i
conda create -y -n %ENV% python=3.10
conda activate %ENV%
如果后续在使用过程中用到了镜像站点中没有的新 channel, 有两种应对方式:
conda install -y -c https://my-mirror.com/my-channel ...
的形式显式指定其url;channel_alias
指定的镜像源中,可以将其添加到custom_channels
中,使用conda install -y -c my-channel ...
的形式指定它如果出于某些原因,你可能不想让所有的 Community Channel 都走镜像站点(可能你想要使用的 Community Channel 在镜像站点上没有),那就需要针对某一个Community Channel 单独配置,我们以清华镜像站点(https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/)给出的官方配置为例,它就是在严格遵循默认配置基础上,修改了 default_channels 上三个默认的 chennel 的站点地址,同时,只配置了 conda-forg,bioconda等几个常用的 Community Channel 的镜像,其他的默认还是在用默认的站点:
channels:
- defaults
default_channels:
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/main
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/r
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.bfsu.edu.cn/anaconda/cloud
msys2: https://mirrors.bfsu.edu.cn/anaconda/cloud
bioconda: https://mirrors.bfsu.edu.cn/anaconda/cloud
menpo: https://mirrors.bfsu.edu.cn/anaconda/cloud
pytorch: https://mirrors.bfsu.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.bfsu.edu.cn/anaconda/cloud
simpleitk: https://mirrors.bfsu.edu.cn/anaconda/cloud
deepmodeling: https://mirrors.bfsu.edu.cn/anaconda/cloud
show_channel_urls: true
清华站点的这份配置没有什么问题,但也没有必要配置的这么细致,上面北外的版本其实更简单有效。有一个细节要清楚:当命令行中显式地使用-c your-channel
来指定一个channel,并且这个 channel 又在custom_channels
的 channel 列表中时,Conda 会直接使用custom_channels
中配置的 channel 地址,如果显式地指定了 channel 名,而custom_channels
又没有配置对应地址,还是要到 channel_alias
设定的站点上去查找,如果还没有,就会报错了。
你会发现不少文章介绍配置镜像源的方法是:仅仅在 channels 上添加镜像站点的地址,基于上述的解释,我们来分析一下这种形式下 channels 是如何生效的。以下是在很多文章中经常看到的仅配置 channels 列表的操作:
conda config --set show_channel_urls yes
conda config --set channel_priority strict
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --show channels
执行后,输出的 %USERPROFILE%\.condarc
文件是这样的:
show_channel_urls: true
channel_priority: strict
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 已不再支持,应该移除
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- defaults
首先:channels
中列出的各个源在检索时是有优先级的,包管理器会按照从上到下的顺序逐一搜索包,如果在第一个源中找不到,再去第二源中查找。所以上述配置中,conda-forge 将具有最高优先级,所有的包都会优先从这个 channel 开始查找。鉴于 conda-forge 的全面性和更新的及时性,这里选择将其放在最前面是合理的。第二项pkgs/free
已经不再支持,上述是旧的配置,不必再配置这一 channel。第三项pkgs/main
本是default_channels
的默认列表中的第一项,这里提前到 channels 中定义,且替换为了镜像站点。最后,defaults 本来会出现在配置中(使用conda config命令时会自动创建%USERPROFILE%\.condarc
文件,生成的文件在 channels 下面都是 - defaults
),我们没有显式地删除它,所以它一直存在并已位于最列表最后,具有最低的优先级。
总得来说,从 Conda Channels 的设计思路上出来,直接更改 channels
不是一个很好的做法,还是遵循第4节的配置方式为宜。
除了配置镜像源,如果你有自己的VPN,还可以考虑使用代理加速包的下载,以下是一个示例参考:
conda config --set proxy_servers.http http://127.0.0.1:32768
conda config --set proxy_servers.https http://127.0.0.1:32768
以上全部配置好之后,你可能会发现包的下载会非常之快,但是在下载前会一个 Solving environment 阶段,这一步往往要耽误很长时间,这是 Conda 被广泛诟病的地方,其实这一过程并没有太多的网络通信,时间都花在了解析包依赖上。关于如何解决这一问题,我们将在《Python 环境构建最佳实践:联合使用 Mamba + Conda + PIP》一文中专门介绍。