conda下载PyTorch永远卡在0B/s,进度条纹丝不动的场景,估计所有用conda装过深度学习环境的人都经历过。明明网络是通的,浏览器下载文件也能到几MB/s,偏偏conda装个torch就是慢得让人抓狂。这篇文章就是来解决这个问题的,核心思路就三条:配置国内源、清理或删除不合适的源、以及绕开conda直接用别的方式下载安装。我把自己这些年踩过的坑、试过的有效方案一次性梳理清楚,照着操作基本能解决90%以上下载慢的问题。
1. 下载慢的本质:不全是网速问题,是conda的下载链路在拖后腿
先说结论:conda下载PyTorch慢,很大概率不是你的宽带不行,而是conda默认走的下载通道和数据交换机制本身就不适合国内网络环境。
1.1 conda默认源的物理距离与HTTP并发限制
conda默认的channel是repo.anaconda.com,服务器托管在海外。国内直连这条链路,中间要过国际出口、海底光缆、多级运营商节点,任何一级出现拥塞或者丢包,体现在conda界面上就是速度暴跌甚至卡死。
更重要的是,conda在下载包时本质上是普通的HTTP文件拉取,它不会像浏览器那样对单个域名建立多个并发连接来加速。你要装一个PyTorch,往往连带CUDA运行时、cuDNN、mkl、openblas等一堆依赖,几十个包串行拉取,任何一个环节慢,整个安装过程就被拖住。我实测过一个包含torch、torchvision、torchaudio三个主包再加二十几个依赖的环境,直连官方源时经常出现某个包长时间停滞,最后报错退出。
所以第一步要认清的事情是:慢的根本原因是默认源的物理链路和conda的下载机制不匹配,换源是最直接、最有效的解法。
1.2 依赖解析阶段的隐蔽耗时
还有一个很多人忽略的点:conda install不是直接从网上下载软件包那么简单,它先要拉取channel的repodata.json索引文件,把整个channel里所有包的版本、依赖关系、校验值都读一遍,然后再做依赖求解。这个索引文件有几十MB,在不同channel上来回读取的速度,直接决定了你敲下命令之后“转圈圈”的时间。
也就是说,哪怕你最终要装的包只有几个,解析阶段也可能卡很久。很多人以为“conda正在下载”,实际它可能还在无穷无尽地读索引。国内源之所以好用,不仅因为下载包快,更因为索引文件在国内服务器的传输速度也远快于跨洋链路。
2. 配置国内源:三行命令让conda瞬间提速
国内主流的Anaconda仓库镜像站,我在不同项目里都用过。覆盖面最广、同步最稳定的是清华大学开源软件镜像站(清华源)、阿里云开源镜像站(阿里源)和中科大开源镜像站(中科大源)。这三个我都长期使用过,下面给出经过我反复验证的配置方案。
2.1 推荐配置:直接写入.condarc文件
conda的源配置读取的是用户目录下的.condarc文件。你可以手动编辑它,更稳妥的方式是让conda自己生成,然后我们用一段标准配置覆盖。
推荐的做法是直接执行以下命令生成一个干净的.condarc文件:
conda config --set show_channel_urls yes然后编辑用户目录下的.condarc文件,写入如下内容(Windows在C:\Users\你的用户名\.condarc,Linux/macOS在~/.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 pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud这里有一个非常关键的经验:python=3.8以上的PyTorch官方安装命令经常会用到pytorch这个channel,如果这个channel没有被正确指向国内镜像,conda就会依然去访问官方源,导致“明明换了源还是很慢”的错觉。所以custom_channels里把pytorch对应的路径也设上。
如果使用阿里源或中科大源,把default_channels里的域名分别替换为https://mirrors.aliyun.com/anaconda/pkgs/和https://mirrors.ustc.edu.cn/anaconda/pkgs/即可,custom_channels对应路径也同步替换。配置写入后,用conda clean -i清理索引缓存,让conda重新拉取镜像站的索引。
2.2 验证换源是否成功
很多新手换完源就急着装包,结果依然慢,就开始怀疑是不是自己配置有问题。其实可以先用两个命令快速验证:
conda config --show channels这个命令会列出当前生效的channel。如果显示的是镜像站的地址,说明channel配置已经生效。如果列出的是repo.anaconda.com,那说明.condarc里保留了官方源,配置有问题。
conda clean -i然后执行安装,比如:
conda create -n test_env python=3.9 conda activate test_env conda install pytorch torchvision torchaudio cpuonly -c pytorch实测下来,换源后即便是在高峰期,下载速度也能稳定在几MB/s以上,跟官方源的0K/s相比完全是两个世界。如果这一步已经解决你的问题,那么后文的坑你暂时遇不到;如果还在报错或慢,继续往下看。
3. 删源与换源:清理错误配置时最容易被忽视的三个坑
有换源就有删源。要么是原来配置了某个源已经失效,要么是某个第三方源同步延迟导致依赖解析失败,要么是打算从镜像源切回官方源。删源这件事看着简单,实际操作里我翻过好几次车。
3.1 删源的两种方式与索引缓存陷阱
删源有两种方式。
第一种是通过命令行删除指定channel:
conda config --remove channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free第二种是直接编辑.condarc文件,把不想用的channel行删掉。如果整个配置文件不要了,直接删除.condarc文件即可,conda会恢复默认源。
但删完之后有个致命细节:必须执行conda clean -i再继续安装,否则conda会优先使用本地缓存的索引数据。缓存的repodata.json里可能仍然记录着旧源的包路径和校验值,这会导致两种异常情况:一是conda仍尝试连接已删除的源;二是索引数据与真实源不一致,报出“PackagesNotFoundError”或“ChecksumMismatchError”。
我在处理某开发机时,就是因为删了旧的第三方源但没有清理索引缓存,执行install时报了莫名其妙的MD5 mismatch。排查了半小时,最后执行了conda clean -i --yes再重新安装,问题直接消失。
3.2 .condarc的YAML格式问题与“看起来对了其实没生效”
另一个低频但烦人的坑是.condarc文件解析失败。conda严格按YAML格式解析这个文件,我在配置里加了一行中文注释,某些conda版本对编码和特殊字符的处理不够健壮,导致解析报错。
更隐蔽的是URL结尾的斜杠问题。比如:
default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/我在某次迁移配置时手滑在末尾多加了一个斜杠,conda并不报错,但它在生成完整URL时会拼出双斜杠路径,某些镜像站的CDN对双斜杠路径会返回404或者重定向到错误的节点,导致包一直下载失败。
所以我的建议是:不要手写.condarc注释,不要改URL格式,严格复制官方镜像站文档中的标准写法。配置完成后马上用conda config --show检查源地址是否与预期完全一致,尤其注意末尾斜杠、http/https协议、域名拼写这三类问题。
3.3 @EXPLICIT环境导出文件里的源残留问题
这个坑比较冷门,但一旦遇到就很折腾。conda list --explicit导出的txt文件,或者是conda env export导出的environment.yml中,会记录每个包的具体来源URL。如果你从官方源导出了一份环境文件,然后把环境文件的channel模板改成了清华源,执行conda env create -f environment.yml时,conda依然会根据文件里记录的旧URL去拉取部分包,导致速度奇慢或直接失败。
正确的做法是:导出环境文件后做两层修改。第一层是environment.yml顶部的channels段,第二层是逐个检查包前缀中是否带https://repo.anaconda.com的完整URL,如果有,批量替换成镜像站对应路径。这类文件我建议用文本编辑器全局查找替换,不要手工一格格删。
4. 绕开conda:直接下载相关的三个可行替代方案
换源不是唯一出路。有时不管怎么配源,特定包在conda镜像上就是不完整,或者你根本不需要完整的conda环境管理,这时可以考虑绕开conda下载这个环节。
4.1 使用pip的国内源安装PyTorch
如果你当前的Python环境已经具备安装条件(比如已经有了基础Python解释器,或者为了特定python版本已经创建了一个conda环境),可以直接使用pip配合国内PyPI镜像来安装PyTorch,命令如下:
pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple这里的思路是:在conda环境下使用pip安装包,PyPI镜像的同步完整度和下载速度通常优于Anaconda镜像。尤其对于PyTorch这种官方在PyPI上持续发布wheel包的场景,pip的安装链路往往更快更稳定。
但要注意一个使用策略问题:不要把pip当成conda的替代品去安装环境里所有包。混用两者管理同一个Python环境,时间久了会积累“pip安装了A包,conda不知道,之后conda安装某个依赖时把A包覆盖掉”这样的依赖冲突。我的建议方案是,基础依赖与Python版本管理用conda,大型机器学习框架如PyTorch用pip安装,二者并用时务必保持两个列表都清楚。
4.2 手动下载wheel文件离线安装
如果服务器在隔离内网,或者某些镜像站持续抽风,手动下载wheel文件再离线安装是最稳妥的兜底方案。
具体流程:
- 去PyTorch官网的get-started页面选择合适的版本、操作系统、CUDA版本组合,会生成对应的pip安装命令。
- 进入PyTorch官方whl包索引页,找到对应版本的
.whl文件名,例如torch-2.1.0+cu118-cp39-cp39-linux_x86_64.whl。 - 在能访问外网的机器上下载该文件(浏览器或
wget均可),传到内网机器。 - 执行安装:
pip install ./torch-2.1.0+cu118-cp39-cp39-linux_x86_64.whl。 - 安装后验证:
import torch print(torch.__version__) print(torch.cuda.is_available())关键是要确保whl文件名里的cp39与你当前环境的Python版本(3.9)一致;linux_x86_64与操作系统架构一致(Windows则是win_amd64)。版本不匹配时pip会提示“torch is not a supported wheel on this platform”。
4.3 conda-pack:把整套环境打包拷贝的另类思路
还有一种绕开conda网络问题的方式是conda-pack,它可以把某个机器上已经安装好的conda环境打包成tar.gz压缩包,拷到另一台机器上直接解压使用,不需要在目标机器上重复下载任何包。
conda install conda-pack conda pack -n torch_env -o torch_env.tar.gz在目标机器上解压后,把目录放到conda的envs目录下或者直接激活使用。这个方法非常适合多台机器需要相同环境的场景。不过有一个前提:打包机和目标机的操作系统、CUDA驱动版本要基本一致,尤其是PyTorch这类二进制包绑定了CUDA运行时,如果两台机器CUDA版本差异过大,即使环境包能解压,跑起来也会报错。
5. 源的选择与长期维护:给新手的一份自用切换策略
配置源不是一劳永逸的事,实战中我见过不少环境被“源折腾”破坏。总结一套自用策略给大家参考。
5.1 源的速度与同步度对比
| 源 | 代表地址 | 同步频率 | 大陆访问稳定性 | 适用场景 |
|---|---|---|---|---|
| 清华源 | mirrors.tuna.tsinghua.edu.cn/anaconda | 4小时左右 | 很稳定 | 通用包安装、conda-forge依赖 |
| 阿里源 | mirrors.aliyun.com/anaconda | 24小时左右 | 很稳定 | Anaconda官方仓库同步较全 |
| 中科大源 | mirrors.ustc.edu.cn/anaconda | 12小时左右 | 稳定 | 备用源、小众频道较多 |
| 官方源 | repo.anaconda.com | 实时 | 不稳定 | 无需切换的特殊场景 |
注意一个细节:镜像站与官方源不是完全实时同步的。如果你安装的包是某个频道刚发布的最新版,镜像站上可能还没同步过去。这时会报“Package missing in current channels”,有人第一反应是“源坏了”,其实只是同步延迟而已。这种情况的解决方案有两个:等几个小时重试,或者临时加官方channel只装这一个包。
另外一个容易被忽略的问题是,不要同时开启两个镜像站作为default_channels。不同镜像站的同步时间戳不同,conda在求解依赖时会去对比两个站的repodata,一旦两个站的索引不同步,可能出现“包A在源1有记录、依赖包B在源2有记录、但两个站对B的版本要求不一致”的乱象。默认推荐只用同一个镜像站的一组频道,不要混搭。
5.2 发现源有问题后的正确处置流程
如果某天conda install突然变慢或报404错误,我的排查流程是:
conda clean -i # 清理缓存索引 conda config --show-sources # 检查当前所有配置来源先确认是不是本机缓存导致的,如果清理后问题依旧,再检查镜像站公告确认是否处于同步中断或维护期。这时候不要马上把整个配置文件删掉,而是临时切换到另一个镜像站,把default_channels和custom_channels的域名整体替换,再清理一次索引缓存重试。如果切源后恢复正常,说明旧的镜像站在那一段时间有问题,不影响长期使用;如果切源后依然报错,才需要考虑是不是环境本身的依赖关系出了问题。
5.3 我自己的最终推荐组合
以我最近半年维护多个环境的经验,最省心的组合是:基础包与依赖库走清华源,PyTorch系直接用pip走PyPI镜像,conda-forge频道的包走清华源或中科大源。三者按需使用,互不干扰。
给新手的直接建议是:
- 首次配置:把
.condarc四个section写全(channels、show_channel_urls、default_channels、custom_channels)。 - 移除空闲源:只保留一个主镜像源。
- 遇到具体安装失败:先
conda clean -i再重试,无效再切源,再无效直接改用pip镜像或whl文件离线装。 - 保持耐心:镜像站同步有时差,热门包的过时版本下载通常没问题,但最新版本可能延迟。
这套流程在我处理过的几乎所有“conda下载慢”“换源后报错”问题中都稳住了,按这个顺序排查,基本不会有解不开的死结。环境维护本身就是不断跟网络、索引、依赖三方博弈的过程,把这几个工具用熟了,比记住任何一条单一命令都更有价值。