conda下载PyTorch卡在0B/s?换源与替代方案全解析
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\你的用户名\.condarcLinux/macOS在~/.condarcchannels: - 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这里有一个非常关键的经验python3.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 python3.9 conda activate test_env conda install pytorch torchvision torchaudio cpuonly -c pytorch实测下来换源后即便是在高峰期下载速度也能稳定在几MB/s以上跟官方源的0K/s相比完全是两个世界。如果这一步已经解决你的问题那么后文的坑你暂时遇不到如果还在报错或慢继续往下看。3. 删源与换源清理错误配置时最容易被忽视的三个坑有换源就有删源。要么是原来配置了某个源已经失效要么是某个第三方源同步延迟导致依赖解析失败要么是打算从镜像源切回官方源。删源这件事看着简单实际操作里我翻过好几次车。3.1 删源的两种方式与索引缓存陷阱删源有两种方式。第一种是通过命令行删除指定channelconda 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.0cu118-cp39-cp39-linux_x86_64.whl。在能访问外网的机器上下载该文件浏览器或wget均可传到内网机器。执行安装pip install ./torch-2.1.0cu118-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/anaconda4小时左右很稳定通用包安装、conda-forge依赖阿里源mirrors.aliyun.com/anaconda24小时左右很稳定Anaconda官方仓库同步较全中科大源mirrors.ustc.edu.cn/anaconda12小时左右稳定备用源、小众频道较多官方源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下载慢”“换源后报错”问题中都稳住了按这个顺序排查基本不会有解不开的死结。环境维护本身就是不断跟网络、索引、依赖三方博弈的过程把这几个工具用熟了比记住任何一条单一命令都更有价值。