
先别急着复制安装命令。这个问题我在 Mac 上翻车过不止一次明明照着别人的教程一步步把 PyTorch 装进了虚拟环境结果 Python 还是调不到新装的包或者 conda 正确激活了环境一执行 import torch 却报出一堆版本混乱的二进制错误。后来我把整个过程拆开才发现安装 PyTorch 这事本身不难难的是“装进哪个环境”和“给哪块芯片装”。今天这篇就把我在 Mac 上从创建虚拟环境到最终验证 MPS 的全部流程写清楚适合想在 macOS 上搭建 PyTorch 开发环境、又不想把系统 Python 搅乱的读者。1. 先确认 Mac 的芯片架构再谈安装方案很多人打开终端第一件事就是去 PyTorch 官网复制命令然后开始安装。如果运气好一条命令能跑通如果运气不好装完才发现自己装的是 Intel 版 PyTorch或者环境里根本没有可用的 GPU 后端。从实操角度看PyTorch 在 Mac 上能不能用、用什么姿势用完全取决于你的硬件架构。1.1 用两条命令看清 CPU 类型和终端架构在终端里执行下面两条命令uname -m sysctl -n machdep.cpu.brand_stringuname -m会告诉你当前终端运行时的 CPU 架构。Apple Silicon 芯片上的原生终端通常输出arm64Intel Mac 输出x86_64。第二条命令用来查看真实 CPU 型号比如会显示Apple M1 Pro、Apple M2 Max或Intel(R) Core(TM) i7-9750H CPU 2.60GHz。这里有一个容易忽视的场景在 Apple Silicon Mac 上通过 Rosetta 方式打开的终端uname -m也可能输出x86_64因为当前 Shell 进程确实是以 Intel 模式运行的。单独看这一条容易做出错误判断所以两条命令要配合使用。若品牌字符串里明确写着 Apple 芯片但uname -m还是x86_64说明你的 iTerm2、Terminal 或 VS Code 终端当前处于 x86_64 翻译模式后续安装容易装成 Intel 版依赖迟早出问题。1.2 芯片差异决定了你用 CPU、MPS 还是 CUDAPyTorch 在 macOS 上不支持训练常见的 CUDA GPU因为 Mac 早已不使用 NVIDIA 显卡官方也没有为 macOS 提供 CUDA 支持。你在网上搜到的torch.cuda.is_available()、pip install torch1.8.0cu111这类操作基本都是针对 Linux 或 Windows 的抄到 Mac 上不仅没用还可能触发大量依赖冲突。真正相关的是两个词CPU 和 MPS。Apple Silicon 芯片的 Mac 可以利用 GPU 跑 PyTorch官方后端叫 MPSMetal Performance ShadersPyTorch 1.12 开始支持2.x 版本已经相对成熟。大多数 Intel Mac 在运行 PyTorch 时只能依赖 CPU虽然 MPS 在某些带 AMD 独显的机器上也能尝试启用但官方推荐度和稳定性都不如 Apple Silicon。实测中Intel 集成显卡机器基本会得到MPS not available的结果。下载安装包时PyPI 会自动根据当前 Python 解释器和系统架构下载对应的 wheel但前提是你的终端架构和 conda 环境架构一致否则选错的概率会显著上升。所以安装前确认架构的真正目的不是要背一堆参数而是防止终端架构、conda 架构、Python 解释器架构三者互相对不上。互相对不上时错误会发生在安装完成之后解决成本比一开始多花两分钟要高得多。2. Mac 上管理 Python 虚拟环境的逻辑为什么我默认用 conda标题里说的“虚拟环境”在 Python 生态里有几种常见实现。最轻量的是 Python 自带的venv缺点是它不负责帮你管理 Python 版本另一种是 conda它既能创建虚拟环境也能在环境内安装指定版本的 Python还能管理 numpy、mkl 这类带二进制编译的底层包。对于安装 PyTorch 这种依赖链复杂的框架我通常优先推荐 conda。2.1 venv 和 conda 分别解决什么问题用一张表来说明区别会更直观对比项python -m venvcondaPython 版本管理不能只能使用当前系统解释器可以环境内直接指定 python3.9/3.10/3.11依赖隔离是site-packages 隔离是环境完全隔离二进制包管理交给 pippip 自己决定有自己的包解析和依赖管理上手成本低系统自带需要额外安装 conda适合场景纯 Python 项目追求简单需要多版本 Python、深度学习框架等重依赖场景macOS 系统自带的是/usr/bin/python3这个解释器由系统管理一般不建议往里面乱装包。直接用python3 -m venv test_env创建的虚拟环境底层解释器还是系统 Python。这本身没问题可如果你想换 Python 3.8 或 3.11 跑某个兼容性要求高的历史版本 PyTorchvenv 就满足不了你得先想办法让系统里同时存在多个 Python 版本。conda 在这类场景更顺手的核心原因是它把“编译器、Python 解释器、第三方库”放在同一个隔离目录里统筹。PyTorch 的 wheel 安装包动辄几百 MB还依赖一堆底层库conda 的解析器会帮你检查依赖冲突至少不会在你毫无防备的情况下破坏 base 环境。2.2 Apple Silicon Mac 上安装 MinicondaAnaconda 能做的事Miniconda 几乎都能做区别只是 Anaconda 默认附带了几百个科学计算包装完要占不少磁盘空间对大多数人来说属于浪费。建议安装 Miniconda体积小环境干净。如果你走官方安装包路线从 Miniconda 官网下载对应芯片架构的.pkg或.sh安装包。Apple Silicon 选择文件名中带MacOSX-arm64的版本Intel Mac 选择MacOSX-x86_64。如果你习惯用 Homebrew也可以执行brew install --cask miniconda安装完成后执行conda init zsh然后新开一个终端窗口确认命令是否生效conda --version如果终端提示command not found: conda大概率是安装脚本没有成功写入 shell 初始化配置或者你用的不是默认 shell。先看一下自己的 shell 是 zsh 还是 bash重新执行conda init zsh或conda init bash再试。这里的要点是不要靠手动编辑 PATH 的方式强行启动 condaconda init会把 conda 的初始化函数写进.zshrc后面conda activate才能正常工作。2.3 创建 PyTorch 专用环境的完整命令创建虚拟环境的命令其实很短conda create -n pytorch-env python3.10 -y-n pytorch-env是环境名你可以取名pytorch、dl、ml都行只要自己记得清楚。python3.10的意思是让 conda 在这个新环境里安装一个独立的 Python 3.10 解释器不依赖系统 Python。PyTorch 官方对 Python 3.13 的支持往往滞后所以我在 Mac 上创建环境时更偏好 3.10 或 3.11兼容性最稳妥。创建时 conda 会去下载 Python 解释器自身和基础依赖如果网络状况不好可能会卡在Solving environment或下载阶段。遇到这种情况不用急着关闭终端conda 的依赖解析偶尔需要一小段时间。如果持续很久没有进展再考虑更换 conda 的下载源这个在后续章节会展开。3. 激活环境后先做三连确认不要急着装 torch很多人创建完环境后看一眼终端提示符前面多了一个(pytorch-env)就以为万事大吉然后直接pip install torch。真正可靠的流程是激活之后先确认三件事当前 Python 是哪个路径、当前 pip 属于哪个环境、conda 当前平台到底是不是 arm64。3.1 确认 Python 路径和 pip 归属激活环境conda activate pytorch-env然后执行which python which pip python -V python -m pip --version正常情况下which python输出的路径应该指向你的 conda 环境目录而不是/usr/bin/python3或/usr/local/bin/python3。例如/opt/homebrew/Caskroom/miniconda/base/envs/pytorch-env/bin/python这里真正需要养成习惯的是最后一条用python -m pip而不是直接写pip。因为在某些系统 PATH 配置混乱的情况下pip可能指的是另一个环境里的可执行文件而python -m pip一定会在当前 Python 解释器的环境里找 pip不会装错地方。我在 Mac 上见过太多次“以为装进了虚拟环境实际装到了 Homebrew 的 Python”的问题根源就是把pip当成一个独立命令在用。3.2 平台不一致Apple Silicon 里混进 x86_64 环境这是 Apple Silicon 用户比较容易踩的暗坑。如果你用的是当年在 Intel Mac 上安装的 conda后来直接把整个系统迁移到新 Mac那么 conda 可能还停留在 x86_64 平台。此时虽然uname -m显示arm64但 conda 的平台标识仍是osx-64。检查方式conda info | grep -E platform|subdir如果输出platform : osx-64而你用的是 Apple Silicon 芯片说明 conda 在通过 Rosetta 方式运行。你会遇到一个很诡异的现象创建的虚拟环境都能正常运行pip 安装 torch 也能成功但训练速度上不去且torch.backends.mps.is_available()一直为 False因为所有包都被解析成了 x86_64 版本。解决办法不是硬给当前 conda 指定 subdir 参数而是重新安装 arm64 版 Miniconda然后重新创建虚拟环境。Intel 版的 conda 在 Apple Silicon 上即便能跑后续也会在混合依赖上反复踩坑。不要贪图省事底子要是错的上层怎么调都别扭。3.3 venv 用户也要知道对应的确认方式有些读者不习惯 conda坚持用 Python 自带的 venv这也完全可以。创建虚拟环境的命令是python3 -m venv ~/pytorch-venv source ~/pytorch-venv/bin/activate激活后的确认动作和 conda 一样就是检查which python确保路径指向~/pytorch-venv/bin/python。区别仅在于 venv 不会为你安装独立 Python 解释器如果你手里的系统 Python 版本本身不满足 PyTorch 要求那 venv 这条路就走不通只能回到 conda 或 pyenv 这类工具去管理 Python 版本。4. 安装 PyTorch 的实战命令官网抄作业也要知道每条命令在干嘛环境准备好之后才是真正安装 PyTorch 的环节。Mac 上的安装命令比 Linux 简单很多因为不需要在 CPU 版和 GPU 版之间做选择题。4.1 macOS 官方推荐的安装方式打开 PyTorch 官网的 Get Started 页面选择 Stable、Mac、Pip得到的安装命令通常长这样pip3 install torch torchvision torchaudio在虚拟环境里我更建议写成python -m pip install torch torchvision torchaudio这条命令会从 PyPI 下载当前平台对应的 PyTorch 核心库、torchvision视觉工具库和 torchaudio音频工具库。官方 macOS 的 wheel 已经默认包含了 CPU 支持和 MPS 相关代码不需要额外指定--index-url也不需要去安装 CUDA 版本的命令。尽量一次性安装这三个包而不是分别安装。PyTorch 核心、torchvision、torchaudio 之间存在严格的版本对应关系比如 torch 2.2.2 对应 torchvision 0.17.2 和 torchaudio 2.1.2。分开安装时如果不小心指定了冲突版本import 阶段就可能报错。如果你需要装历史版本可以先用官方版本对应表查清楚再执行类似命令python -m pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2Mac 上尽量不要用高于当前 PyTorch 官方支持的 Python 版本来硬装否则 pip 大概率会提示找不到匹配的 wheel。4.2 下载慢、卡住时的处理思路PyTorch 安装包通常有 150MB 以上在某些网络环境下下载速度会非常难看。热搜词里还有人在问“手机开了热点下载速度还是很慢怎么办”我也遇到过基本的心得是先判断是网络问题还是包解析问题再做针对性处理。如果是 pip 阶段从 PyPI 下载慢可以考虑临时切换到国内 PyPI 镜像python -m pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple如果希望长期生效可以配置一次python -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple之后 pip 默认走镜像源。需要注意的是这种越狱方式其实是正规镜像不会影响包的完整性。对于 conda 本身下载慢可以在~/.condarc里配置 Anaconda 镜像或者把创建环境这一步换成直接从 conda-forge 下载依赖。另外一个容易让人误判的点是pip 下载大包时终端可能长时间没有进度输出看起来像卡住了。不要急着按 CtrlC先看当前网络流量或者耐心等待。如果反复重试没有改善可以加上超时时间python -m pip install --timeout 60 torch torchvision torchaudio真正的坑是“为了不等待下载了别人传的离线包”。如果你非要用离线包也要认准macosx_*_arm64或macosx_*_x86_64标识并且版本要和你创建虚拟环境时指定的 Python 版本完全对应。这里我不建议普通用户折腾离线包因为 macOS 的 wheel 标识比 Windows 复杂下错一个标记安装时能过运行时很容易崩。4.3 conda install 和 pip 到底选谁PyTorch 官网同时提供 conda 安装命令Mac 用户也可以执行conda install pytorch::pytorch torchvision torchaudio -c pytorch但从我自己的使用体验看Mac 上的 PyTorch 官方更推荐 pip 方式原因有两个一是 pip 的 macOS wheel 发布及时版本追赶快二是 conda 安装 PyTorch 时可能会顺便把环境里的 numpy、mkl 等包做大规模升级有时还会把 Python 解释器版本悄悄变更对新手来说不太好控制。如果你在同一个虚拟环境里混用 conda 和 pip一个常见现象是先用 conda 装了 torch再用 pip 装其他库pip 提示“某个依赖与 torch 冲突”然后自动把 torch 卸载或升级到一个不兼容版本。我的建议是在这个环境里创建环境用 conda安装 PyTorch 用 pip后续安装依赖也统一用python -m pip不要 conda 和 pip 交替使用。5. 验证安装不要拿 cuda.is_available 当唯一指标安装命令跑完后我见过不少人的第一反应是执行python -c import torch; print(torch.cuda.is_available())发现输出 False就开始怀疑人生。这个习惯在 Mac 上真的可以改改了因为 macOS 本就不走 CUDA 路线。5.1 Mac 的正确验证姿势是检查 MPS在虚拟环境中执行python - PY import torch print(torch.__version__) print(torch.backends.mps.is_built()) print(torch.backends.mps.is_available()) PY输出里第一个是 PyTorch 版本号第二个表示当前安装的 PyTorch 是否编译了 MPS 后端第三个表示当前系统环境是否真正可用 MPS。对 Apple Silicon 用户来说理想结果应该是2.x.x、True、True。如果is_built()是 False说明你装的是纯 CPU 版本或者安装包的来源不对需要重新检查和芯片架构匹配的 wheel。如果is_built()是 True 但is_available()是 False一种可能是你的 macOS 版本低于支持 MPS 的版本另一种可能是 Intel Mac 或终端架构处于 x86_64 翻译模式。不要在 Mac 上追求torch.cuda.is_available()返回 True那条路对 macOS 用户来说本来就是死胡同。想确认有没有 GPU 加速能力只需要关注 MPS 的两个布尔值。5.2 第一段跑在 MPS 上的代码为了验证 PyTorch 真的能调用 GPU可以执行一段极简单例import torch device torch.device(mps if torch.backends.mps.is_available() else cpu) x torch.randn(3, 3).to(device) y torch.randn(3, 3).to(device) z x y print(z) print(fdevice: {device})如果能正常输出矩阵结果和device: mps说明 PyTorch 已经在通过 Metal 后端调用 GPU 资源。首次执行时速度可能偏慢因为 MPS 后端会有一些初始化工作这属于正常现象。若你在代码里用了某个 MPS 尚未实现的算子PyTorch 会打印类似“not implemented for MPS”的警告此时需要把该张量先转回 CPU再执行相关计算。日常训练时常见的迁移方式是model model.to(device) data data.to(device)和 CUDA 的写法几乎一样只是设备名称从cuda换成了mps。这也意味着你在网上看到的 CUDA 训练代码如果只把cuda改成mps大部分情况下是可以直接跑起来的。5.3 跑一个比 CPU 快一点的效果对比很多刚接触 MPS 的人会好奇它到底比 CPU 快多少安装成功后可以做个小验证执行