macOS上安装PyTorch:从虚拟环境到MPS加速的完整指南

macOS上安装PyTorch:从虚拟环境到MPS加速的完整指南 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 deactivatemacOS的终端默认是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装了torch2.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 python3.11 -y这里-y是自动确认依赖省得中途卡住。创建完成后激活conda activate pytorch激活之后终端前面会多一个(pytorch)前缀这就是进入虚拟环境了。如果你用的是zsh偶尔会碰到conda activate提示command not found多半是conda init没生效执行一下conda init zsh再重开终端就好。3. 安装PyTorchconda还是pip3.1 先看官方安装命令打开PyTorch官网选择macOS、你的芯片架构、安装方式它会直接给你一段命令。我以目前最新的稳定版本为例在Apple Silicon上用pip安装官方推荐命令是pip3 install torch torchvision torchaudio在macOS上pip默认会从PyPI下载Mac平台的CPU版本如果你用的是M系列芯片并且想启用MPS加速这个命令就够了因为PyTorch在Mac上只提供CPU和MPS两种编译没有单独的CUDA版本。注意Mac上不要想着装CUDANVIDIA的卡在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.0cpu这是正常的不用慌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_SUBDIRosx-arm64 conda create -n pytorch python3.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碰到这种情况就用devicecpu再试。二是内存管理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, trainTrue, downloadTrue, transformtransform) train_loader torch.utils.data.DataLoader(train_set, batch_size64, shuffleTrue) 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(fEpoch {epoch}, Loss: {loss.item():.4f})这段代码用MPS跑MNIST下载会在当前目录下建一个data文件夹依赖torchvision所以你前面必须把torchvision也装上。如果运行结束后输出了loss并且没有报错说明整个环境从安装到MPS加速完全是通的。我的个人体会是很多时候环境问题比模型问题更折磨人命令看着简单但坑都在细节里。上面列出的那些问题基本都是我几次重装教训之后总结下来的你照着走一遍至少能避开八成雷区。