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

为什么fine-tune过程中loss会忽大忽小呢? #39

Closed
alisyzhu opened this issue Apr 6, 2023 · 17 comments
Closed

为什么fine-tune过程中loss会忽大忽小呢? #39

alisyzhu opened this issue Apr 6, 2023 · 17 comments
Labels
bug Something isn't working good first issue Good for newcomers

Comments

@alisyzhu
Copy link

alisyzhu commented Apr 6, 2023

13B llama + 70w开源语料,其中1w作为test,为什么fine-tune的loss最开始是1.0左右,后续就一会儿变得很大,一会儿变成0呢?是因为test集合相对于fine-tune的集合太小吗?
image

image

image

@Facico
Copy link
Owner

Facico commented Apr 6, 2023

@alisyzhu
感谢你提供这个问题。这个可能是bitsandbytes的问题,如果是V100用8bit加载很容易炸loss。想问一下你的显卡是V100吗,我们之前确实没有注意这个问题,V100是不支持8bit tensor core的,如下图。

图片

相关issue: issue1, issue2, issue3

还有一个问题,我想知道你用我们的generate、interaction等测试文件能生成正常的结果吗(我们推理文件也是自动load 8bit
的)

如果用V100的话,可以把load_in_8bit改成False,loss应该就不容易炸了。

@alisyzhu
Copy link
Author

alisyzhu commented Apr 6, 2023

是v100的,我之前就感觉配置环境的时候,这个bitsandbytes总是感觉不太正常,但本人对GPU不是很懂。因为一直感觉fine-tune不太正常,还没有generate和interaction。
如果我只能用v100fine-tune和generate的话,是不是把所有load_in_8bit的地方都设置成false就可以呢?那还需要配置bitsandbytes这个依赖包吗?
另外,我还想问下,如果不用8bit了,那么在后续还需要调用tools里的脚本做LLAMA的量化吗?一直没看懂这个量化什么时候需要做,有什么作用,我理解就是让模型变小的?

@alisyzhu
Copy link
Author

alisyzhu commented Apr 6, 2023

将fine-tune里的load_in_8bit设置为False,4个GPU就报
image

@rookiebird
Copy link

讲道理load_in_8bit=True的话,v100跑个程序应该会报错啊,我是一直报错的,后面改成了load_in_8bit=False 才正常,然后用了.half()来记载模型训练,否则32Gv100会报oom

@alisyzhu
Copy link
Author

alisyzhu commented Apr 6, 2023

但是改成load_in_8bit=False,报了OOM,我用了8个v100,也还是OOM,请问你是几个v100,数据量个batch_size多少呀,可以跑起来?
.half()是怎么执行的呀?

@alisyzhu
Copy link
Author

alisyzhu commented Apr 6, 2023

讲道理load_in_8bit=True的话,v100跑个程序应该会报错啊,我是一直报错的,后面改成了load_in_8bit=False 才正常,然后用了.half()来记载模型训练,否则32Gv100会报oom

请问是将finetune.py的这部分这样修改吗?
image

@rookiebird
Copy link

我没有用8个v100, 我是两个啊, 一个v100 是32G的, 是你这样改的,然后micro_batch_size 是4, 好像我记得默认也是4, batch_size 我没改

讲道理load_in_8bit=True的话,v100跑个程序应该会报错啊,我是一直报错的,后面改成了load_in_8bit=False 才正常,然后用了.half()来记载模型训练,否则32Gv100会报oom

请问是将finetune.py的这部分这样修改吗? image

@alisyzhu
Copy link
Author

alisyzhu commented Apr 6, 2023

我没有用8个v100, 我是两个啊, 一个v100 是32G的, 是你这样改的,然后micro_batch_size 是4, 好像我记得默认也是4, batch_size 我没改

讲道理load_in_8bit=True的话,v100跑个程序应该会报错啊,我是一直报错的,后面改成了load_in_8bit=False 才正常,然后用了.half()来记载模型训练,否则32Gv100会报oom

请问是将finetune.py的这部分这样修改吗? image

好的,我试试,感谢。我想问问你之前load_in_8bit=True的时候,v100报错是什么呀?我也有bug信息,但是能执行fine-tune,就是loss不对;可是我换成A100,好像bug信息也没变,但是按照硬件信息,A100是支持8int的呀 ~

@rookiebird
Copy link

我没有用8个v100, 我是两个啊, 一个v100 是32G的, 是你这样改的,然后micro_batch_size 是4, 好像我记得默认也是4, batch_size 我没改

讲道理load_in_8bit=True的话,v100跑个程序应该会报错啊,我是一直报错的,后面改成了load_in_8bit=False 才正常,然后用了.half()来记载模型训练,否则32Gv100会报oom

请问是将finetune.py的这部分这样修改吗? image

好的,我试试,感谢。我想问问你之前load_in_8bit=True的时候,v100报错是什么呀?我也有bug信息,但是能执行fine-tune,就是loss不对;可是我换成A100,好像bug信息也没变,但是按照硬件信息,A100是支持8int的呀 ~

没报错,看上去是个奇怪的bug, 但是我马上反应过来可能是load_in_8bit设置为True了,改了就好了,我推理的时候,generate.py 设置load_in_8_bit也不会报错

@Facico
Copy link
Owner

Facico commented Apr 6, 2023

@alisyzhu 把prepare_model_for_int8_training(model)去掉,然后在get_peft_model之后加上model.half()试试

@alisyzhu
Copy link
Author

alisyzhu commented Apr 6, 2023

我没有用8个v100, 我是两个啊, 一个v100 是32G的, 是你这样改的,然后micro_batch_size 是4, 好像我记得默认也是4, batch_size 我没改

讲道理load_in_8bit=True的话,v100跑个程序应该会报错啊,我是一直报错的,后面改成了load_in_8bit=False 才正常,然后用了.half()来记载模型训练,否则32Gv100会报oom

请问是将finetune.py的这部分这样修改吗? image

好的,我试试,感谢。我想问问你之前load_in_8bit=True的时候,v100报错是什么呀?我也有bug信息,但是能执行fine-tune,就是loss不对;可是我换成A100,好像bug信息也没变,但是按照硬件信息,A100是支持8int的呀 ~

没报错,看上去是个奇怪的bug, 但是我马上反应过来可能是load_in_8bit设置为True了,改了就好了,我推理的时候,generate.py 设置load_in_8_bit也不会报错

请问是这种bug信息吗?
image

我按照上面改了model的half部分,但还是OOM,哭了 ~

@alisyzhu
Copy link
Author

alisyzhu commented Apr 6, 2023

@alisyzhu 把prepare_model_for_int8_training(model)去掉,然后在get_peft_model之后加上model.half()试试

还是不行,
image
image
image

@alisyzhu
Copy link
Author

alisyzhu commented Apr 6, 2023

是不是load_in_8bit=False了,v100就跑不了13B的模型了。。。一直OOM

@Facico
Copy link
Owner

Facico commented Apr 6, 2023

@alisyzhu 我们没拿V100跑过。粗略估算,7B+8bit差不多是1B1G,13B+16bit可能就是1B4G,你可以拿之前开8bit(虽然会有问题)的显存*2算算。

如果实在需要跑,需要使用deepspeed+zero2/3 offload的技术,在huggingface的trainer上很好加,你可以试试(可以参考这些博客)。由于使用zero offload代码会跑的很慢,当时我们就没有考虑,如果之后有需求会加上的。或者如果你成功加上跑上了,我们也会非常感谢你的贡献。

@Facico
Copy link
Owner

Facico commented Apr 8, 2023

@alisyzhu 我好像忘记问你mirco batch size开的多少了,你可以试试开到1

@lucasjinreal
Copy link

v100 7B是可以训练的,只是int8太慢了(可能是huggface里面int8很慢)。
可以训的组合是 fp16 load + deepspeed offload

@lyccyl1
Copy link

lyccyl1 commented Dec 11, 2023

This may be due to hardware reasons. On some hardware, the quantization model is not compatible with fp16. You can try set fp16=False. It works for me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests

5 participants