Facico / Chinese-Vicuna

Chinese-Vicuna: A Chinese Instruction-following LLaMA-based Model —— 一个中文低资源的llama+lora方案,结构参考alpaca
https://github.com/Facico/Chinese-Vicuna
Apache License 2.0
4.14k stars 425 forks source link

chat.py生成结果的时候,GPU的显存会持续增加,最后显存溢出 #66

Closed yuxuan2015 closed 1 year ago

yuxuan2015 commented 1 year ago

运行chat.sh启动服务之后,在生成结果的时候,显存使用会持续增加,直至最后显存溢出,这个有什么解决方法吗

Facico commented 1 year ago

把num_beams和max_new_tokens减小,或者把max_memory减小

yuxuan2015 commented 1 year ago

@Facico 好的,我试一下

greatewei commented 1 year ago

大佬解决了吗,我遇到一样问题,而且随着问答次数上升,显存不断增加,并没有输出结果后释放显存,最终导致溢出。

Facico commented 1 year ago

@greatewei 因为问答的时候历史对话是拼接的,当然会越拼越长,在一定的显存要求下是不会超的,但是长度大于你的显存要求是肯定就会超,现在不管那个模型的对话基本都有这个问题。 你可以把num_beams和max_new_tokens减小,或者把max_memory(控制的是历史对话的截取长度)减小

greatewei commented 1 year ago

这样的方式是否也能应对并发请求的场景,目前观察到的现象只要有问答显存就会增长,num_beams和max_new_tokens参数减小后的效果是显存增长速度变慢,但是始终是增加,及时问答结束也并且未能得到释放

Facico commented 1 year ago

@greatewei @yuxuan2015 我刚才看了一下,确实是我们的锅,我们的chat.sh脚本中的“CUDA_VISIBLE_DEVICES”打成了"CUDA_VISIBLE_DEVIECES"导致没有指定确切的显卡,同时由于peft目前自带的问题会造成有一定的显存泄露的问题,可以将"CUDA_VISIBLE_DEVICES"修改正确,或者拉去我们最新的代码

greatewei commented 1 year ago

@greatewei @yuxuan2015 我刚才看了一下,确实是我们的锅,我们的chat.sh脚本中的“CUDA_VISIBLE_DEVICES”打成了"CUDA_VISIBLE_DEVIECES"导致没有指定确切的显卡,同时由于peft目前自带的问题会造成有一定的显存泄露的问题,可以将"CUDA_VISIBLE_DEVICES"修改正确,或者拉去我们最新的代码

我尝试了几个case,总的来说显存是只增不降,如果将load_8bit修改为false,响应速度将会很快,但是显存增长也很快,是否有办法结束对话后自动释放显存空间呢?

Facico commented 1 year ago

@greatewei 把上面说的那个问题修改了也是这样吗

greatewei commented 1 year ago

@greatewei 把上面说的那个问题修改了也是这样吗

是的,只要问题内容足够长,显存会不断增长,load8bit 设置为false 效果更明显

Facico commented 1 year ago

@greatewei 因为这个显存消耗是由输入长度和输出长度一起确定的,输入长度会和历史信息一起截取max_memory的长度。 因为我们用的是流式输出的方式,随着记忆长度的增加(输入长度变长),显存是会增长的。最后达到max_memory所对应的极限长度。

你可以适当减小max_memory,当达到极限长度的时候显存是能保持稳定的

greatewei commented 1 year ago

随着记忆长度的增加(输入长度变长),显存是会增长的。最后达到max_memory所对应的极限长度。

使用两段不同的长文本进行测试的效果还是会出现显存溢出,可能还需要其他方法处理。

Facico commented 1 year ago

@greatewei 你能提供你的显卡类型和max_memory设置的大小吗

greatewei commented 1 year ago

@greatewei 你能提供你的显卡类型和max_memory设置的大小吗

v100, 32G显存, max_memory:1024(这个参数我进行了忽略,我采用了llama-index的方式,需要提供更多上下文),即使max_memory参数进行了限制,增个服务的显存是只增不减的,只要尝试次数过多,或者直接忽略max_memory参数的限制,可以很快的复现。

Facico commented 1 year ago

@greatewei 就是你使用的不是我们提供的脚本?

greatewei commented 1 year ago

@greatewei 就是你使用的不是我们提供的脚本?

使用你们原版的chat.py脚本可以复现,但是不是很明显,需要改造一下。

Facico commented 1 year ago

@greatewei 使用我们的脚本把max_memory设置好了应该是不会有问题的。我也没有你现在的代码我也复现不了你的情况。

greatewei commented 1 year ago

@greatewei 使用我们的脚本把max_memory设置好了应该是不会有问题的。我也没有你现在的代码我也复现不了你的情况。

我恢复了脚本,将load_8bit设置为False 启动命令: CUDA_VISIBLE_DEVICES=0 python -u chat.py --model_path llama-7b-hf --lora_path Chinese-cuna-lora-7b-3epoch-belle-and-guanaco image load_8bit=False 启动后:9370MiB / 32768MiB


提问第一个问题: 总结以下内容: 《黑客帝国》 在矩阵中生活的一名年轻的网络黑客尼奥(基努·里维斯饰)发现,看似正常的现实世界实际上似乎被某种力量控制着,尼奥便在网络上调查此事。而在现实中生活的人类反抗组织的船长墨菲斯(劳伦斯·菲什伯恩饰), 也一直在矩阵中寻找传说的救世主,就这样在人类反抗组织成员崔妮蒂(凯莉·安·摩丝饰)的指引下,两人见面了,尼奥也在墨菲斯的指引下,回到了真正的现实中,逃离了矩阵,这才了解到,原来他一直活在虚拟世界当中 [5] 。 《黑客帝国2:重装上阵》 黑客帝国 黑客帝国(2张) 实际上,整个《重装上阵》是尼奥探寻自己使命背后真相的过程,他要为自己的行动寻找一个可以接受的理由。在上集打败史密斯(雨果·维文饰)、救出墨菲斯之后,尼奥随同亲密爱人崔妮蒂和其他战友一起,乘坐Nebuchadnezzar号飞船返回地球上最后一个人类据点——锡安基地。在那里,他们和其他自由战士们聚集到了一起。就在这时,母体系统决定“先下手为强”,派遣了为数250000的电子乌贼大军,开始进攻锡安基地,微弱的基地防守力量根本不足以对抗如此强大的机甲兵团,看来人类最后的香火也岌岌可危。可是,“母体取经”的道路注定是凶险多端的:在寻找母体系统内唯一知道系统弱点的“制钥者”的过程中,尼奥、墨菲斯和崔妮蒂遇到了前所未有的困难 [5] 。 《黑客帝国3:矩阵革命》 在《黑客帝国》系列电影最后一集中,延续上集《黑客帝国2:重装上阵》的故事,并揭晓机器与人类的最终命运。面对如潮的电子乌贼,人类城市危在旦夕,墨菲斯和崔妮蒂等欲与入侵者决一死战。此时,“救世主”尼奥的身体和思想却意外分离,后者再度陷入到“母体”中。墨菲斯和崔妮蒂也不得不回到“母体”和守护天使一起寻找他。 [24] 显存变化:18768MiB / 32768MiB


提问第二个问题: 总结以下内容: 第二季 正式海报 《行尸走肉第二季》 当疾控中心被夷为平地之后,瑞克·格里姆斯等幸存者继续踏上前往亚特兰大的凶险之旅。身心倍感疲惫的一群人越来越难以应付仿佛永远没有穷尽的丧尸,而他们之间的关系也变得愈加微妙和不稳定。肖恩与好友瑞克和瑞克之妻洛瑞关系愈加扑朔迷离,变得暴躁残忍的肖恩萌生脱队行动的念头,他种种乖张举措为自己和伙伴们埋下了悲剧的种子。与此同时,死亡以一步步向幸存者们迫近,有的人遇害、受伤、失踪,可即便命运如此残酷,即将到来新的生命仍昭示着未来的希望。 [3] 《行尸走肉第二季》 当疾控中心被夷为平地之后,瑞克·格里姆斯等幸存者继续踏上前往亚特兰大的凶险之旅。身心倍感疲惫的一群人越来越难以应付仿佛永远没有穷尽的丧尸,而他们之间的关系也变得愈加微妙和不稳定。肖恩与好友瑞克和瑞克之妻洛瑞关系愈加扑朔迷离,变得暴躁残忍的肖恩萌生脱队行动的念头,他种种乖张举措为自己和伙伴们埋下了悲剧的种子。与此同时,死亡以一步步向幸存者们迫近,有的人遇害、受伤、失踪,可即便命运如此残酷,即将到来新的生命仍昭示着未来的希望。 [3] 显存变化:20058MiB / 32768MiB


Facico commented 1 year ago

@greatewei 他这个显存变化应该是他生成长度不同造成的变化

greatewei commented 1 year ago

@greatewei 他这个显存变化应该是他生成长度不同造成的变化

嗯,但是一直没有释放,目前我的解决方案是回答输出后释放缓存,效果很明显:torch.cuda.empty_cache()

Facico commented 1 year ago

这个我们最新版本的chat.py也有加,可以在OOM的时候释放,https://github.com/Facico/Chinese-Vicuna/blob/master/chat.py#L282。 所以你上面说的释放是指OOM之后还能继续加载程序?

Facico commented 1 year ago

哦,我终于知道你是什么意思了,你的意思是随着文本的变长,显存一直变大,但是在下一次输入还没开始的时候就一直保持的这个变大之后的显存是吧。 因为下一次输入的时候还是会占这么多显存,所以整体上来说是没啥问题的。不过可能业务需求上会有这种需求。

greatewei commented 1 year ago

哦,我终于知道你是什么意思了,你的意思是随着文本的变长,显存一直变大,但是在下一次输入还没开始的时候就一直保持的这个变大之后的显存是吧。 因为下一次输入的时候还是会占这么多显存,所以整体上来说是没啥问题的。不过可能业务需求上会有这种需求。

是的,人一多就OOM了,看了一下你的写法是触发OOM后才进行释放,我是evaluate函数的最后增加了torch.cuda.empty_cache()