使用 Apple 的 MLX 框架在 Apple Silicon 上部署运行大型语言模型 (Llama 3)
大型语言模型 (LLM),例如 Llama 3,正在改变人工智能的格局。随着深度学习的巨大进步,PyTorch 和 TensorFlow 等主要框架发挥了重要作用。这些框架促进了深度学习模型的实现,极大地推动了该领域的发展。最近,苹果宣布了一个新的机器学习框架,即苹果的 MLX。
作为 Mac 用户,利用 Apple 的 MLX 框架可以显著提高在 Apple 芯片上训练和部署这些模型的效率。本指南详细介绍了使用 MLX 框架运行 Llama 3 或任何其他 LLM 的必要步骤和注意事项。
硬件要求
您需要至少 8 GB 的 VRAM 才能完全按照本教程操作。但是,方法和库允许进一步优化。有关更多详细信息,请查看以下资源:
**免责声明:**虽然本教程使用的是Llama-3–8B-Instruct,但它适用于您从 Hugging Face 中选择的任何模型。
MLX 框架概述
MLX 受到 PyTorch、Jax 和 ArrayFire 的启发,是 Apple Machine Learning Research 专为 Apple 芯片设计的模型训练和服务框架。它支持一系列机器学习任务,包括大规模文本生成、图像生成和语音识别。该框架与 Hugging Face 集成,可实现模型的无缝加载和服务。
Apple 在你的笔记本电脑或数据中心进行机器学习研究
主要特征
- 熟悉的 API:MLX 提供了与 NumPy 紧密相关的 Python API,以及镜像 Python API 的功能齐全的 C++、C 和 Swift API。
- 可组合函数转换:支持自动微分、矢量化和计算图优化。
- 惰性计算:MLX 计算是惰性的,这意味着数组仅在需要时才实现,从而提高了效率。
- 动态图构建:计算图是动态构建的,避免了缓慢的编译并简化了调试。
- 多设备支持:可以在任何支持的设备(CPU 或 GPU)上执行操作,无需传输数据。
- 统一内存模型:MLX 使用统一内存模型,允许 CPU 和 GPU 共享相同的内存池,从而无需在它们之间传输数据,从而提高效率和性能。
限制
- Apple Silicon 独家:MLX 专为 Apple Silicon 设计,限制其使用于兼容硬件。
- 有限的社区支持:作为一个相对较新的框架,与更成熟的框架相比,MLX 的社区规模较小,资源较少。
- 优化挑战:虽然框架很高效,但要实现最佳性能可能需要进行大量调整以及对硬件和框架的深入了解。
安装
创建虚拟环境(推荐)
首先,为你的项目创建一个虚拟环境。如果你已经设置了一个虚拟环境,则此步骤是可选的。
- 导航到您的项目目录并创建虚拟环境:
python3 -m venv 环境名称
- 激活环境:
源环境名称\\bin\\activate
安装 MLX-LM
MLX 是一个独立包,还有一个名为 MLX-LM 的子包,其中集成了 Hugging Face,用于大型语言模型。
- 安装 MLX-LM
pip3 安装 mlx-lm
可选:安装 PyTorch(夜间版本)——抑制警告:
pip3 安装--pre torch--index-url <https://download.pytorch.org/whl/nightly/cpu>
下载模型
- 从 Hugging Face Hub 存储库下载模型
如果你想要量化模型(适用于 RAM 少于 16 的计算机):
python3 -m mlx_lm.convert --hf-path meta-llama/Meta-Llama-3-8B-Instruct -q
这会将模型保存在项目目录的 mlx_model 中。
否则:
python3 -m mlx_lm.generate --模型 meta-llama/Meta-Llama-3-8B-Instruct
- 测试模型
python3 -m mlx_lm.generate --model model_path --prompt "你好"
执行
要在应用程序中使用下载的模型,您可以使用 mlx-lm 提供的服务器实现。这将在http://localhost:8080上启动类似 OpenAI 的本地服务器。
端点: http://localhost:8080/v1/chat/completions
请求字段:
- messages:具有角色(例如用户、助手)和内容(消息文本)的消息对象数组。
- role_mapping:用于在提示中自定义角色前缀的可选字典。
- stop:生成应该停止的可选标记序列。
- max_tokens:可选整数,表示要生成的最大令牌数(默认值:100)。
- stream:可选布尔值,指示响应是否应该流式传输(默认值:false)。
- 温度:采样温度的可选浮点数(默认值:1.0)。
- top_p:核采样参数的可选浮点数(默认值:1.0)。
- repetition_penalty:可选浮点数,对重复的标记应用惩罚(默认值:1.0)。
- repetition_context_size:重复惩罚的上下文窗口的可选大小(默认值:20)。
- logit_bias:可选字典,将标记 ID 映射到其偏差值。
启动服务器
mlx_lm.server --model 模型路径
Python聊天机器人
服务器运行后,您可以向其发出 POST 请求。以下是使用 Python 创建的聊天机器人的示例:
导入请求
导入json
从键入导入 List,Dict
# 向服务器发送请求并获取响应的函数
def get_response (
server_url:str,
messages:List [ Dict [ str,str ]],
temperature:float = 0.7,
top_p:float = 0.9,
max_tokens:int = 4096,
stream:bool = True,
) -> str:
headers = { "Content-Type":"application/json" }
data = {
"messages":messages,
"temperature":temperature,
"top_p " :top_p,
"max_tokens":max_tokens,"
stream":stream, }
#
向服务器发送 POST 请求
response = request.post(
f" { server_url} /v1/chat/completions",headers=headers,data=json.dumps(data),stream=stream ,
) response.raise_for_status() # 确保请求成功if stream: content = "" for line in response.iter_lines(): if line: coded_line = line.decode( "utf-8" ).lstrip( "data: " ) try : json_line = json.loads(coded_line) if "choices" in json_line and len (json_line[ "choices" ]) > 0 : delta = json_line[ "choices" ][ 0 ].get( "delta" , {}) content_piece = delta.get( "content" , "" ) content += content_piece print (content_piece, end= "" , flush= True ) except json.JSONDecodeError:继续打印()
# 确保下一个提示从新行开始
return content
else :
result = response.json()
if "choices" in result and len (result[ "choices" ]) > 0 :
return result[ "choices" ][ 0 ][ "message" ][ "content" ]
else :
return ""
# 运行聊天机器人的函数
def chatbot (
server_url: str ,
system_instructions: str = "" ,
temperature: float = 0.7 ,
top_p: float = 0.9 ,
max_tokens: int = 4096 ,
stream: bool = True ,
):
messages = [{ "role" : "system" , "content" : system_instructions}]
while True :
prompt = input ( "User: " )
if prompt.lower() in [ "exit" , "quit" ]:
break
messages.append({ "role" : "user" , "content" :提示})
打印(“助手:”,结束= “”)
响应= get_response(
server_url,消息,温度,top_p,max_tokens,流
)
消息。附加({ “角色”:“助手”,“内容”:响应})
如果__name__ == “__main__”:
server_url = “http://localhost:8080”
聊天机器人(server_url = server_url)
结论
server_url,消息,温度,top_p,max_tokens,流
)
消息。附加({ “角色”:“助手”,“内容”:响应})
如果__name__ == “__main__”:
server_url = “http://localhost:8080”
聊天机器人(server_url = server_url)
结论
MLX 框架为在 Apple 芯片上运行大型语言模型提供了强大而高效的解决方案。其用户友好的设计受到 NumPy 和 PyTorch 等框架的启发,让研究人员和开发人员可以轻松使用它。尽管存在局限性,但 MLX 的大规模模型训练和推理能力使其成为机器学习领域的宝贵工具。
博客原文:专业人工智能技术社区