网站域名邮箱,曰本免费网站,中山网站建设华联在线,网站广告代码【Python】科研代码学习#xff1a;十七 模型参数合并#xff0c;safetensors / bin 前言解决代码知识点#xff1a;safetensors 和 bin 的区别#xff1f;知识点#xff1a;save_pretrained 还会新增的文件知识点#xff1a;在保存模型参数时#xff0c;大小发生了成倍… 【Python】科研代码学习十七 模型参数合并safetensors / bin 前言解决代码知识点safetensors 和 bin 的区别知识点save_pretrained 还会新增的文件知识点在保存模型参数时大小发生了成倍的变化 前言
众所周知LLM的模型参数一般保存在 .safetensors 或者 .bin 结尾的大文件 但是通过一个 RLHF 的一个训练后使用了 FSDP 分布式训练器 所以把文件参数保存在了 .pt 文件中 那么问题来了保存的参数我如何合并到模型里去做其他推理任务呢
解决代码
经过复杂的尝试和询问然后使用下面的几个方法就成功了 第一步加载初始的模型使用 .from_pretrained 即可加载本地模型的参数 第二步加载 policy.pt 里面的 state 的内容使用 model.load_state_dict 即可使用这些参数来覆盖原始模型的参数 第三步保存模型参数到文件夹使用 model.save_pretrained 即可
def FSDP_model_merge(model_path : str, pt_path : str, output_path : str):print(Loading Model)model LlamaForCausalLM.from_pretrained(model_path, torch_dtypetorch.float16)print(Loading Checkpoint)model.load_state_dict(torch.load(pt_path)[state])print(Saving Model)model.save_pretrained(output_path,safe_serializationTrue, torch_dtypetorch.float16)print(Done)知识点safetensors 和 bin 的区别
【知乎】 简单来说bin 是通用的二进制存储文件 safetensors 是更加安全的文件专门存储张量数据 所以这两者都可以存模型的参数如何设置保存的时候使用哪个格式 model.save_pretrained() 方法里面的 safe_serialization 设置成 True 的话就会用 safetensors 格式了注意不同 transformers 版本的该方法的 safe_serialization 的默认值是不同的较新的版本该值默认为 True较老的为 False看了下貌似对于文件保存的大小来说几乎没什么差异
知识点save_pretrained 还会新增的文件
在 model.save_pretrained 方法调用后在文件夹中其实还会新增/替换这几个文件 config.json generation_config.json model.safetensors.index.jsonmodel.safetensors.index.json 的文件主要是参数和文件的存储关系映射 以及可以从 total_size 中查看模型的参数大小 比如这里13476839424除以 1 0 9 10^9 109 之后为 13 13 13即该模型参数大小大约为 13 G 13G 13G 然后后面可以看到保存了哪些参数权重比如有 mlp.down_proj 等 generation_config.json 主要是生成任务的参数还有 transformers 库的版本号 config.json 比较重要是记录该模型的重要参数 有模型的架构 LlamaForCausalLM中间各种网络的参数词汇表大小等。
知识点在保存模型参数时大小发生了成倍的变化
这次就遇到了这个问题我一开始还以为是合并时两份参数加在一起而没有覆盖导致的 最终文件大小加倍了但最后是发现 torch_dtype 原本是 float16我直接保存的话类型变成了 float32因此文件大小翻倍了 在加载和保存处设置好数据类型即可。 【这启示我们对于精度类型还是得注意清楚的比如在训练的时候使用混合精度等问题】最终发现在model.safetensors.index.json 里面多了一个 self_attn.rotary_emb.inv_freq 参数但这个貌似对于内存不是特别影响应该问题是不大的 total_size 只打了7k多 并且它原本是参数分成了三份这次分成了两份这个也会有变化。