Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apple Silicon 部署注意事项 #20

Open
linyiLYi opened this issue Jul 3, 2023 · 17 comments
Open

Apple Silicon 部署注意事项 #20

linyiLYi opened this issue Jul 3, 2023 · 17 comments

Comments

@linyiLYi
Copy link
Owner

linyiLYi commented Jul 3, 2023

近段时间 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 这个新平台下进行机器学习开发可能遇到的问题,以及可能的解决方案。希望大家能友好讨论,推动机器学习社区进一步朝前走。

@shishizhao1988
Copy link

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

@rosickey
Copy link

rosickey commented Jul 5, 2023

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

@ihearsay
Copy link

ihearsay commented Jul 5, 2023

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

@jianliao
Copy link

jianliao commented Jul 5, 2023

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

@ArSrNa
Copy link

ArSrNa commented Jul 7, 2023

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

@piaodangdang
Copy link

从官网“借来”(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左右

@jianliao
Copy link

jianliao commented Jul 8, 2023

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?我想请问有可能超过这个限制吗?还是说,在这个机器上,我就只能玩内存需求低于这个阙值的模型?

@piaodangdang
Copy link

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

@jianliao
Copy link

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

@jdjingdian
Copy link

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参数也是这个报错,不带的话能跑,但是非常非常慢

@jianliao
Copy link

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

@jianliao
Copy link

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

@jianliao
Copy link

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

@Sun13
Copy link

Sun13 commented Aug 6, 2023

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

@Jagonbradley
Copy link

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

@jianliao
Copy link

jianliao commented Aug 7, 2023

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

@LBJ6666
Copy link

LBJ6666 commented Jul 24, 2024

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)还慢。不清楚为啥

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests