linyiLYi / snake-ai

An AI agent that beats the classic game "Snake".
Apache License 2.0
1.59k stars 352 forks source link

Apple Silicon 部署注意事项 #20

Open linyiLYi opened 1 year ago

linyiLYi commented 1 year ago

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

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

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

shishizhao1988 commented 1 year ago

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

rosickey commented 1 year ago

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

ihearsay commented 1 year ago

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

jianliao commented 1 year ago

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

ArSrNa commented 1 year ago

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

piaodangdang commented 1 year ago

从官网“借来”(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 commented 1 year ago

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 commented 1 year ago

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

jianliao commented 1 year ago

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

jdjingdian commented 1 year ago

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 commented 1 year ago

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

jianliao commented 1 year ago

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

jianliao commented 1 year ago

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

image
Sun13 commented 1 year ago
image

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

Jagonbradley commented 1 year ago

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

jianliao commented 1 year ago

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

LBJ6666 commented 1 month ago

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