snake-ai icon indicating copy to clipboard operation
snake-ai copied to clipboard

Apple Silicon 部署注意事项

Open linyiLYi opened this issue 1 year ago • 17 comments

近段时间 Apple silicon 平台的机器学习支持在开源社区的努力下快速发展,而苹果芯片的统一内存架构也让大模型的落地普及有了新的希望,因此本项目也推送了新版代码,增加对 macOS GPU 加速框架 MPS(Metal Performance Shaders)的支持。

不过 Apple silicon 诞生不到三年,其机器学习生态更是刚刚起步,一定存在许多问题。本 issue 用于记录我在本项目以及其它外部项目中遇到的一些问题,也欢迎大家进行补充、友好讨论,分享一些常见问题的解决方案。

  • 本项目中用到的 Anaconda、python 等基础工具已具备对 Apple silicon 的原生支持,但实际开发中出现了某些旧版代码库与 Python 安装工具 pip 的兼容性问题。解决办法已在中文版 README 中列出,需要降级 setuptools 与 pip 至 setuptools==65.5.0,pip==21。
  • 目前 Stable Diffusion web UI 已经提供了对 Apple silicon 的 GPU 加速支持,但除了其官方文档中列出的问题(例如图生文不支持 GPU)之外,我还遇到了 MPS 相关的 BUG,在生成高分辨率图像时,虽然统一内存仍有充裕空间,但 MPS 会提示数组尺寸超过 2**32,该 BUG 尚未解决,导致苹果芯片的超大统一内存暂时无法得到充分利用。

大家在实际开发过程中如果遇到其他问题,也欢迎罗列在本 issue 下,帮助社区进一步了解在 Apple silicon 这个新平台下进行机器学习开发可能遇到的问题,以及可能的解决方案。希望大家能友好讨论,推动机器学习社区进一步朝前走。

linyiLYi avatar Jul 03 '23 06:07 linyiLYi

啊,还是这清净,阿B那我都不知道在吵啥

shishizhao1988 avatar Jul 04 '23 08:07 shishizhao1988

目前看到的视频或是应用,都是基于PyTorch设置device="mps"后实现的,而不是直接基于MPS. 所以我想问的是,比如https://github.com/mumax/3 这个项目是基于Go仅支持CUDA,如果我想让它能支持macOS GPU 应该怎么样下手好呢?

rosickey avatar Jul 05 '23 04:07 rosickey

大家都是AI的相关从业者、研究者吗?感觉这个帖子开得很及时!

ihearsay avatar Jul 05 '23 08:07 ihearsay

Reddit有个讨论组r/LocalLLaMA,专门讨论在个人本地机器上跑LLM。它上面的信息非常全面且更新很快。昨天,用了一个多小时在自己一个3年前配的PC(5800x + 3080Ti+32GB)上搭建了一个7B的小模型,就是利用Op提到text generation webui。非常好玩,现在想在工作用的M1 Max也搭建一个。

jianliao avatar Jul 05 '23 20:07 jianliao

视频评论不少有人因显存和算力吵架的,毕竟咱们训练模型用的机器不是说开就开的。 而且计算卡的GRID驱动也需要企业公章才能申请得到,对于个人来说这个无疑是较好的解决方案了。 上10万的A10,跑Stable Diffusion也仅仅只有2it/s左右,但是这个价格,这个显存和算力。。。NVIDIA什么意思想必各位都懂,都是内行人 :)

ArSrNa avatar Jul 07 '23 09:07 ArSrNa

从官网“借来”(14天无理由退换)两台机器,通过up主的启发,看看mps下统一内存的决定性配置是在内存还是处理核心: A配置:M1Max 内存64g 2T B配置:M2Max 内存32g 1T 软件版本: Anaconda3-2023.03-1-MacOSX-arm64 python=3.10.9 pytorch=2.1.0.dev20230705 模型是chatglm2-6b默认配置,修改web_demo的后端为mps

目前只是验证推理侧,本地启动chatglm2,目前的验证结果是: A配置启动后,发送消息后无任何回应,内存飙升,一直到占满可用内存也无法返回回到 B配置启动后,正常进行对话,内存占用在28G左右

piaodangdang avatar Jul 07 '23 13:07 piaodangdang

Reddit有个讨论组r/LocalLLaMA,专门讨论在个人本地机器上跑LLM。它上面的信息非常全面且更新很快。昨天,用了一个多小时在自己一个3年前配的PC(5800x + 3080Ti+32GB)上搭建了一个7B的小模型,就是利用Op提到text generation webui。非常好玩,现在想在工作用的M1 Max也搭建一个。

请问这里有M1 Max 32GB的用户吗?我尝试了几个Model,发现如果使用GPU(n-gpu-layer > 0),33B机器必然OOM。

首先,启动的时候oobabooga就会报下面这个Warning:

ggml_metal_add_buffer: allocated 'data            ' buffer, size = 16384.00 MB, offs =            0
ggml_metal_add_buffer: allocated 'data            ' buffer, size =   261.66 MB, offs =  17005117440, (16646.05 / 21845.34)
ggml_metal_add_buffer: allocated 'eval            ' buffer, size =  1280.00 MB, (17926.05 / 21845.34)
ggml_metal_add_buffer: allocated 'kv              ' buffer, size =  3122.00 MB, (21048.05 / 21845.34)
ggml_metal_add_buffer: allocated 'scr0            ' buffer, size =   512.00 MB, (21560.05 / 21845.34)
ggml_metal_add_buffer: allocated 'scr1            ' buffer, size =   512.00 MB, (22072.05 / 21845.34), warning: current allocated size is greater than the recommended max working set size

然后inference的时候,必然报如下错误(去源代码看了,大概就是OOM了)

ggml_metal_graph_compute: command buffer 0 failed with status 5
GGML_ASSERT: /private/var/folders/b4/948z9qdn03jdb1tp1s8vzgq40000gn/T/pip-install-yk7px_51/llama-cpp-python_5a83e1c027fa461482395e26d3e98529/vendor/llama.cpp/ggml-metal.m:977: false

分析log之后,发现使用内存不能超过21845.34这个数字。这个数字应该来自Apple MacOS的Metal API - device.recommendedMaxWorkingSetSize?我想请问有可能超过这个限制吗?还是说,在这个机器上,我就只能玩内存需求低于这个阙值的模型?

jianliao avatar Jul 08 '23 17:07 jianliao

我用了M1 Max 64g 进行chatglm2的inference ,基本不可用,模型吐出来的都是各种的得(程序后端也没报错),内存使用大约54G, 但是放在m2max 32Gb 正常返回我的问题答案(内存稳定在29g左右)——但基本是一本正经的胡说八道,比m1max的效果要好,是不是metal 对m1max的支持不理想,已经把m1max的机器退掉,购入m2max的mac

piaodangdang avatar Jul 10 '23 01:07 piaodangdang

我试验了几个13B-GGML的模型,还是挺不错的,只要Context不要太长,inference速度都可以保证在8 ~ 10tokens/s。一定要enable MPS,光用CPU太慢,同样的LLM,速度只有1 ~ 2tokens/s。

jianliao avatar Jul 10 '23 03:07 jianliao

Reddit有个讨论组r/LocalLLaMA,专门讨论在个人本地机器上跑LLM。它上面的信息非常全面且更新很快。昨天,用了一个多小时在自己一个3年前配的PC(5800x + 3080Ti+32GB)上搭建了一个7B的小模型,就是利用Op提到text generation webui。非常好玩,现在想在工作用的M1 Max也搭建一个。

请问这里有M1 Max 32GB的用户吗?我尝试了几个Model,发现如果使用GPU(n-gpu-layer > 0),33B机器必然OOM。

首先,启动的时候oobabooga就会报下面这个Warning:

ggml_metal_add_buffer: allocated 'data            ' buffer, size = 16384.00 MB, offs =            0
ggml_metal_add_buffer: allocated 'data            ' buffer, size =   261.66 MB, offs =  17005117440, (16646.05 / 21845.34)
ggml_metal_add_buffer: allocated 'eval            ' buffer, size =  1280.00 MB, (17926.05 / 21845.34)
ggml_metal_add_buffer: allocated 'kv              ' buffer, size =  3122.00 MB, (21048.05 / 21845.34)
ggml_metal_add_buffer: allocated 'scr0            ' buffer, size =   512.00 MB, (21560.05 / 21845.34)
ggml_metal_add_buffer: allocated 'scr1            ' buffer, size =   512.00 MB, (22072.05 / 21845.34), warning: current allocated size is greater than the recommended max working set size

然后inference的时候,必然报如下错误(去源代码看了,大概就是OOM了)

ggml_metal_graph_compute: command buffer 0 failed with status 5
GGML_ASSERT: /private/var/folders/b4/948z9qdn03jdb1tp1s8vzgq40000gn/T/pip-install-yk7px_51/llama-cpp-python_5a83e1c027fa461482395e26d3e98529/vendor/llama.cpp/ggml-metal.m:977: false

分析log之后,发现使用内存不能超过21845.34这个数字。这个数字应该来自Apple MacOS的Metal API - device.recommendedMaxWorkingSetSize?我想请问有可能超过这个限制吗?还是说,在这个机器上,我就只能玩内存需求低于这个阙值的模型?

我的机器是M1 Pro 32G,跑了下llama.cpp,带-ngl 1参数也是这个报错,不带的话能跑,但是非常非常慢

jdjingdian avatar Jul 14 '23 09:07 jdjingdian

@jdjingdian 你出现这句warning吗?warning: current allocated size is greater than the recommended max working set size。出现了就说明GPU内存不够用了,换个Model试一试。要想快,一定要开--n-gpu-layers.

jianliao avatar Jul 14 '23 17:07 jianliao

请问有人在Apple Silicon的机器上做过LoRA训练吗?我自己简单研究了一下,发现LoRA似乎需要有CUDA的GPU,所以基本上没戏。

jianliao avatar Jul 14 '23 23:07 jianliao

@Jagonbradley, 不是,不过你的调用方法应该也是一个意思。我是通过Text generation web UI来修改参数的。你得一次设定高一点(Max:128) image

jianliao avatar Jul 31 '23 14:07 jianliao

image 用text-generation-webui跑起来,CPU和GPU占用率是上面这样,这样用Meta加速了吗?

Sun13 avatar Aug 06 '23 01:08 Sun13

如果是用llama.cpp运行,加上-ngl会发现cpu完全不运行,全在gpu上。但是用weibu的话,我把n-gpu-layers拉满到128也还是会用到CPU但是没有像你这么满。并且我发现运算时间确实是和gpu-layer的参数大小成反比的。

Jagonbradley avatar Aug 07 '23 06:08 Jagonbradley

@Sun13 我设置到128,感觉CPU基本上用不到了,不了解你为何有一小段时间CPU也拉满。 @Jagonbradley 我记得有一种loader能够智能动态分配CPU和GPU的load,不过好像不是给Mac用的。

jianliao avatar Aug 07 '23 16:08 jianliao

m2 macbook 测试的时候,设置了torch.mps.set_per_process_memory_fraction(0.)不限制内存非配,可以加大GPU内存非配,在未设置的时候容易报OOM。 还有一个现象是,mps运行时,比如当bath size = 4的时候 3s/batch,当batch size=8时,就变成了300多秒/batch,比cpu(40s/batch)还慢。不清楚为啥

LBJ6666 avatar Jul 24 '24 01:07 LBJ6666