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

似乎没有保存rotary_emb.inv_freq的权重 #58

Open
cristianoc20 opened this issue May 2, 2023 · 9 comments
Open

似乎没有保存rotary_emb.inv_freq的权重 #58

cristianoc20 opened this issue May 2, 2023 · 9 comments

Comments

@cristianoc20
Copy link

似乎没有保存rotary_emb.inv_freq的权重

@jiangjingyao
Copy link

是只有17M的文件生成吗

@cristianoc20
Copy link
Author

不是 大小是正常的 7B和33B的我都试过 我发现腾讯的框架除了rotary_emb.inv_freq以外的权重都会保存 看上去是因为这个inv_freq不是一个可学习的参数,可以自己计算,所以不存进去state_dict()(可能了省点模型保存的内存)
我的解决方案是把这个inv_freq使用pytorch的register注册进模型的state_dict()里面,这样模型保存的参数里面就有state_dict()了。但这样会导致deepspeed使用zero_to_fp32时不把inv_freq写进bin文件(因为inv_freq没有可学习的参数,deepspeed会把他当作buff不存进去 所以需要改一下zero_to_fp32文件 让deepspeed正确保存这个参数)

@ydli-ai
Copy link
Collaborator

ydli-ai commented May 4, 2023 via email

@cristianoc20
Copy link
Author

是的我理解他不需要存,但是我的需求是用腾讯的框架预训练出来一个权重,然后加载到另一个框架里面做微调,而现在像huggingface的Llama权重的读取是需要这个权重的,不存的话会报错,所以我才手动实现了

@cristianoc20
Copy link
Author

我刚看了你们的转换代码 个人建议你们可以选择直接注册进去state_dict()里面 这样就不用在转换脚本里再算一次了 毕竟训练里面都算一次了 干啥不直接存呢~

@jiangjingyao
Copy link

不是 大小是正常的 7B和33B的我都试过 我发现腾讯的框架除了rotary_emb.inv_freq以外的权重都会保存 看上去是因为这个inv_freq不是一个可学习的参数,可以自己计算,所以不存进去state_dict()(可能了省点模型保存的内存) 我的解决方案是把这个inv_freq使用pytorch的register注册进模型的state_dict()里面,这样模型保存的参数里面就有state_dict()了。但这样会导致deepspeed使用zero_to_fp32时不把inv_freq写进bin文件(因为inv_freq没有可学习的参数,deepspeed会把他当作buff不存进去 所以需要改一下zero_to_fp32文件 让deepspeed正确保存这个参数)

你这个训练使用的命令具体是哪个呢

@cristianoc20
Copy link
Author

不是 大小是正常的 7B和33B的我都试过 我发现腾讯的框架除了rotary_emb.inv_freq以外的权重都会保存 看上去是因为这个inv_freq不是一个可学习的参数,可以自己计算,所以不存进去state_dict()(可能了省点模型保存的内存) 我的解决方案是把这个inv_freq使用pytorch的register注册进模型的state_dict()里面,这样模型保存的参数里面就有state_dict()了。但这样会导致deepspeed使用zero_to_fp32时不把inv_freq写进bin文件(因为inv_freq没有可学习的参数,deepspeed会把他当作buff不存进去 所以需要改一下zero_to_fp32文件 让deepspeed正确保存这个参数)

你这个训练使用的命令具体是哪个呢

用的deepspeed那个

@yangzhipeng1108
Copy link

不是 大小是正常的 7B和33B的我都试过 我发现腾讯的框架除了rotary_emb.inv_freq以外的权重都会保存 看上去是因为这个inv_freq不是一个可学习的参数,可以自己计算,所以不存进去state_dict()(可能了省点模型保存的内存) 我的解决方案是把这个inv_freq使用pytorch的register注册进模型的state_dict()里面,这样模型保存的参数里面就有state_dict()了。但这样会导致deepspeed使用zero_to_fp32时不把inv_freq写进bin文件(因为inv_freq没有可学习的参数,deepspeed会把他当作buff不存进去 所以需要改一下zero_to_fp32文件 让deepspeed正确保存这个参数)

请问怎么修改zero_to_fp32文件 让deepspeed正确保存这个参数

@cristianoc20
Copy link
Author

如果用的zero3(zero2同理),在_get_fp32_state_dict_from_zero2_checkpoint中,处理buffer的时候遍历buffer的key value,把你刚才注册进去的那个freq的名字找到,把这个对应的key value存进去state_dict

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants