1. 为什么非要在虚拟环境里装PyTorch
先说个我自己的真实经历。几年前我刚开始在Mac上折腾深度学习那会,还不知道虚拟环境是什么东西,直接用sudo pip3 install torch往系统Python里硬塞。结果装完睡了一觉起来,发现之前跑得好好的openpyxl、numpy 1.x全被悄悄升级或者直接崩掉,一个数据处理的脚本直接罢工,那叫一个酸爽。后来才明白,PyTorch这种大型依赖库最吃环境的干净程度——它要拉一堆torchvision、torchaudio、numpy、typing_extensions的特定版本,跟系统里其他项目的依赖一不小心就打架。
虚拟环境就是干这个的:它把Python解释器、pip、所有第三方包都隔离在一个独立的目录里,你在里面随便造,随便升降级,都不会动到全局环境的半根头发。具体到Mac上,常用的方案有venv、conda、miniforge。venv是Python自带的,轻量但装PyTorch时得手动处理一堆依赖和Python版本问题;conda和miniforge则是更省心的选择,尤其是miniforge在Apple Silicon上体验出奇地好。
这里我要重点推荐miniforge,原因有三点:第一,它比Anaconda清爽太多,Anaconda动不动占好几个G,里面装了一堆你可能永远都用不上的科学计算包;第二,miniforge默认使用conda-forge源,对Apple Silicon有原生的ARM64支持,性能拉满;第三,它自带独立的conda命令,创建虚拟环境只需要一行代码,管理依赖也比venv直观。所以接下来的步骤我全部用miniforge演示,如果你已经装了Anaconda,命令也基本通用。
另外提醒一句,Windows上常见的是conda activate和conda deactivate,macOS的终端默认是zsh,有时候会提示conda init没执行,别慌,这一步我在第二节会详细说。
2. 环境准备:确认芯片、装miniforge、建虚拟环境
2.1 确认你的Mac是Intel还是Apple Silicon
这一步非常关键,直接决定了PyTorch装哪个版本。因为M1/M2/M3系列芯片是ARM架构,老Intel的Mac是x86_64架构,两个架构的Python解释器和PyTorch二进制包完全不通用。打开终端敲:
uname -m如果输出是arm64,恭喜你,这是Apple Silicon;如果是x86_64,那就是Intel。另外看系统里“关于本机”那栏,如果写着“Apple M1 Pro”或者“M2”,也能猜到。这一步别嫌麻烦,我见过有人拿Intel的Mac装了torch==2.0的ARM版本,启动直接报Illegal instruction,最后只能重装。
这里还有一个细节:部分老Intel Mac用的是x86_64,但如果你在Rosetta转译的终端里运行,uname -m也可能显示arm64,所以稳妥起见,请在原生终端里执行。你可以打开“访达-应用程序-实用工具-终端”,右键查看简介,确认“使用Rosetta打开”没有被勾选。
2.2 安装miniforge并初始化conda
安装miniforge非常简单,直接去GitHub的miniforge官方仓库下载对应芯片的安装包。我建议用命令行方式,最干净:
# 下载miniforge安装脚本(Apple Silicon版) curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh # 如果是Intel Mac,把arm64改成x86_64然后执行:
bash Miniforge3-MacOSX-arm64.sh一路回车,看到许可协议输yes,默认安装位置是~/miniforge3,不用改。最后它会问你是否执行conda init,这里必须输yes,不然之后conda命令找不到。装完之后关掉终端重新开一个,输入conda --version,能输出版本号就说明成功了。
我踩过最大的坑是这个:安装完miniforge之后,系统里同时存在python3(系统自带)和conda的Python,如果直接用python3去运行代码,根本不会用虚拟环境里的解释器。所以一定要养成先conda activate 环境名,再敲python的习惯。
2.3 创建PyTorch专属虚拟环境
推荐用conda create -n来建一个干净的环境,名字随意,我一般用pytorch,清晰明了。同时可以一次性指定Python版本,PyTorch目前对3.10-3.12支持最好,建议选3.10或3.11,太老或太新都可能遇到预编译包缺失的问题:
conda create -n pytorch python=3.11 -y这里-y是自动确认依赖,省得中途卡住。创建完成后激活:
conda activate pytorch激活之后终端前面会多一个(pytorch)前缀,这就是进入虚拟环境了。如果你用的是zsh,偶尔会碰到conda activate提示command not found,多半是conda init没生效,执行一下conda init zsh再重开终端就好。
3. 安装PyTorch:conda还是pip?
3.1 先看官方安装命令
打开PyTorch官网,选择macOS、你的芯片架构、安装方式,它会直接给你一段命令。我以目前最新的稳定版本为例,在Apple Silicon上用pip安装,官方推荐命令是:
pip3 install torch torchvision torchaudio在macOS上,pip默认会从PyPI下载Mac平台的CPU版本,如果你用的是M系列芯片,并且想启用MPS加速,这个命令就够了,因为PyTorch在Mac上只提供CPU和MPS两种编译,没有单独的CUDA版本。注意,Mac上不要想着装CUDA,NVIDIA的卡在Mac上早就不用想了,MPS是新版的加速方案,利用的是Apple的Metal框架。
如果你的网络访问PyPI很慢,建议换国内镜像,比如清华源:
pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple但注意,用-i临时指定镜像源时,最好加一句--trusted-host pypi.tuna.tsinghua.edu.cn,否则有些老版本的pip会报SSL错误。
3.2 用conda安装的优势和坑
如果你更习惯用conda管理包,也可以直接用:
conda install pytorch torchvision torchaudio -c pytorch这里有个特别重要的细节:现在PyTorch在conda上的命名规则改了。以前是直接pytorch包,现在必须在前面加上pytorch::前缀,或者指定通道,否则可能装成pytorch的CPU-only旧版本,或者找不到包。同时建议先给conda配置国内镜像源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/不过说实话,我实际体验下来,在Mac上conda安装PyTorch的速度和兼容性并不比pip好,反而经常碰到依存关系解析太久、下载到一半断流的幺蛾子。所以我个人更推荐用pip,直接、快、省事。但如果你就是要用conda,也完全没问题,只要确保环境内没有同时跑pip和conda反复装包,不然容易产生依赖错乱。
3.3 安装完必做的验证
不管用哪种方式装完,都要验证一下到底成没成。先激活环境,然后进入Python交互式:
conda activate pytorch python然后在Python里执行:
import torch print(torch.__version__) print(torch.backends.mps.is_available())如果输出了类似2.5.1,并且第二行是True,说明安装成功,而且MPS加速可用。如果mps.is_available()返回False,别担心,可能是当前PyTorch版本对老Intel Mac的支持问题,CPU版本的PyTorch也能正常跑,只是速度慢一些。
还有一个容易忽略的点:torch.__version__如果显示2.0.0+cpu,这是正常的,不用慌,Mac上的所有PyTorch都是CPU+支持MPS的编译版本,没有CUDA版本。但如果你需要用到torch.cuda.is_available(),在Mac上永远是False,这是正常现象,别浪费时间纠结。
4. 常见问题与排查实录
4.1 安装速度慢、卡在Downloading
这是Mac和Windows玩家共同的痛,尤其是通过pip下载torch的wheel包,动辄一两百兆,网络一抽风就卡死。我的建议有三招:
第一,换镜像源,清华、阿里、中科大的源都行,我实测下来清华源在晚上高峰反而很稳,阿里源白天快,看你所在地区,两个都试一下。第二,用--timeout和--retries参数,增加重试次数和超时上限:
pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 120 --retries 10第三,直接手动下载wheel包,然后本地安装。你可以从PyPI官网或者镜像站先把.whl文件下载下来,再用pip install 文件路径安装,这样断了也能续传。
4.2 conda虚拟环境创建后Python版本不对
很多人建了环境,激活后一敲python --version,发现还是系统那个Python。这是因为系统里同时存在/usr/bin/python3和miniforge的python,而conda环境激活之后,环境变量PATH应该把conda环境目录放在最前面。排查方法是执行:
which python如果输出不是~/miniforge3/envs/pytorch/bin/python,说明激活没生效。常见原因是没执行conda activate,或者当前终端session没有运行过conda init。重开终端再激活一次,八成能解决。
4.3 在PyCharm里找不到虚拟环境
这个也是高频问题。你用miniforge创建了环境,但在PyCharm的Settings -> Project -> Python Interpreter里怎么都看不到。解决办法是手动添加:点Add Interpreter,选Conda Environment,然后Existing environment,它会让你选择执行文件路径。你要找到~/miniforge3/envs/pytorch/bin/python,选中这个文件即可。有些PyCharm版本会自动扫描conda环境,不用手填,但还是建议手动指定,特别是你装了多个conda工具链的时候。
4.4 安装时报“unsupported machine code"之类的错
这类错误基本就是你在Apple Silicon上装了x86_64版本的Python或torch,或者在老Intel Mac上装了ARM版本。处理办法很直白:删掉环境,重新建,建的时候加上CONDA_SUBDIR环境变量来强制指定架构:
# 在Apple Silicon上强制ARM64 CONDA_SUBDIR=osx-arm64 conda create -n pytorch python=3.11 -y也可以先查看当前conda的subdir信息:
conda info看platform那一行,如果是osx-64,说明你正在用Rosetta转译的终端,这也解释了为什么装了arm包出错。解决办法依然是使用原生终端。
4.5 使用MPS加速时的注意事项
新版的PyTorch在Apple Silicon上可以用torch.device('mps')来调用MPS后端,最常见的操作是:
device = torch.device('mps' if torch.backends.mps.is_available() else 'cpu') data = data.to(device)但有几个坑要提醒:一是MPS在一些操作上还没有完整实现,比如某些scatter、index_put操作可能报错或回退到CPU,碰到这种情况就用device='cpu'再试。二是内存管理,MPS默认会占满统一内存,如果你的Mac是16GB内存,模型稍微大一点就会爆内存,建议给PyTorch设置一个上限:
import os os.environ['PYTORCH_MPS_HIGH_WATERMARK_RATIO'] = '0.4'这个参数控制MPS占用的内存比例,设成0.4意味着最多用40%的内存,剩下留系统使用。
4.6 重启或换终端之后环境消失了
这个不是环境真的没了,而是你没有自动激活。你每次打开新终端都需要手动conda activate pytorch,习惯了就很自然,但新手容易以为自己没装好。如果你希望打开终端自动进入环境,可以改~/.zshrc,加上:
conda activate pytorch不过我不太建议这么干,因为之后切换项目会有点烦。
5. 让这个环境更顺手:换源、脚本和后续扩展
5.1 一键配置pip和conda镜像
我每次新装完miniforge都会做一件事:把pip和conda的默认源都换成国内镜像,免得之后每次装包都等半天。pip的配置在~/.pip/pip.conf,没有就新建:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cnconda的镜像配置在~/.condarc,可以用命令添加通道。改了之后重启终端,之后安装包的速度立竿见影。
5.2 快速重建环境:用environment.yml
如果你在几台Mac之间切换,或者想分享你的环境配置,推荐用conda env export导出环境文件:
conda activate pytorch conda env export > environment.yml换新电脑时,只要有了这个文件,直接:
conda env create -f environment.yml就能完整还原整个环境,包括Python版本和所有包,省去手动找版本的时间。这是我觉得conda比venv好用的地方,虽然平时用pip装包,但环境管理还是conda舒服。
5.3 后续可以安装的常用工具
装好PyTorch不代表万事大吉,深度学习还得有配套工具。我一般会在同一个环境里一并装:
pip install jupyter matplotlib pandas scikit-learn tensorboard尤其是tensorboard,训练模型可视化损失曲线非常有用。另外如果你用PyCharm,建议在Settings里把默认终端设置成conda的bash/zsh,这样每次打开终端就自动激活环境,省得手动切。
6. 从安装到实战:一个小例子验证整个环境
光会装不算本事,能跑通例子才算。我教大家一个最经典的MNIST手写数字识别验证流程,用PyTorch跑一个最小的训练循环,不会写模型也没关系,先跑起来感受一下环境是否正常。
import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms device = torch.device('mps' if torch.backends.mps.is_available() else 'cpu') transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_set = datasets.MNIST(root='./data', train=True, download=True, transform=transform) train_loader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True) model = nn.Sequential( nn.Flatten(), nn.Linear(784, 128), nn.ReLU(), nn.Linear(128, 10) ).to(device) optimizer = optim.Adam(model.parameters()) loss_fn = nn.CrossEntropyLoss() model.train() for epoch in range(1): for data, target in train_loader: data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = loss_fn(output, target) loss.backward() optimizer.step() print(f'Epoch {epoch}, Loss: {loss.item():.4f}')这段代码用MPS跑,MNIST下载会在当前目录下建一个data文件夹,依赖torchvision,所以你前面必须把torchvision也装上。如果运行结束后输出了loss,并且没有报错,说明整个环境从安装到MPS加速完全是通的。
我的个人体会是,很多时候环境问题比模型问题更折磨人,命令看着简单,但坑都在细节里。上面列出的那些问题,基本都是我几次重装教训之后总结下来的,你照着走一遍,至少能避开八成雷区。