前阵子有位朋友在本地用 conda 装 PyTorch,卡了整整一下午。倒不是命令写错,纯粹是速度让人崩溃:Solving environment转半天才通过,好不容易进入下载阶段,速度又稳定在几十 KB/s,一个几百 MB 的包下到怀疑人生。这个场景我相信很多用过 conda 的朋友都经历过。如果你现在也正在被同样的问题折磨,这篇文章应该能帮你省下大量时间。
我会把 conda 下载 PyTorch 速度慢的完整处理思路讲清楚:先搞明白慢在哪个环节,再给出添加国内源、删源、直接下载安装包这三类可落地的操作方案,最后把我在实际踩坑中总结的排查方法一并整理出来。内容覆盖新手也能照着做的具体命令,也会解释每条命令背后的原理,适合正在装 PyTorch 的初学者,也适合想彻底理解 conda 源机制、以后不想再被网络问题卡住的老手。
1. 为什么 conda 下载 PyTorch 这么慢:先定位瓶颈在哪
1.1 默认源在海外,慢是物理问题
conda 的默认软件源指向的是 Anaconda 官方仓库,服务器放在海外。国内网络直连这个仓库,速度波动非常大,高峰期可能只有几十 KB/s,甚至直接超时。这不是你本地网速的问题,而是数据包从海外服务器一路传回国内,中间经过的节点太多,任何一段线路拥塞都会拖慢整体速度。
这里有个很容易被忽略的点:PyTorch 的安装包体积不小。CPU 版本大约几百 MB,GPU 版本动辄几个 GB,再加上 torchvision、torchaudio 等配套包,整个环境装下来要下载好几个 GB 的数据。同样的网络延迟,下载一个小包可能只是多等几十秒,下载 GB 级的大包就是灾难级别的体验。
1.2 慢的不只是下载,还有依赖求解
很多人在Solving environment这一步就会卡住十几分钟甚至更久,这不是网络问题,而是 conda 的依赖求解机制在消耗时间。conda 要把 Python 版本、CUDA 相关库、OpenMP、MKL、BLAS 等一系列二进制包的版本约束全部匹配起来,PyTorch 在不同平台上有大量不同的构建变体,组合情况非常复杂,求解过程本身就是大规模计算。
打个比方:下载慢就像是快递在路上堵车,依赖求解慢就像是仓库管理员在几万件货物里给你一件一件匹配最合适的组合。很多人会把所有时间都花在“怎么让下载更快”上,实际上有相当一部分时间是消耗在求解环节。两种慢的解决办法完全不同,所以第一步一定要定位清楚。
1.3 先判断自己卡在哪个环节
把终端里滚动输出的信息翻出来看一眼,其实很容易判断:
- 如果输出一直停留在
Solving environment,没有出现任何下载进度条,说明卡在依赖解析阶段。 - 如果已经出现
Downloading and Extracting Packages并且有进度条,但速度很慢,说明卡在网络下载阶段。 - 如果直接报
CondaHTTPError或者Connection failed,说明网络根本连不上当前源。
搞清楚这两类问题的区别之后,再针对性地处理。依赖解析慢的解决方案在后面排查章节会讲,而下载慢的核心解决方案就是换源,这也是本文的重点。
2. 给 conda 添加国内源:两套可直接照抄的配置方案
2.1 使用命令行添加国内源
给 conda 添加源最标准的操作是使用conda config --add channels命令。下面这套命令是通用模板,我特意把具体的镜像站域名写成了mirrors.example.edu.cn这种占位格式——因为不同镜像站的地址前缀不一样,你需要打开自己选定的镜像站首页,找到 Anaconda 镜像使用帮助,把里面的真实地址替换进去。
# 添加主包仓库源 conda config --add channels https://mirrors.example.edu.cn/anaconda/pkgs/main/ # 添加旧版包仓库源(很多老依赖还在里面) conda config --add channels https://mirrors.example.edu.cn/anaconda/pkgs/free/ # 添加 PyTorch 官方 channel 的镜像源 conda config --add channels https://mirrors.example.edu.cn/anaconda/cloud/pytorch/ # 让 conda 在日志中显示每个包来自哪个源 conda config --set show_channel_urls yes这里有个关键点要理解:--add channels是把新源插入到源列表的最前面,而不是追加到末尾。如果连续执行多次添加命令,最后添加的源会排在第一位,优先级最高。所以我的习惯是:先添加pkgs/main,再添加pkgs/free,最后添加cloud/pytorch,这样执行完之后cloud/pytorch正好在列表最上面,后续装 PyTorch 时 conda 会优先从这个源拉取。
执行完上述命令后,用下面的命令验证一下:
conda config --show channels正常输出会类似这样:
channels: - https://mirrors.example.edu.cn/anaconda/cloud/pytorch/ - https://mirrors.example.edu.cn/anaconda/pkgs/main/ - https://mirrors.example.edu.cn/anaconda/pkgs/free/ - defaults看到defaults还在列表里也不用慌,它排在最后,优先级最低。只要镜像源列表在前面,conda 就会优先用镜像源。
2.2 直接修改 .condarc 文件
命令行操作最终也是把配置写进.condarc文件,所以你也可以直接编辑这个文件。这个文件位于用户主目录下,Linux 和 macOS 是~/.condarc,Windows 是C:\Users\你的用户名\.condarc。如果文件不存在,直接新建一个即可。
用文本编辑器打开后,把下面的内容填进去,注意这是 YAML 格式,缩进、冒号、空格一个都不能错:
channels: - https://mirrors.example.edu.cn/anaconda/cloud/pytorch/ - https://mirrors.example.edu.cn/anaconda/pkgs/main/ - https://mirrors.example.edu.cn/anaconda/pkgs/free/ - defaults show_channel_urls: true保存后运行conda config --show-sources可以查看当前生效的配置来源。这个方法适合喜欢批量管理配置、不想在终端里一条条敲命令的人。但要注意:命令行和文件编辑不要同时混用,以文件为准的话,命令行添加的源会被文件内容覆盖,反而容易产生困惑。
2.3 让源真正生效:优先级与验证手段
配置完源之后,还有一个容易被忽略的步骤:确认你装的包确实是从国内源下载的。很多人配完之后没有观察下载日志,结果还是从官方源拉取,白折腾一场。
验证方法很简单,在安装命令执行的时候,观察终端里每个包名称后方的|符号,如果显示的是你配置的镜像站地址,说明已经生效。配合前面设置的show_channel_urls: true,conda 会把来源信息打印出来。
另一个相关参数是channel_priority。conda 4.6 版本之后引入了更严格的频道优先级机制,可选值有strict、flexible和disabled。默认的flexible表示 conda 会尽量优先使用列表靠前的源,但如果找不到匹配的包,也允许从后面的源下载。如果你发现配置完源之后,依赖求解时间反而变长了,可以尝试把优先级改为flexible并新建干净环境,这个我在后面的排查章节会展开讲。
注意:网上搜到的镜像源配置五花八门,很多来源不明的手动配置可能有误甚至被篡改。最稳妥的做法永远是打开镜像站首页,找到官方的“Anaconda 镜像使用帮助”页面,从那里复制配置命令。镜像站的管理员通常会把可用的 channel 路径和用法写得很清楚。
3. 删除源和恢复默认源:清理配置别只看表面
3.1 移除某一条指定 channel
如果添加了某个源之后发现速度反而更差,或者源本身不稳定,可以用--remove channels命令把它单独移除:
conda config --remove channels https://mirrors.example.edu.cn/anaconda/pkgs/free/执行完再次用conda config --show channels检查,确认这条源已经从列表中消失。如果输入的源名不存在,conda 会报一个CondaKeyError或者提示找不到该 channel,这时候不用紧张,说明你要删的那条本来就没配上。
3.2 一键清除所有自定义源,恢复官方默认
如果你想彻底放弃国内源,恢复 conda 最初的官方默认源,方法也很简单:
conda config --remove-key channels这条命令会把channels这个配置键整个删掉。删除之后 conda 会自动使用默认的官方源,也就是defaults。可以用conda config --show channels验证,输出只剩一个defaults就说明恢复成功了。
需要注意的是:这个操作只影响 conda 后续从哪个源下载新包,不会删除你环境里已经装好的任何软件包。之前已经安装的 PyTorch 等包都还在,不用担心环境被破坏。
另外还有一种“物理删除”的方式,直接把.condarc文件删掉,效果等同于清空所有自定义配置。但这样做会把你在.condarc里设置的其他参数,比如show_channel_urls、ssl_verify、envs_dirs等也一并清掉。如果你之前对这些参数做过精细调整,不建议用这种方式。
3.3 动配置之前先备份,这是我的个人习惯
改 conda 配置这操作,看起来简单,但真踩过一次坑之后就会长记性。我在某次调整源配置后,conda 在解析依赖的时候反复报错,折腾很久才发现是新配置格式有问题。后来我养成一个习惯:改配置之前先备份一份。
Linux 和 macOS 执行:
cp ~/.condarc ~/.condarc.bakWindows 用户把C:\Users\你的用户名\.condarc复制一份改名即可。
出现问题后,直接让配置文件恢复到备份版本:
cp ~/.condarc.bak ~/.condarc这比重新敲一遍命令省事多了。特别是你用了多个源、调整过优先级、还改过其他参数的时候,备份文件能让你快速回到可用状态。
4. 直接下载安装包:绕开 conda 下载慢的最后一招
4.1 从网页拿到安装包直链
换源是解决下载慢的主流方式,但不是所有场景都能靠换源解决。比如某些内网环境访问不了任何外部镜像站,或者你需要在离线机器上安装 PyTorch,这时候“先下载、后安装”的思路就派上用场了。
具体做法是:用浏览器直接访问 Anaconda 的官方包仓库网页,搜索pytorch,找到与你的操作系统、Python 版本、CUDA 需求匹配的.conda或.tar.bz2文件,再用浏览器或者专业的下载工具把文件拉到本地。
Anaconda 仓库中 PyTorch 相关包的文件名信息量很大,通常同时包含平台、Python 版本、构建编号等信息。举例来说,一个文件名为pytorch-2.1.0-py3.10_0.conda的包,大致可以解读为:PyTorch 2.1.0 版本、适配 Python 3.10、是第 0 次构建。你要注意选择与目标环境一致的版本,否则本地安装时 conda 会因为依赖不匹配而报错。
4.2 使用本地包安装
包下载完成后,安装命令非常简单,直接把 conda install 后面指向本地文件路径即可:
conda install /home/yourname/Downloads/pytorch-2.1.0-py3.10_0.condaWindows 路径就换成本地文件的实际位置,比如:
conda install C:\Users\yourname\Downloads\pytorch-2.1.0-py3.10_0.conda执行后 conda 会解析这个本地包的依赖关系,并尝试从已配置的源中拉取缺失的依赖包。这里要注意:本地包安装只能解决“主安装包下载慢”的问题,如果它依赖的其他包(比如 numpy、typing-extensions)还没有安装,conda 仍然会去配置的源下载这些依赖。如果在完全离线的机器上安装,需要把所有依赖包全部下载好,再一个个离线安装,这个操作复杂度会明显上升。
所以我个人对“直接下载”这个方案的定义是:适合网络非常不稳定、或者源配置已经折腾无效的情况,用它来绕过最大体积包的下载瓶颈,而不是完全脱离网络。
4.3 装 CPU 版 PyTorch 的话,pip 换源可能更省事
除了 conda 之外,PyTorch 官方还支持 pip 安装。如果你需要的只是 CPU 版本,并且暂时没有使用 conda 管理环境的硬性要求,那么 pip 换源安装通常会比 conda 换源安装更简单、速度也更容易拉满。
pip 的国内源配置方式比 conda 更轻量,直接在命令行指定源地址即可:
python -m pip install torch torchvision torchaudio -i https://mirrors.example.com/simple这里的mirrors.example.com同样是占位符,你需要替换为实际可用的 pip 镜像源地址。pip 镜像源地址的路径格式通常是/simple结尾。
注意:pip 和 conda 最好不要在同一个环境里混用装 PyTorch。我的亲身教训是:先 conda 装了一半,发现慢,又用 pip 补装,结果 conda 的依赖解析和 pip 安装的包产生了冲突,后面每次
import torch都时而正常时而出错。如果你已经决定用 conda 环境,就老老实实用 conda 装;想用 pip,就单独创建一个虚拟环境来装。一个环境一个包管理器,是最省心的做法。
5. 高频踩坑与排查实录:从现象到根因
5.1 配置了国内源,下载时却仍然走官方源
这个几乎是我见过最多的“假成功”。配置完channels后,用conda config --show channels看列表,明明镜像源在前面,但真正下载时日志里显示的还是官方源地址。
出现这种情况,先检查以下几点:
- 确认你配置的 URL 末尾斜杠是否正确。很多镜像站的源路径必须以
/结尾,少了这个斜杠,conda 访问时可能匹配不上。 - 确认
show_channel_urls是否设置为true。没有开启的话,日志里不会显示每个包的来源,你会误以为没走镜像源。 - 检查是不是在某个特定环境中安装包。如果你先执行了
conda activate进入某个环境,又在该环境中设置了环境级.condarc,它可能会覆盖用户级配置。可以用conda config --show-sources查看配置来自哪个文件。
这几种情况排查一遍,基本就能定位到问题。
5.2 Solving environment 长时间卡住不往下走
如果你已经换好了国内源,但Solving environment仍然要等很久,问题就不在网络,而在 conda 自身的依赖解析性能。我实际遇到的卡死场景中,有一个很典型的情况:在 base 基础环境中直接安装 PyTorch,由于 base 环境里已经装了几百个包,conda 需要重新求解所有包的兼容关系,时间自然被大幅拉长。
我的建议是:不要在 base 环境里装大型深度学习框架,先创建一个干净的新环境再安装。命令如下:
conda create -n torch_env python=3.10 conda activate torch_env conda install pytorch torchvision torchaudio -c 你配置好的镜像源对应的pytorch频道地址新环境里的包数量少,依赖关系简单,Solving environment的速度会快很多。如果新环境里还是卡得离谱,可以尝试调整 channel 优先级策略:
conda config --set channel_priority flexible另外,如果你经常被依赖求解折磨,可以了解一下 mamba 这个替代工具。mamba 使用 C++ 实现的求解器,依赖解析速度通常比 conda 默认快很多。它的安装命令是conda install -n base mamba -c <你配置好的channel地址>,把<你配置好的channel地址>替换成实际源即可,装好之后用mamba install代替conda install,体验会明显不一样。
5.3 出现 CondaHTTPError 或 SSL 相关报错
CondaHTTPError是换源之后最经典的报错。具体错误信息里通常会包含一个 HTTP 状态码,不同状态码指向的问题不一样:
| 状态码或错误 | 可能原因 | 处理建议 |
|---|---|---|
| HTTP 000 | 网络层连接失败,源不可达 | 检查地址是否写错、当前网络能否访问该源 |
| HTTP 404 | 源路径不存在 | 镜像站路径不对,去镜像站帮助页核对 URL |
| HTTP 403 | 被限流或拒绝访问 | 稍等再试,或换一个镜像站 |
| SSL 证书相关 | 镜像站证书与 conda 内置证书不匹配 | 更新 conda 和 requests 库,而不是直接关证书校验 |
针对 SSL 问题,有人会建议conda config --set ssl_verify false来关闭证书校验。我的态度是:这可以作为临时验证配置的手段,但不要长期开着,关闭证书校验意味着你的下载请求将无法验证服务器身份,存在安全隐患。优先升级 conda 版本、更新 ca-certificates 包,绝大多数证书问题都能解决。
5.4 清理缓存:换源之后旧缓存可能还在干扰
还有一个很容易被忽略的环节:conda 的包缓存。conda 默认会把下载过的压缩包缓存在pkgs目录中,如果你之前从慢速源下载了部分损坏或不完整的缓存,即使换了源,conda 在安装时也可能优先尝试使用缓存里的旧文件,导致安装卡住。
遇到安装异常,可以先把缓存清理一遍:
conda clean -a这条命令会清空所有缓存索引和下载缓存。执行之后再重新安装,conda 会老老实实从当前配置的源重新拉取文件。pip 也存在类似问题,pip cache purge可以一键清理。这种“换源后还是慢/还是报错”的情况,十有八九就跟缓存有关。
5.5 GPU 版与 CPU 版选择不当,导致下载体积翻倍
最后分享一个很实际的经验。很多朋友执行conda install pytorch时没有想清楚默认安装的是 GPU 版本,下载体积轻松超过 2 GB,如果网络不好,下载时间自然被无限拉长。PyTorch 的 conda 默认包会尝试匹配当前机器的 CUDA 环境,如果你暂时不需要用 GPU,或者驱动环境还没配好,可以明确安装 CPU 版本:
conda install pytorch torchvision torchaudio cpuonly -c 你配置好的镜像源对应的pytorch频道地址cpuonly是一个元包,专门用来告诉 conda 只需要 CPU 版本。安装体积会比 GPU 版小很多,依赖也简单不少。等以后真的需要 GPU 时,再重新建环境装 GPU 版也不迟。
我个人在实际操作中的体会是:conda 下载 PyTorch 慢这个问题,大多数时候不是单点故障,而是“源的位置”和“依赖求解复杂度”两个因素叠加的结果。最快的路径通常是:先建一个干净环境,再配置好国内源,确认 channel 优先级正常,最后观察日志判断瓶颈。如果还不行,就直接用下载工具拉本地包,一步到位。这套组合操作帮我解决了不少环境搭建问题,也让我在后续配置 TensorFlow、PaddlePaddle 等大型框架时少走了很多弯路。建议你把这几个命令和排查思路收藏起来,下次不管装什么深度学习框架,都能用得上。