Conda Channel 介绍与配置

《大数据平台架构与原型实现:数据中台建设实战》 博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手机购书页面。
简单讲:Conda 的 Channel 就是 Repo,也常被称作“源”,它与 Yum 和 Maven 中的 Repository 性质是一样的,用于存放各种 Python 包的公共库。应该说,Conda 的 Channels 机制设计的有些怪异,可能是有历史原因,比之Yum 和 Maven 来说,繁琐且没有必要。

想要正确配置 Channel,特别是 Mirror Channel (镜像源),必须先得搞清楚 Channels 的默认配置,然后才能理解怎样配置镜像源才是正确的。网上很多添加镜像源的做法都不尽相同,解释也很混乱(这种情况在 Python 世界很常见,很多阿猫阿狗写的都是劣质文章,然后再以讹传讹,导致了更糟糕的局面),本文一切以官方文档为准,争取给出最准确的解释。

1. Conda 对 Channel 的设计和分类

我们先看一下默认情况下,即:不做任何配置时,Conda 的 Channels 是什么,又是怎么配置的。首先,Conda 从设计上就根据包的来源分成了两类,使用了两个不同的站点,一类是 defaults channel,另一类是 community channel,要特别注意的是:defaults channel 不是各种 channel 的默认值,而是一个(一组)独立的 channel,当命令行没有显式指定 channel 名时,就会从这它这去查找包

Conda 将 channels 分成 defaults 和 community 两类的设计直接体现在了配置上,所有的 default channels 统一使用defaults这个名称,具体有哪些源,配置在default_channels中,community channels 则由 channel_aliascustom_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

2. 常见 Channel 介绍

在详细介绍 channel 的配置时,有必要介绍一些常见的 channel。

  • Default Channel:严格地说,它是指 defaults 这个 channel 的默认值,站点地址是 https://repo.anaconda.com,由 Anaconda 公司维护,下一节会重点介绍。该站点有详细的自我介绍:https://repo.anaconda.com/pkgs/ ,在 conda 默认配置中,defaults 这个 channel 只配了三个子的 channel, 分别是:

    • pkgs/main: 从该 channel 包含的包来看(https://repo.anaconda.com/pkgs/main/linux-64/),它主要提供 python 最基础最常用的包,像 numpy, pandas 在该 channel 中都可以找到
    • pkgs/r:主要提供 R 语言使用的包(https://repo.anaconda.com/pkgs/r/linux-64/)
    • pkgs/msys:该 channel 只出现在 windows 版的 conda 中,MSYS可以看做是 Cygwin 的简化版,该包是 windows 上很多 python 包的依赖和基础,对 windows 系统下的 conda 是必须的
  • 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

3. Defaults 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以列表结构描述。

4. Community Channel 的默认配置

下面是 community channels 的默认配置,如果显式地展开,它的实际配置应该是这样:

channel_alias: https://conda.anaconda.org

当我们使用conda install -c conda-forge ...时,访问的 channel 地址就是:https://conda.anaconda.org/conda-forge/

如果我们不想改动全部的 community channel 的源,只是想修改一部分,则应该使用custom_channels,后续的镜像源配置中会看到。

5. 标准的镜像源配置

最清晰,也是最标准的镜像源配置方式应该是:在默认配置中的替换相应站点地址!我们以北外镜像为例,配置如下:

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, 有两种应对方式:

  1. 如果新的 channel 是一个很少使用的生僻 channel, 可在命令行中以 conda install -y -c https://my-mirror.com/my-channel ... 的形式显式指定其url;
  2. 如果新的 channel 是一个常用 channel,又不在 channel_alias 指定的镜像源中,可以将其添加到custom_channels中,使用conda install -y -c my-channel ...的形式指定它

6. 配置部分 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 设定的站点上去查找,如果还没有,就会报错了。

7. 仅配置 channels 列表

你会发现不少文章介绍配置镜像源的方法是:仅仅在 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节的配置方式为宜。

8. 设置代理

除了配置镜像源,如果你有自己的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》一文中专门介绍。

猜你喜欢

转载自blog.csdn.net/bluishglc/article/details/133803301