有关如何在 Apple Silicon Mac 上安装优化的pytorch
和可选的 Apple 新MLX
和/或 Google 的tensorflow
或JAX
以及如何使用HuggingFace
大型语言模型进行自己的实验的指导。最近的 Mac 在机器学习任务方面表现出了良好的性能。
我们将执行以下步骤:
homebrew
pytorch
mlx
框架JAX
(目前处于实验阶段 (2024-07),并不总是最新的。)tensorflow
jupyter lab
来运行笔记本huggingface
并使用transformers
和 jupyter 实验室中的几行代码运行一些预先训练的语言模型。然后我们提供额外的操作指南:
(如果知道要使用哪个框架,请跳至1.准备工作)
Tensorflow、JAX、Pytorch 和 MLX 都是深度学习框架,它们提供了执行训练和推理中使用的优化张量运算所需的库。在高层次上,所有四个的功能是等效的。 Huggingface 构建在任何这些框架之上,并为许多不同的用例提供了一个大型的预训练模型库,可供使用或自定义,此外还提供了许多方便的库和示例代码,以便轻松入门。
jax-metal
驱动程序的开发并不总是与最新版本的JAX
保持同步。HuggingFace 发布了每个框架的模型支持概述。目前,如果您想利用现有模型,Pytorch 是事实上的标准。
对于“什么是最快的?”这个问题的答案(可能太简单了)查看 Jupyter Notebook 02-Benchmarks,安装完成后,您可以测试自己的环境。该笔记本允许比较不同框架的矩阵乘法的速度。然而,在执行“标准”模型训练或推理任务时,框架之间的差异很可能不太明显。
如果您还没有这样做,请访问 https://brew.sh/ 并按照说明安装 homebrew。完成后,打开终端并输入brew --version
以检查它是否安装正确。
现在使用brew
安装更新版本的python
和git
。如果您不打算使用带有 Metal 优化的 Tensorflow(仍需要 3.11(2024 年 4 月)),建议使用 Homebrew 的默认 Python 3.12。
brew install [email protected] git
brew install [email protected] git
您可以安装两个版本的 Python,然后使用每种情况所需的特定 Python 版本创建虚拟环境。
如果您还计划使用 Linux,请注意 Mac 和 Linux 版本的框架之间的 Python 版本支持有时会有所不同。
苹果并没有投入太多的精力来保持 MacOS 的 python 保持最新。如果你想使用最新的默认 python,那么将 homebrew 的 python 设置为默认系统 python 是有意义的。因此,如果您想在全局范围内使用 homebrew 的 Python 3.11 或 3.12 系统,最简单的方法是(在
brew install [email protected]
或3.11
之后):
编辑~/.zshrc
并插入:
# This is OPTIONAL and only required if you want to make homebrew's Python 3.12 as the global version:
export PATH= " /opt/homebrew/opt/[email protected]/bin: $PATH "
export PATH=/opt/homebrew/opt/[email protected]/libexec/bin: $PATH
当想要使homebrew的Python 3.11系统标准python时,将3.12
的所有引用更改为3.11
。
(重新启动终端以激活路径更改,或在当前终端会话中输入source ~/.zshrc
。)
无论使用什么系统 python,在创建虚拟环境时,您始终可以通过使用该 python 创建
venv
来选择要在venv
中使用的特定 python 版本。例如/usr/bin/python3 -m venv my_venv_name
使用 Apple 的 macOS python 创建虚拟环境(在撰写本文时,2024-07,仍停留在 3.9.6)。有关更多详细信息,请参阅下文虚拟环境。
现在克隆这个项目作为测试项目:
git clone https://github.com/domschl/HuggingFaceGuidedTourForMac
这会将测试项目克隆到目录HuggingFaceGuidedTourForMac
中
现在为此项目创建Python 3.12环境并激活它:
(再次:如果需要,请替换为3.11
)
python3.12 -m venv HuggingFaceGuidedTourForMac
创建 venv 会将虚拟 python 环境所需的文件(python 二进制文件、库、配置)添加到我们刚刚克隆的项目文件夹中,再次使用相同的目录HuggingFaceGuidedTourForMac
。进入目录并激活虚拟环境:
cd HuggingFaceGuidedTourForMac
source bin/activate
现在目录HuggingFaceGuidedTourForMac
包含 github 存储库的内容(例如00-SystemCheck.ipynb
)和虚拟环境的文件(例如bin
、 lib
etc
、 include
、 share
、 pyvenv.cfg
):
替代方案:如果安装了许多不同的 python 版本,您可以通过指定用于创建venv
的 python 路径来创建使用特定版本的环境,例如:
/opt/homebrew/opt/[email protected]/bin/python3.12 -m venv my_new_312_env
显式使用 homebrew 的 python 创建一个新的venv
,而
/usr/bin/python3 -m venv my_old_system_venv
将在新环境中使用 Apple 的 macOS python 版本。
要停用此虚拟环境,只需使用:
deactivate
要重新激活它,请输入包含venv
的目录,此处: HuggingFaceGuidedTourForMac
并使用:
source bin/activate
venv
的附加说明
venv
的一个非常不直观的属性是这样的事实:当您通过在项目的子目录中激活环境(使用source bin/activate
)来进入环境时,当您离开项目文件夹并开始处理完全不同的内容时,venv
保持活动状态,直到您可以使用deactivate
显式停用venv
。有许多工具可以修改终端系统提示符以显示当前活动的
venv
,这是非常有帮助的事情。查看 starship (推荐),或者,如果您喜欢点缀Oh My Zsh
。
安装了powerlevel10k
的示例。系统提示符的左侧显示当前目录,右侧将显示venv
的名称。目前,没有venv
处于活动状态。
在HuggingFaceGuidedTourForMac
中激活venv
后:
即使工作目录已更改(此处为home
),由于venv
仍然处于活动状态,因此它的名称会通过powerlevel10k
显示在右侧。非常方便。
有关 Python 虚拟环境的更多信息,请参阅 https://docs.python.org/3/tutorial/venv.html。
pytorch
使用pip -V
(大写 V)确保您的虚拟环境处于活动状态,这应该显示项目中pip
的路径:
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.12/site-packages/pip (python 3.12)
在https://pytorch.org
之后,我们将使用pip
安装 Pytorch。您至少需要 2.x 版本(自 2023 年起默认)才能在 pytorch 中获得 MPS(金属性能着色器)支持,这在 Apple Silicon 上提供了显着的性能优势。
将pytorch
安装到venv
中:
pip install -U torch numpy torchvision torchaudio
要测试pytorch
是否已正确安装以及 MPS Metal 性能着色器是否可用,请打开终端,输入python
并在 python shell 中输入:
import torch
# check if MPS is available:
torch . backends . mps . is_available ()
这应该返回True
。
MLX
pip install -U mlx
再次启动python
并输入:
import mlx . core as mx
print ( mx . __version__ )
这应该打印一个版本,例如0.16.1
(2024-07)
JAX
如果您的重点是算法的低级优化和超出既定深度学习算法边界的研究,那么 JAX 是一个绝佳的选择。它以numpy
为模型,支持“一切”的自动微分(针对优化问题),并支持 Python 算法的矢量化和并行化,而不仅仅是深度学习。要获得其他深度学习框架所期望的功能(层、训练循环函数和类似的“高级”),请考虑安装额外的神经网络库,例如: flax
。
不幸的是, JAX
metal 驱动程序已开始落后于 JAX 版本,因此您需要检查与可用jax-metal
驱动程序匹配的受支持JAX
版本的兼容性表。
要使用pip
将特定版本的JAX
和最新的jax-metal
安装到活动环境中:
# The version 0.4.26 is taken from the compatibility table mentioned above. Update as required.
pip install -U jax==0.4.26 jaxlib==0.4.26 jax-metal
启动python
(支持3.12)并输入:
import jax
print ( jax . devices ()[ 0 ])
这应该显示(仅在第一次运行时):
Platform 'METAL' is experimental and not all JAX functionality may be correctly supported!
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
W0000 00:00:1721975334.430133 43061 mps_client.cc:510] WARNING: JAX Apple GPU support is experimental and not all JAX functionality is correctly supported!
Metal device set to: Apple M2 Max
systemMemory: 32.00 GB
maxCacheSize: 10.67 GB
I0000 00:00:1721975334.446739 43061 service.cc:145] XLA service 0x60000031d100 initialized for platform METAL (this does not guarantee that XLA will be used). Devices:
I0000 00:00:1721975334.446771 43061 service.cc:153] StreamExecutor device (0): Metal, <undefined>
I0000 00:00:1721975334.448269 43061 mps_client.cc:406] Using Simple allocator.
I0000 00:00:1721975334.448308 43061 mps_client.cc:384] XLA backend will use up to 22906109952 bytes on device 0 for SimpleAllocator.
[METAL(id=0)]
这里METAL:0
是 JAX 将用于计算的设备,并且支持 Apple Silicon。
相反,如果您看到如下错误:
RuntimeError: Unable to initialize backend 'METAL': INVALID_ARGUMENT: Mismatched PJRT plugin PJRT API version (0.47) and framework PJRT API version 0.54). (you may need to uninstall the failing plugin package, or set JAX_PLATFORMS=cpu to skip this backend.)
您的jax
和jaxlib
版本与jax-metal
不兼容。检查jax-metal
的兼容性表并按照表中的指示安装所需的版本。
tensorflow
Tensorflow 正在快速失去支持,甚至 Google 也没有发布 Tensorflow 的新模型。如果您打算使用此功能,建议您制定迁移计划。
虽然 Tensorflow 从 2.16 开始支持 Python 3.12,但 macOS
tensorflow-metal
加速器自 2023 年 9 月(2024 年 7 月的状态)以来一直没有更新,并且需要 Python 3.11:
使用pip -V
(大写 V)确保您的虚拟环境处于活动状态,这应该显示项目中pip
的路径:
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.11/site-packages/pip (python 3.11)
在 https://developer.apple.com/metal/tensorflow-plugin/ 之后,我们将在venv
中使用pip
安装tensorflow
:
pip install -U tensorflow tensorflow-metal
要测试tensorflow
是否正确安装,请打开终端,输入python
并在 python shell 中输入:
import tensorflow as tf
tf . config . list_physical_devices ( 'GPU' )
您应该看到类似以下内容:
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
此时,您的 Apple Silicon Mac 应该已准备好使用 Apple Metal 框架运行pytorch
以及可选的MLX
和/或JAX
或具有硬件加速支持的tensorflow
。
要测试这一点,您可以使用jupyter lab
运行一些笔记本。要安装jupyter lab
,首先确保要使用的虚拟环境处于活动状态 ( pip -V
),然后输入:
pip install -U jupyterlab ipywidgets
如果您安装了其他 Jupyter 版本,
venv
中新安装的 jupyter 版本的路径通常无法正确更新,请重新激活环境以确保使用正确的本地 Jupyter 版本:
deactivate
source bin/activate
要启动 Jupyter 实验室,请输入:
jupyter lab
这应该会打开一个运行jupyter lab
的浏览器窗口。然后,您可以创建一个新的 python 笔记本并运行一些代码来测试tensorflow
和pytorch
是否正常工作:
import torch
print ( "Pytorch version:" , torch . __version__ )
如果成功完成,您的 Mac 现在就可以进行深度学习实验了。
HuggingFace 是 NLP 和深度学习实验的重要资源。它提供了大量预先训练的语言模型和一个简单的 API 来使用它们。它将使我们能够快速开始深度学习实验。
transformers
从huggingface安装说明来看,我们使用pip
来安装transformers
:
pip install -U transformers accelerate " huggingface_hub[cli] "
试验 HuggingFace 时,您将下载大型模型,这些模型将存储在您的主目录中:
~/.cache/huggingface/hub
。您可以随时通过删除此目录或其部分内容来删除这些模型。
accelerate
是可选的,但用于运行一些大型模型。安装accelerate
的副作用可能是降级其他一些模块,例如numpy
。"huggingface_hub[cli]"
安装 Huggingface 命令行工具,有时需要下载 Llama 3 等模型(部分专有许可)。 在目录HuggingFaceGuidedTourForMac
和活动venv
中,启动jupyter lab
并加载00-SystemCheck.ipynb
笔记本。笔记本将首先检查所有深度学习框架并提供信息,如果它们安装正确。随后使用Pytorch进行了简单的实验。
使用<Shift>-Enter
运行笔记本的单元格。
如果您在安装 Huggingface 之前启动了 Jupyter Lab,则需要在 Jupyter 中重新启动 python 内核,或者直接重新启动 Jupyter Lab,否则它将找不到 Transformers 库。
经过各种测试后,您最终应该看到如下内容:
如果您收到得分为0.99
的POSITIVE
标签分类,那么您就可以开始尝试 HuggingFace 了!
您将看到
HuggingFace
库正在下载各种包含经过训练的模型数据的大型二进制 blob。该数据存储在您的主目录中:~/.cache/huggingface/hub
。您可以随时通过删除此目录或其部分内容来删除这些模型。
您可以打开笔记本01-ChatBot.ipynb
在 Mac 上尝试一个非常简单的聊天机器人。
使用的python代码是:
import torch
from transformers import AutoModelForCausalLM , AutoTokenizer
from transformers . utils import logging
# Disable warnings about padding_side that cannot be rectified with current software:
logging . set_verbosity_error ()
model_names = [ "microsoft/DialoGPT-small" , "microsoft/DialoGPT-medium" , "microsoft/DialoGPT-large" ]
use_model_index = 1 # Change 0: small model, 1: medium, 2: large model (requires most resources!)
model_name = model_names [ use_model_index ]
tokenizer = AutoTokenizer . from_pretrained ( model_name ) # , padding_side='left')
model = AutoModelForCausalLM . from_pretrained ( model_name )
# The chat function: received a user input and chat-history and returns the model's reply and chat-history:
def reply ( input_text , history = None ):
# encode the new user input, add the eos_token and return a tensor in Pytorch
new_user_input_ids = tokenizer . encode ( input_text + tokenizer . eos_token , return_tensors = 'pt' )
# append the new user input tokens to the chat history
bot_input_ids = torch . cat ([ history , new_user_input_ids ], dim = - 1 ) if history is not None else new_user_input_ids
# generated a response while limiting the total chat history to 1000 tokens,
chat_history_ids = model . generate ( bot_input_ids , max_length = 1000 , pad_token_id = tokenizer . eos_token_id )
# pretty print last ouput tokens from bot
return tokenizer . decode ( chat_history_ids [:, bot_input_ids . shape [ - 1 ]:][ 0 ], skip_special_tokens = True ), chat_history_ids
history = None
while True :
input_text = input ( "> " )
if input_text in [ "" , "bye" , "quit" , "exit" ]:
break
reply_text , history_new = reply ( input_text , history )
history = history_new
if history . shape [ 1 ] > 80 :
old_shape = history . shape
history = history [:, - 80 :]
print ( f"History cut from { old_shape } to { history . shape } " )
# history_text = tokenizer.decode(history[0])
# print(f"Current history: {history_text}")
print ( f"D_GPT: { reply_text } " )
这显示了一个使用 Microsoft 的 DialoGPT 模型的(相当有限且重复的)聊天机器人。
值得尝试的事情:
0..2
之间更改use_model_index
,您可以选择小型、中型或大型语言模型。history_text
相关的行。~/.cache/huggingface/hub
。需要时会自动重新下载丢失的内容。 llama.cpp
项目,它实现了以高度优化的 C++ 代码运行 LLM 所需的推理代码,支持 Mac 的 Metal 加速。本段用于卸载本指南旧版本中使用的 conda:
brew uninstall miniconda
其他修改是(一旦删除 miniconda,所有修改均无效):
~/.condarc
(频道列表)和~/.conda
。~/.zshrc
(或.bashrc
)用于设置路径和环境。~/.cache/huggingface/hub
。只需删除该目录即可。 conda
切换到pip
和venv
,安装现在更加简单。pytorch
v2.0 现已发布,安装说明中的通道pytorch-nightly
现在可以替换为pytorch
。 MPS 支持不再需要pytorch-nightly
通道。