使用 Apple 的 MLX 框架在 Apple Silicon 上部署运行大型语言模型 (Llama 3)

使用 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 的社区规模较小,资源较少。
  • 优化挑战:虽然框架很高效,但要实现最佳性能可能需要进行大量调整以及对硬件和框架的深入了解。

安装

创建虚拟环境(推荐)

首先,为你的项目创建一个虚拟环境。如果你已经设置了一个虚拟环境,则此步骤是可选的。

  1. 导航到您的项目目录并创建虚拟环境:
python3 -m venv 环境名称
  1. 激活环境:
源环境名称\\bin\\activate

安装 MLX-LM

MLX 是一个独立包,还有一个名为 MLX-LM 的子包,其中集成了 Hugging Face,用于大型语言模型。

  1. 安装 MLX-LM
pip3 安装 mlx-lm

可选:安装 PyTorch(夜间版本)——抑制警告:

pip3 安装--pre torch--index-url <https://download.pytorch.org/whl/nightly/cpu>

下载模型

  1. 从 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
  1. 测试模型
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 的大规模模型训练和推理能力使其成为机器学习领域的宝贵工具。

博客原文:专业人工智能技术社区

<think>好的,用户询问的是关于Apple MLX的技术资料。我需要先回忆一下现有的引用内容,看看有哪些相关资料可以提供。 首先,引用[1]提到MLXApple Silicon芯片上的基准测试,包括与CUDA GPU的比较,这可能涉及到性能方面的资料。引用[2]同样讨论了MLX的速度,并比较了PyTorch MPS和CUDA GPU,这可能说明有关于MLX在不同硬件上的性能数据。引用[3]提到使用MLXApple Silicon部署大型语言模型Llama 3,这可能涉及MLX的应用案例。引用[4]则提到MLX与PyTorch的结合使用,以及在MacOS上的高效机器学习实践,这可能涉及MLX与其他框架的整合和实际应用场景。 用户需要的是技术资料,所以应该提供这些引用中提到的核心内容,比如性能基准、框架特点、应用场景和部署方法。同时,用户可能希望了解如何获取官方文档或相关资源,但引用中没有提供链接,所以可能需要建议他们访问Apple的官方资源或GitHub仓库。此外,生成相关问题时需要考虑用户可能的后续需求,比如优化方法、与其他框架的比较、实际案例等。 需要确保回答结构清晰,分点列出,并且每个点都引用对应的引用来源。同时,相关问题的生成要覆盖MLX的技术特点、性能、应用和与其他技术的比较,这样用户可以有更全面的了解。</think>### Apple MLX 技术资料解析 AppleMLX 是专为 Apple Silicon 优化的机器学习框架,其核心设计目标是高效利用苹果硬件(如 M1/M2/M3 系列芯片)的 GPU 和神经网络引擎。以下是关键资料整理: 1. **性能基准测试** MLXApple Silicon 芯片(如 M1 Max、M2 Ultra)上的计算性能表现优异,尤其在矩阵运算、Transformer 模型推理等场景中,速度接近或超过部分 CUDA GPU(如 RTX 4090)[^1][^2]。例如,在 Llama 3大型语言模型部署中,MLX 结合统一内存架构,减少了数据传输延迟,提升了端侧模型的运行效率[^3]。 2. **框架特性** - **统一内存管理**:数据在 CPU/GPU 间无需显式拷贝,简化了开发流程[^4]。 - **与 PyTorch 兼容**:支持与 PyTorch 协同工作,开发者可结合两者的优势(如 PyTorch 的灵活性和 MLX 的硬件优化)。 - **动态计算图**:类似 PyTorch 的即时执行模式,便于调试和动态模型构建[^3]。 3. **应用场景** - **端侧大模型部署**:如 Llama 3 等模型在 Mac 设备上的本地化运行。 - **高效微调**:通过 MLX 的优化计算层(如 Flash Attention),支持在消费级 Mac 上微调模型。 4. **资源与工具** - **官方文档**:Apple 提供了 MLX 的 API 说明和示例代码(需访问 Apple 开发者平台)。 - **开源社区**:GitHub 上有多个项目展示了 MLX 在图像生成、语音识别等任务中的应用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值