zhangzhenyu13 / llm3s-conatiner

large language model training-3-stages+deployment
46 stars 12 forks source link

全量ft之后,推理显存占用显著上升 #3

Closed Ishiki-Iroha closed 11 months ago

Ishiki-Iroha commented 11 months ago

请问一下,我进行全量ft之后,推理的显存从14000MB上升到27000MB,这是什么原因?另一方面,我这边的训练样本输入token都挺大的,超过3000,当设置为3000的时候,1.1b的bloomz单张46G的L40S只能单batch+zero2 offload训练,不然会oom,这正常吗?

zhangzhenyu13 commented 11 months ago

这个正常。因为对于一个参数量1B模型,如果采用fp16训练,那么模型权重消耗2G,梯度2G,然后我们用adamw优化器,里面是fp32精度的一/二阶动量和权重备份参数,这三份消耗3*4=12G。 以上仅仅是参数部分,此外hidden-states中间态也许要大量显存,且随着长度增加会线性增长,attention这些消耗显存还N^2增长,所以总体消耗会增多。 如果你只用lora、ptuning等训练,那么至少优化器部分和梯度部分会很小。

zhangzhenyu13 commented 11 months ago

推理显存按说不会因为全量和非全量而变化。原因很可能如下: 1)lora精调是否保存了adapters仅仅,然后这个配置是int8量化主模型参数加载,所以会比较省略显存; 2)全量后,应该都使用了fp16/fp32等,这样就没开启int8量化; 3)如果lora也没有int8量化加载,那么我确实感觉可能需要进一步讨论。

zhangzhenyu13 commented 11 months ago

是的,这个safetensors是后来transformers版本推的特性

获取Outlook for Androidhttps://aka.ms/AAb9ysg


From: AlecHang @.> Sent: Thursday, January 4, 2024 2:34:40 PM To: zhangzhenyu13/llm3s-conatiner @.> Cc: Subscribed @.***> Subject: Re: [zhangzhenyu13/llm3s-conatiner] cutoff_size (Issue #3)

训练输出目录只有model.safetensors的问题在于transformers的版本,4.36.2就会这样,4.30.2就没问题

― Reply to this email directly, view it on GitHubhttps://github.com/zhangzhenyu13/llm3s-conatiner/issues/3#issuecomment-1876479001, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AFPJNJJUBDDK3AGT4FCKPOTYMZEQBAVCNFSM6AAAAABBLHK2POVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNZWGQ3TSMBQGE. You are receiving this because you are subscribed to this thread.Message ID: @.***>

Ishiki-Iroha commented 11 months ago

推理显存按说不会因为全量和非全量而变化。原因很可能如下: 1)lora精调是否保存了adapters仅仅,然后这个配置是int8量化主模型参数加载,所以会比较省略显存; 2)全量后,应该都使用了fp16/fp32等,这样就没开启int8量化; 3)如果lora也没有int8量化加载,那么我确实感觉可能需要进一步讨论。

非常感谢回复。目前还没有进行量化。对比原模型和微调后模型的config.json之后,发现微调后自动生成的模型config.json中use_cache设置为false,似乎会导致显存上升显著;

另外,目前我使用项目中的inference_model脚本进行推理的时候,发现显存占用随token的增加而线性增加。另一方面在推理完一个超长token输入样本之后,继续推理短token样本,占用的显存并不会回落,而是维持推理超长token样本时占用的显存直到整轮测试结束。以下是一些token与显存的测试数据: token 加载模型 1000 1600 2048 3000 4000 5500
显存(MB) 3300 3500 4700 5400 7200 9700 14000
Ishiki-Iroha commented 11 months ago

在每次推理前执行torch.cuda.empty_cache()可以保持一个显存较低的状态,但是这个清理也很耗时

zhangzhenyu13 commented 11 months ago

推荐看看vllm推理方案。