[THUDM/ChatGLM-6B]多gpu如何训练 ?预测是可以的,但是训练不行

2024-06-12 756 views
0

多gpu运行问题

预测的时候多gpu可以这样写: model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2)

但是训练的时候多了 config=config 参数怎么办: model = AutoModel.from_pretrained(model_args.model_name_or_path, config=config, trust_remote_code=True) #这里可以用预测的多GPU吗?

报错: RuntimeError: CUDA out of memory. Tried to allocate 192.00 MiB (GPU 0; 11.17 GiB total capacity; 10.24 GiB already allocated; 171.69 MiB free; 10.71 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

到底训练要多大的GPU显存才行? 我有两个卡22G,现在好像只能用一张卡: 我尝试这样改也不行: 图片

回答

1

官方的训练代码是可以支持多卡训练的,不用自己修改代码 需要引入下面这个变量 CUDA_VISIBLE_DEVICES=0,1

2

官方的训练代码是可以支持多卡训练的,不用自己修改代码 需要引入下面这个变量 CUDA_VISIBLE_DEVICES=0,1

这个没有效果的 。 不要搞错了。。

就算你是预测,如果不用 model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 你只用 CUDA_VISIBLE_DEVICES=0,1 是不行的,你这个一直 都 只是理论上可以的事,实际是不行的。 要不然也不用推出: model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 方案了

9

多卡的推理上,会有性能提升吗? 单卡8G 用INT8 多卡用 FP16

2

官方的训练代码是可以支持多卡训练的,不用自己修改代码 需要引入下面这个变量 CUDA_VISIBLE_DEVICES=0,1

这个没有效果的 。 不要搞错了。。

就算你是预测,如果不用 model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 你只用 CUDA_VISIBLE_DEVICES=0,1 是不行的,你这个一直 都 只是理论上可以的事,实际是不行的。 要不然也不用推出: model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 方案了

对我来说这个是有用的,不知道你的问题是出在哪里了

7

多卡的推理上,会有性能提升吗? 单卡8G 用INT8 多卡用 FP16

从INT8到FP16就会有提升,是否多卡就是推理速度上的区别吧

0

官方的训练代码是可以支持多卡训练的,不用自己修改代码 需要引入下面这个变量 CUDA_VISIBLE_DEVICES=0,1

这个没有效果的 。 不要搞错了。。 就算你是预测,如果不用 model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 你只用 CUDA_VISIBLE_DEVICES=0,1 是不行的,你这个一直 都 只是理论上可以的事,实际是不行的。 要不然也不用推出: model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 方案了

对我来说这个是有用的,不知道你的问题是出在哪里了

你显卡单卡本来就高呀

我是两卡: 每一张11G 单张不高 图片

我的这个就不行了 , 11 G 两个卡一共22G

6

卡的推理上,会有性能提升吗? 单卡8G 用INT8

显存够用就行,要不然不能运行起来现在的,如果能运行起来不是 越大就越快,而是算力高的卡才快

9

官方的训练代码是可以支持多卡训练的,不用自己修改代码 需要引入下面这个变量 CUDA_VISIBLE_DEVICES=0,1

这个没有效果的 。 不要搞错了。。 就算你是预测,如果不用 model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 你只用 CUDA_VISIBLE_DEVICES=0,1 是不行的,你这个一直 都 只是理论上可以的事,实际是不行的。 要不然也不用推出: model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 方案了

对我来说这个是有用的,不知道你的问题是出在哪里了

你显卡单卡本来就高呀

我是两卡: 每一张11G 单张不高 图片

我的这个就不行了 , 11 G 两个卡一共22G

这玩意应该和单卡显存无关吧

image
1

意应该和单卡显存无关吧

你单张卡都24G了, 已经够运行了,所以你不会有这个问题的

4

不是,哥们,你没看到我是双卡在训练吗。。

3

不是,哥们,你没看到我是双卡在训练吗。。

启动不了啊,哥。

如果你觉得没人问题,你找一个11G 两个卡来测试,如果能过我2000块打给你

1

我的意思是说和显存大小无关,不是说没有问题,说不定和cuda版本啥的有关

5

我的意思是说和显存大小无关,不是说没有问题,说不定和cuda版本啥的有关

真是无语: 看我发的报错信息

报错: RuntimeError: CUDA out of memory. Tried to allocate 192.00 MiB (GPU 0; 11.17 GiB total capacity; 10.24 GiB already allocated; 171.69 MiB free; 10.71 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

(mygpt) [root@localhost chatGlmBase]# python Python 3.8.16 (default, Mar 2 2023, 03:21:46) [GCC 11.2.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information.

import torch as t print( t.cuda.is_available() ) True tensor=t.Tensor(3,4) tensor.cuda(0) tensor([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]], device='cuda:0') print(t.version.cuda) 10.2 print(t.cuda.device_count()) 2

1

兄弟,我不是说你OOM和cuda版本有关,我是说你不能多卡运行可能和cuda版本有关

9

兄弟,我不是说你OOM和cuda版本有关,我是说你不能多卡运行可能和cuda版本有关

(mygpt) [root@localhost chatGlmBase]# python Python 3.8.16 (default, Mar 2 2023, 03:21:46) [GCC 11.2.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information.

import torch as t print( t.cuda.is_available() ) True tensor=t.Tensor(3,4) tensor.cuda(0) tensor([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]], device='cuda:0') print(t.version.cuda) 10.2 print(t.cuda.device_count()) 2

不懂了,以上是配置, 返正我训练是不行,预测至从出了model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 我就可以运行起来了。 我的意思是官方训练的时候能不能一起样完善起来,做个全套

4

官方的训练代码是可以支持多卡训练的,不用自己修改代码 需要引入下面这个变量 CUDA_VISIBLE_DEVICES=0,1

这个我试了下是可以的,但是为什么多卡训练的时间要比单卡还长

4

官方的训练代码是可以支持多卡训练的,不用自己修改代码 需要引入下面这个变量 CUDA_VISIBLE_DEVICES=0,1

这个我试了下是可以的,但是为什么多卡训练的时间要比单卡还长

没有改别的超参之类的吗?多卡训练会有通信延时,如果另一张卡算力不强可能会有这种情况吧。。

3

官方的训练代码是可以支持多卡训练的,不用自己修改代码 需要引入下面这个变量 CUDA_VISIBLE_DEVICES=0,1

这个我试了下是可以的,但是为什么多卡训练的时间要比单卡还长

官方的训练代码是可以支持多卡训练的,不用自己修改代码 需要引入下面这个变量 CUDA_VISIBLE_DEVICES=0,1

这个我试了下是可以的,但是为什么多卡训练的时间要比单卡还长

没有改别的超参之类的吗?多卡训练会有通信延时,如果另一张卡算力不强可能会有这种情况吧。。

多卡是可以,但是如果多卡每张显存小于11G 就不行【意思就是就算你是多卡也要16G的,懂不懂啊】,用: nvidia-smi 看看自己的显存,每张小于12G的就算你有1000张也运行不起来。 理解了吗?要不然真的成了 混淆试听!!!!!

8

每张小于12G的就算你有1000张也运行不起来训练

2

每张小于12G的就算你有1000张也运行不起来训练

想请问一下,您这个结论是从哪得到的

3

每张小于12G的就算你有1000张也运行不起来训练

想请问一下,您这个结论是从哪得到的

实战出真实,不知道你能不能用两个11G的来测试一下,再来问

5

@gg22mm 多卡训练的问题你那边有进展吗?我这边也是四个11G的显卡 使用CUDA_VISIBLE_DEVICES=0,1,2,3 没有任何效果。还是只在一个卡上跑。

0

@gg22mm 多卡训练的问题你那边有进展吗?我这边也是四个11G的显卡 使用CUDA_VISIBLE_DEVICES=0,1,2,3 没有任何效果。还是只在一个卡上跑。

我倒,我都说的你1000张都没用,启动是需要16G这样才行, 只有启动成功了才会使用多卡,要不然你启动都不成功

2

我知道,所以我想问一下有没有其它的解决方案呢?官方的多卡方式是无法使用的,就卡在一个尴尬的内存上。

9

1、楼上说可能是: 不能多卡运行可能和cuda版本有关,你可以尝试一下。 但我觉得应该不是这个问题,但你可以尝试一下,就为了那个万一 图片

2、还有一个办法就是你跑一下其它代码,看看能不能多卡运行。

3、就是官方像预测那样用 model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 来训练,不知道官方为什么只做了预测多卡 而 不做训练的多卡..

2

你这边版本是多少?我现在是12.1,我个人感觉也这个版本也没有什么关系。

5

我是两卡: 每一张11G 单张不高 图片

你这边版本是多少?我现在是12.1,我个人感觉也这个版本也没有什么关系。

我上面有呀。

你不可能是12多的吧,我看最高也是11.多的吧

5

image 我这边确实是12.1的 不会因为我的太高了?

4

能请问一下怎么训练呢,readme好像没写

1

@zhanjuex 在ptuning这个目录下有个readme 你去研究一下,祝你顺利

7

@168liuliu168 非常非常感谢你,祝你生活愉快!

5

1、楼上说可能是: 不能多卡运行可能和cuda版本有关,你可以尝试一下。 但我觉得应该不是这个问题,但你可以尝试一下,就为了那个万一 图片

2、还有一个办法就是你跑一下其它代码,看看能不能多卡运行。

3、就是官方像预测那样用 model = load_model_on_gpus("./THUDM/chatglm-6b", num_gpus=2) 来训练,不知道官方为什么只做了预测多卡 而 不做训练的多卡..

你好!

你用多个11g的GPU可以训练了吗?我也是4个11G的GPU,出现不能训练的的问题,这种配置还有训练的机会吗?

感谢分享经验!

4

@mercurydarkork 这边我确实可以实现的,但是我用四张卡的时候需要25个小时,一张卡只要1个小时,神奇,其他没有任何的改动,这个问题您后来解决了吗? @xv994 这边你设置之后,您有观察过您的运行时间以及资源利用情况吗?

官方的训练代码是可以支持多卡训练的,不用自己修改代码 需要引入下面这个变量 CUDA_VISIBLE_DEVICES=0,1

9

用CUDA_VISIBLE_DEVICES=0,1第一张卡不够大的话就会OOM,官方的load_model_on_gpus手动将模型各层分配到每张GPU上了,就能够启动了