Mac M1芯片深度学习环境搭建:从零到一的实战避坑与效率优化

最近几年,身边用MacBook Pro M1/M2系列芯片的朋友越来越多了。大家从Intel芯片换过来,最头疼的往往不是日常办公,而是开发环境的搭建,尤其是深度学习这块。PyTorch和Hugging Face Transformers几乎是当下AI项目的标配,但在Apple Silicon上,安装过程时不时就会给你来个“惊喜”——比如卡在某个依赖上,或者编译报错让人一头雾水。

这篇文章,就是为你准备的。我们不只解决“怎么装上去”的问题,更想聊聊背后的原因,以及如何搭建一个干净、高效、易于维护的深度学习环境。无论你是刚拿到新机器的学生,还是需要在M1上复现实验的研究者,下面的内容都能帮你少走弯路。

1. 理解M1芯片环境的核心差异:不仅仅是ARM

在Intel Mac上,很多软件包都有预编译的x86_64版本,pip install通常很顺利。但M1/M2芯片采用的是ARM架构(具体是ARMv8.4-A),这带来了根本性的变化。

首先,你需要明确两种运行模式:

  • 原生模式 (ARM64):软件为ARM架构编译,直接在M1芯片上运行,性能最佳,能效比最高。
  • 转译模式 (Rosetta 2):软件为Intel架构编译,通过Rosetta 2动态二进制转译在M1上运行。这会有性能损耗(通常10%-20%),并且可能遇到兼容性问题。

我们的目标很明确:让PyTorch、Transformers及其关键依赖(如Tokenizers)都以原生ARM64模式运行。这不仅是追求速度,更是为了稳定性。很多奇怪的报错,根源就在于混合架构下的兼容性冲突。

提示:你可以打开“终端”(Terminal),输入 arch 命令。如果返回 arm64,说明终端正在原生模式下运行。如果返回 i386,则说明它正通过Rosetta 2运行。为了一致性,建议所有开发都在原生arm64终端中进行。

那么,第一个关键决策来了:包管理工具选哪个?pip 还是 conda

对于M1环境,我强烈推荐使用 conda,特别是 miniforgemambaforge 发行版。原因如下表所示:

特性原生 pip (venv)Miniforge (Conda)说明
架构支持主要依赖上游仓库专为ARM64优化Miniforge由Conda-Forge社区维护,提供了大量预编译的ARM64原生包。
依赖解决相对基础极其强大Conda能同时管理Python包和非Python依赖(如编译器、系统库),避免“DLL Hell”。
环境隔离良好优秀Conda环境是彻底隔离的,包括Python解释器本身,非常适合管理多个项目不同版本的需求。
安装速度快(如果轮子存在)快(预编译轮子)两者在预编译包的情况下都很快,但Conda在解决复杂依赖时更稳健。

简单说,conda(尤其是conda-forge频道)为你屏蔽了大量底层架构的复杂性。接下来,我们就从安装conda开始。

2. 基石搭建:安装Miniforge与创建专属环境

别再用Anaconda官方的Intel版本了。我们直接从Miniforge开始。

步骤1:下载并安装Miniforge 打开原生的ARM64终端(确保arch命令输出arm64),执行以下命令下载安装脚本并运行:

# 下载Miniforge3安装脚本(通常选择最新版)
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh"

# 运行安装脚本
bash Miniforge3-MacOSX-arm64.sh

安装过程中,按照提示操作即可。建议将Conda初始化到你的shell(如zsh)中,这样每次打开终端环境都会自动激活。

安装完成后,关闭并重新打开终端,输入 conda --version 验证安装。同时,用 conda info 命令检查,你应该能看到 platform : osx-arm64,这确认了你的Conda是原生ARM64版本。

步骤2:为PyTorch项目创建独立环境 永远不要在base环境里直接安装项目依赖。创建一个独立的环境是专业开发的第一步。

# 创建一个名为‘pt_transformers’的新环境,并指定Python版本(推荐3.9或3.10)
conda create -n pt_transformers python=3.10 -y

# 激活环境
conda activate pt_transformers

现在,你的命令行提示符前应该会出现 (pt_transformers),表示你正在这个独立的环境中工作。所有后续的安装操作都请确保在此环境下进行。

3. 安装PyTorch:获取原生ARM64版本的正确姿势

这是最关键的一步。PyTorch官方从v1.12开始就提供了对Apple Silicon GPU(MPS后端)的稳定支持。我们必须从官方渠道获取正确的安装命令。

不要直接使用 pip install torch 这很可能会下载到转译的x86版本。

正确的方法是访问 PyTorch官网,在配置选择器中进行如下选择:

  • PyTorch Build: Stable (1.13.1)
  • Your OS: Mac
  • Package: Conda (或者Pip也可以,但Conda更省心)
  • Language: Python
  • Compute Platform: MPS (这代表Metal Performance Shaders,即Apple Silicon GPU支持)

选择后,网站会给出对应的安装命令。以Conda为例,命令通常类似于:

conda install pytorch torchvision torchaudio -c pytorch

但请注意,为了确保所有依赖都来自兼容性最好的conda-forge,我通常采用以下“混合”命令,它优先从conda-forge获取依赖,核心包从PyTorch官方频道获取:

conda install pytorch torchvision torchaudio -c pytorch -c conda-forge

安装完成后,进行验证。创建一个Python交互窗口来测试PyTorch是否正常工作,并且是否支持MPS后端:

import torch
print(f"PyTorch版本: {torch.__version__}")
print(f"是否可用MPS (Apple Silicon GPU): {torch.backends.mps.is_available()}")
print(f"当前设备: {torch.device('mps')}")

如果一切顺利,你会看到MPS可用,并且设备显示为mps。这意味着你的PyTorch已经成功以原生ARM64模式安装,并且可以调用GPU进行加速。

4. 攻克核心难点:Transformers与Tokenizers的顺畅安装

现在来到最容易出问题的环节。transformers库本身不复杂,但它重度依赖 tokenizers 这个库,而 tokenizers 是一个用 Rust 编写的高性能组件。在安装时,pip 会尝试从源码编译 tokenizers,这就需要本机有可用的Rust编译工具链。如果缺少,就会报出令人困惑的错误。

解决方案不是绕过,而是正面解决:安装Rust。

同样,我们需要ARM64原生的Rust。最推荐的方式是使用 rustup 这个Rust版本管理工具。

在你的 pt_transformers Conda环境下,执行:

# 下载并安装rustup
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安装过程中,选择默认选项(1)即可。安装完成后,按照提示执行source命令或重启终端,以使Cargo(Rust的包管理器)和Rust编译器生效。

验证Rust安装:

rustc --version
cargo --version

有了Rust之后,安装 tokenizerstransformers 就变得轻而易举。我们继续使用 conda-forge 频道,因为它提供了预编译好的包,无需再从源码编译,速度更快也更稳定。

# 安装tokenizers和transformers
conda install tokenizers transformers -c conda-forge -y

如果你想安装Hugging Face生态的其他工具,比如 datasets 库,也可以一并安装,它依赖 pyarrow

conda install pyarrow datasets -c conda-forge -y

至此,核心环境已经搭建完毕。让我们进行一个经典的“情感分析”测试,来验证整个流水线是否通畅:

from transformers import pipeline

# 创建一个情感分析管道
classifier = pipeline('sentiment-analysis')

# 分析一句话
result = classifier("I'm really impressed with how smooth the setup process is now!")
print(result)

如果输出类似 [{'label': 'POSITIVE', 'score': 0.9998...}],那么恭喜你,从PyTorch到Transformers的整个环境已经完美运行在M1芯片之上了。

5. 进阶配置与效能调优

环境能跑起来只是第一步,如何让它跑得更快、更稳,才是体现经验的地方。

利用MPS GPU加速 在PyTorch代码中,记得将你的模型和数据显式地移动到MPS设备上,才能享受GPU加速。

import torch
from transformers import AutoModelForSequenceClassification

device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased").to(device)

# 你的数据也需要移动到device上
# input_ids = input_ids.to(device)
# attention_mask = attention_mask.to(device)

管理环境与依赖 随着项目进行,你可能会安装更多包。建议定期使用 conda list 查看环境中的包,并使用 conda env export > environment.yml 导出环境的精确配置。这样可以在其他机器上通过 conda env create -f environment.yml 一键复现完全相同环境。

遇到编译问题怎么办? 如果未来某个包需要从源码编译,确保你的环境中安装了基础编译工具:

conda install clang_osx-arm64 clangxx_osx-arm64 -c conda-forge -y

这个命令会安装ARM64版本的原生Clang编译器,避免使用系统自带的Xcode工具链可能带来的架构混淆。

最后,分享一个我自己的习惯:我会为不同类型的项目创建不同的Conda环境,比如 nlp_ptcv_ptstable_diffusion 等。环境名尽量见名知义,并且每个环境的environment.yml文件都会保存在项目根目录。这样,即使半年后回过头来看这个项目,也能在几分钟内完全恢复当时的开发环境,避免“在我机器上是好的”这类问题。M1芯片的强大性能值得一个同样清晰、健壮的环境来匹配,花一点时间做好这些基础设置,后续的开发效率会成倍提升。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐