本博客于2023.5.10更新,添加了频道的具体作用机理的举例
conda安装pytorch
使用官网提供的语句
conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge
-c 既是–channel,优先从pytorch 和conda-forge两个频道搜寻相应的包,但这两个频道是在哪里呢?
初看频道
打开anaconda的总配置文件.condarc ,一般在C:\Users\xxx.condarc 下,没有就要执行
conda config
会自动在C:\Users\xxx 用户根目录创建.condarc,可以每一个环境都会有一个额外的.condarc在各自的文件夹中,目前来看作用不大,在虚拟环境中对config的操作也都是对总配置文件生效的
打开总.condarc,可以看到
channels:
- conda-forge
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.aliyun.com/anaconda/pkgs/main
- https://mirrors.aliyun.com/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
channel_priority: strict
在custom_channels里可以看到conda-forge和pytorch,他们都指向了清华源,因此最初的命令是从清华源去找数据。
channels就是目前的频道,也就是包存储库,我们从频道下载包,从高到低为频道的优先级,会从最高的开始找,找不到就找下一个频道,知道有满足条件的包为止,conda-forge优先级最高,因为他最好,defaults最低,因为网上资源都说defaults不好。
default_channels就是channels中的defaults,有三个包库。
更正: channels里面的信息要尽可能少,最好是只有一个defaults,不然每次下包的时候要更新本地的包index信息,以及查找要花费更多的时间,我们应当尽可能地指名他在那个频道,而不是每个频道都去找,修改condarc如下
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
具体的一个搜索流程下面会介绍
让channels里面尽可能少,同时删去
channel_priority: strict
strict会使环境的依赖判断非常严格(好像默认就是strict,那这一行删不删就无所谓了)
conda install mamba -c conda-forge
我们直接指定他在conda-forge频道,那么他就可以尽可能缩小范围地去寻找。
数据源配置好后直接调用如下命令清除索引即可生效
conda clean -i
包搜索的具体流程和各个频道的用法(重要)
就以我上文使用到的命令举例,可以更好理解
conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge
以及使用的condarc文件
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
可以看到频道分为了三个部分,channels、default_channels、custom_channels
- 其中channels就是我们最终要搜索的频道, channels里面的频道都会被搜索
- default_channels就是在channels中的defaults,有三个频道,默认频道,因此channels默认有三个频道
- custom_channels 是键值对,可以理解为字典,在指定-c 命令时会用到,通过频道名找到仓库的具体url,比如-c pytorch,就是指定了一个库是https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud,也就是custom_channels的第四行,需要注意custom_channels的频道不指定-c是不会查找的,只有指定频道也就是-c命令时才会去进行查找
第一步:确认要查找哪些频道
由于我们使用-c命令指定了两个频道,-c pytorch -c conda-forge根据condarc的custom_channels可知我们要额外搜索conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud 和pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud(实际上是一个网址)
再结合channels,最终要查找的频道是
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud(该频道由conda-forge指定)
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud(该频道由pytorch指定)
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main(该频道由channels的default给出)
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r(该频道由channels的default给出)
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2(该频道由channels的default给出)
查找频道优先级为从上倒下查找,可以看到-c指定的优先最高,其次就是channels里面的频道排在后面
第二步:进行搜索
首先对本地进行搜索包,看之前有没有下载过(这个后面会细讲),如果本地没有就对上面最终要查找的频道进行搜索,直到找到包。
其他问题
使用下面语句不添加两个频道直接下载
conda install pytorch torchvision torchaudio cudatoolkit=11.6
会出现报错:
Problem: nothing provides requested torchaudio
意思是没有频道提供需要的包torchaudio,因为torchaudio只存在在pytorch频道中,我.condarc中channels没有关于pytorch的频道,所以找不到包导致安装失败。
使用mamba 代替conda下载
mamba install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge
会出错:
File not valid: file size doesn't match expectation
这是因为mamba 的审查机制严格,我们要从源下的包和要用到的包的size 不一致,无法安装。
解决方案1: 使用anaconda官方源
custom_channels:
conda-forge: https://conda.anaconda.org
pytorch: conda-forge: https://conda.anaconda.org
解决方案2(推荐): 全部改成阿里源
custom_channels:
conda-forge: http://mirrors.aliyun.com/anaconda/cloud
msys2: http://mirrors.aliyun.com/anaconda/cloud
bioconda: http://mirrors.aliyun.com/anaconda/cloud
menpo: http://mirrors.aliyun.com/anaconda/cloud
pytorch: http://mirrors.aliyun.com/anaconda/cloud
simpleitk: http://mirrors.aliyun.com/anaconda/cloud
conda包下载机制的解析
conda包下载主要涉及两个(种)文件夹,位于anaconda3主目录下的pkgs文件夹,和每一个环境地Lib文件夹下的site-packages文件夹。
pkgs文件夹存储了下载的包,每次下载的包都会存在这里,可以存储1个包的不同版本
site-packages文件夹,相当于每一个环境要用到的包,一个环境有一个site-packages,也说明了不同环境的是独立的。我要在环境a中下载一个包,首先看pkgs里有没有,没有则从网上下载到pkgs里,然后再复制一份相同的给a的site-packages文件夹,这样a也有了一个相同的环境。
这样做的好处是:
相同的包不同环境要用不用重复下载,直接复制一份到该环境即可,非常地方便,这也是为什么每次新建环境,克隆环境这么快,我直接复制粘贴就好了,克隆环境是对被克隆地文件夹中地所有文件都复制一份,不止复制了site-packages文件夹。
验证:
可以在pkgs和site-packages找到完全一样地的包,明显是复制来的。
同理克隆环境的话两个环境的文件夹大小是完全相同的。