简介
在部署 NLP 时,推理速度是一个关键因素,尤其是对于那些支持 LLM 的应用而言。随着苹果 M1 芯片等移动架构的日益增多,评估 LLM 在这些平台上的性能至关重要。在本文中,我比较了三种流行的 LLM 库(MLX、Llama.cpp 和 Candle Rust by Hugging Face)在苹果 M1 芯片上的推理/生成速度。目的是方便开发人员选择最合适的库,以便在本地机器上部署 LLM,同时考虑性能、实现的便利性以及与现有工具和框架的兼容性。为了测试推理速度,我使用了两种先进的 LLM 模型:微软的 Mistral-7B 和 Phi-2。
Llama.cpp
llama.cpp 的主要目的是在 MacBook 上使用 4 位整数量化运行 LLaMA 模型。除 Llama 外,该库还支持多种模型。以下是开始使用 Llama.cpp 的步骤
git clone https://github.com/ggerganov/llama.cppclone https://github.com/ggerganov/llama.cpp
cd llama.cpp
有多种构建方法可供选择,具体取决于你的需求(Metal 构建、MPI 构建等)。
make
Rust Candle
Candle 是 Rust 的简约 ML 框架,注重性能(包括 GPU 支持)和易用性。
第一步是在 Mac OS 系统上安装 Cargo。获取 Cargo 的最简单方法是使用 rustup 安装当前的 Rust 稳定版。使用 rustup 安装 Rust 也会安装 Cargo。
curl https://sh.rustup.rs -sSf | sh
它会下载一个脚本,然后开始安装。如果一切顺利,你会看到这个提示:
Rust is installed now. Great!is installed now. Great!
你还需要 git clone蜡烛库
git clone https://github.com/huggingface/candle.gitclone https://github.com/huggingface/candle.git
MLX
MLX 是在苹果芯片上进行机器学习的阵列框架。该框架旨在方便用户,但仍能高效地训练和部署模型。
MLX 在 PyPI 上提供。要安装 Python API,请运行
pip install mlx
最简单的入门方法是安装 mlx-lm 软件包。
pip install mlx-lm
你可以将 mlx-lm 作为模块使用。
from mlx_lm import load, generate
model, tokenizer = load("mistralai/Mistral-7B-v0.1")
response = generate(model, tokenizer, prompt="hello", verbose=True)
安装依赖项
pip install -r requirements.txttxt
运行
python generate.py \.py \
--repo <hugging_face_repo> \
--gguf <file.gguf> \
--prompt "Write a quicksort in Python"
例如,要使用 Mistral 7B 生成文本,请使用
python generate.py \.py \
--repo TheBloke/Mistral-7B-v0.1-GGUF \
--gguf mistral-7b-v0.1.Q8_0.gguf \
--prompt "Write a quicksort in Python"
实验方法
实验装置包括一台配备 M1 芯片和 16GB 统一内存的苹果 MacBook。
使用的格式
在本实验中,我将重点放在两个著名的 LLM 模型上: Mistral AI 的 Mistral-7B 和微软的 Phi-2。选择这两个模型的依据是它们在下游 NLP 任务中的表现,以及它们以不同格式与众多框架和库兼容这一事实。
具体来说,我对每种模型的以下配置进行了研究:
Mistral-7B
Q4 GGUF:GGUF 是一种文件格式,用于存储使用 GGML 进行推理的模型和基于 GGML 的执行器。GGUF 是一种二进制格式,旨在快速加载和保存模型,并便于阅读。模型传统上是用 PyTorch 或其他框架开发的,然后转换成 GGUF 格式供 GGML 使用。
Q4 GGUF:与 Mistral-7B 具有相同的结构,这种配置通过分组广义通用弗罗本尼乌斯规范正则化实现了量化感知训练,为 LLM 部署提供了高效而强大的解决方案。
4 位: 权重表示使用 4 位,而不是传统的 16 位,再次最大限度地减少了内存需求。
结果
Mistral-7B Q4 GGUF
在检查 Mistral-7B Q4 GGUF 的生成速度时,我发现 Llama.cpp 在竞争中占据优势,紧随其后的是 Candle Rust,最后是 MLX。
生成速度: Llama.cpp > Candle > MLX
非编码任务:
编码任务:
扩展实验: Phi-2
我本以为 MLX 是在苹果硅上运行 LLM 最理想/最快的。然而,这些令人震惊的结果促使我扩展实验,在这些库上尝试使用 Phi-2。就 Phi-2 而言,在所有平台上,该模型在编码和非编码任务上的生成速度差别很大。对于 Llama.cpp 和 candle,我使用了 phi-2 Q4 GGUF 格式。但在使用 mlx 时出现了一些问题。因此,我在 mlx 中使用了 4 位模型。
编码任务
非编码任务
提示评估速度
L
lama.cpp > MLX > 烛光
提示评估速度(编码和非编码任务的平均速度)可从上面提供的截图中观察到。
结论
据观察,在所有编码任务中,Phi-2 的生成速度总是低于非编码任务。但在 Mistral 或 Llama 模型中,生成速度在所有任务中都保持不变。我还不知道这种反常现象背后的原因。