重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

原创 喵懂AI  2024年11月14日 11:28 北京

万万没想到上期随手写的《  》阅读量爆炸(相对与我这个不起眼的新人号而言),评论区也引发了大家的激烈讨论。

有不少朋友留言希望我实验更多M4 Max大模型训练微调玩文生图之类的场景,这些我都一一记下啦。

我会尽量满足大家的测试要求,然后发出来分享一下,不过个人精力和时间有限,所以请大家耐心等待~

由于我自己用纯语言大模型多一些,因此这两天又深入研究了下MAC上跑LLM的黑科技。

然后喜出望外地发现在推理速度上还有很大的提升空间,而这个奇技淫巧就是:MLX + LM Studio

话不多说,听我立马道来(时间宝贵的朋友也可以直接拉到最后两节实操和结论,另外还有LM Studio模型下载加速的干货哟)。

MLX简介

MLX[1]是Apple官方出品的一个科学计算框架,下面是官方的介绍:

www.zeeklog.com  - 重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

MLX

作为专门为苹果系列芯片设计的科学计算框架,设计灵感来自NumPyPyTorchJaxArrayFire等框架。

目的是设计一个对用户极其友好,但同时在训练和部署上也非常高效的框架,最重要的是更好地充分利用苹果统一内存的M芯片

所以,它的接口你会非常熟悉,因为它的Python接口与NumPy很相似,而它的神经网络模型的接口和PyTorch非常类似

所以如果此前你使用Python编写相关模型代码,几乎是没有障碍的使用和切换。

更多的细节我就不啰嗦了,感兴趣的朋友可以出去看官方网站的信息。

MLX Community

目前主流的大模型加载和部署都是基于Pytorch后台的,并没有利用到上面的MLXM系列芯片上的计算优势。

但是!总有慷慨的开源社区会在这时候站出来造福大众,MLX Community[2]就是其中一个。

这是Huggingface上的一个开源组织,核心目标就是将主流的大模型转换成MLX框架支持的格式,以获得更好的运行性能。

同时他们还提供了配套的Python库mlx-lm[3],以满足更细粒度的代码操作需求。

随手截个图:

www.zeeklog.com  - 重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

MLX Community

LM Studio

之前我的测试是在Ollama上进行的,作为目前最火的开源大模型本地运行框架之一,它确实非常便捷,然而目前美中不足的是它并不支持MLX

那么除了用mlx-lm库加载MLX Community的模型,还有什么更好的方式么?这就要提到今天的重头戏了:LM Studio

这个APP估计大家也早有耳闻,我就不多做介绍了。

它和Ollama的一个主要区别就是它提供了丰富的Chat交互界面模型管理页面

而最关键的是,「它在最新的版本里支持了MLX!」,更准确地说是支持了MLX格式的大模型checkpoints

www.zeeklog.com  - 重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

LM Studio

于是我迫不及待地进行了测试。

LM Studio + MLX 测试

www.zeeklog.com  - 重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

LM Studio里可以直接筛选检索Huggingface上的MLX格式模型。

为了和上一期的测试结果对比,我下载了MLX格式的Qwen2.5 72B Int432B Int4

测试的prompt还是上一期的完全不变。

这里我直接上结论:

72B

www.zeeklog.com  - 重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

72B_1

www.zeeklog.com  - 重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

72B_2

11.12 tokens/s的生成速度。

32B

www.zeeklog.com  - 重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

32B_1

www.zeeklog.com  - 重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

32B_2

23.67 tokens/s的生成速度。

如果大家还记得上一期我分享的Ollama上的测试结果,72B Int432B Int4对应的分别是:7.77 tokens/s18.45 tokens/s

(11.12−7.77)/7.77=0.431

(23.67−18.45)/18.45=0.283

也就是分别有说有43%28% 的提速。

这里多提一句,测试32B的时候有时也能达到27 tokens/s的速度,那么提升也在40%+,为了严谨,我取的是较慢的值。

无论如何,MLX带来的提升还是肉眼可见的,加上MLX Community对主流模型都做了适配,所以如果有在Mac上跑本地大模型需求的朋友,强烈建议可以试试LM Studio了。

它同样也支持以OpenAI Compatible的方式提供Serving接口。

关于LM Studio的模型下载

这里最后再提供一个小干货

众所周知,由于不可言喻的原因,咱们这边访问Huggingface是相当费劲的,更别提下载模型了。

相信聪明的各位都已经知道用HF-Mirror[4]来改善体验,但是LM Studio里搜到的模型依然是走的官方原站,如果没有魔法加持的话会发现什么也下载不下来,怎么办呢?

思路也很简单,直接做域名替换,将huggingface.co替换成hf-mirror.com,我自己亲测可用,这里分享一下MAC上的操作方式,其他操作系统的大家可以依葫芦画瓢。

1. 打开Finder进入应用程序文件夹

2. 找到安装好的LM Studio应用,右键点击显示包内容

3. 一路点击进入,找到下面这个main文件夹:

www.zeeklog.com  - 重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

这里需要注意.webpackapp文件夹里是隐藏的,需要Comand + Shift + .来显示。

4. 用文本编辑器打开main文件夹(例如SublimeVscode,这里我用的是Vscode

5. 批量在.js格式的文件中检索huggingface.co替换成hf-mirror.com

www.zeeklog.com  - 重生2之128G的MacBook Pro M4 Max本地跑大模型,速度居然还有提升空间?

这里因为我已经替换过了,所以搜了下hf-mirror.com给大家展示一下检索效果(这里最好屏蔽build文件夹)。

6. 如果LM Studio正打开,需要关闭重启一次

然后随便搜索一个模型,如果能看到huggingface里的结果,点击之后能够开始下载,那么就说明成功了。

这样一来大家就可以愉快地使用LM StudioMAC上玩儿大模型啦!

好啦,这一期的内容就到这里了,后面响应广大朋友的评论要求,我可能会玩一玩文生图相关的内容,不过这个之前没经验,所以可能需要多调研一番啦!

大家敬请期待!走之前别忘了点个「」和「再看」呀!

如果希望第一时间看到更新,右上角点开加个「星标🌟」就好!

感谢大家,下期见!

引用链接

[1] MLX: https://github.com/ml-explore/mlx
[2] MLX Community: https://huggingface.co/mlx-community
[3] mlx-lm: https://pypi.org/project/mlx-lm/
[4] HF-Mirror: https://hf-mirror.com/

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk