【Python】科研代码学习:十七 模型参数合并,safetensors / bin

【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_dtype=torch.float16)print("Loading Checkpoint")model.load_state_dict(torch.load(pt_path)['state'])print("Saving Model")model.save_pretrained(output_path,safe_serialization=True, torch_dtype=torch.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.json
  • model.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多
    并且它原本是参数分成了三份,这次分成了两份,这个也会有变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华纳云:如何选择适合自己需求的备份服务器?

备份服务器是企业和个人保障数据安全和灾难恢复的重要设备之一,而选择适合自己需求的备份服务器是确保数据备份效果的关键一步。以下是一些关于如何选择适合需求的备份服务器的指南: 1. 确定数据量和备份频率: 首先,您需要确定您的…

面试经典150题——移除元素

面试经典150题 day2 题目来源我的题解方法一 双指针 题目来源 力扣每日一题;题序:27 我的题解 方法一 双指针 使用两个指针left和right分别指向最终数组的末尾和最终数组不需要的元素的最左侧。当nums[left]等于val,则将nums[right]替换nu…

mysql数据库死锁 处理方法

MySQL数据库死锁是一个常见的问题,通常发生在多个事务试图以不同的顺序锁定资源时。当两个或多个事务相互等待对方释放资源,就形成了死锁。以下是关于MySQL数据库死锁的删除方法,以及针对代码开发问题和报错问题的解答。 一、MySQL数据库死锁…

基于单链表的通讯录C语言实现

关于单链表的详细了解请见博主的另一篇博客&#xff0c;本文旨在对单链表进行应用&#xff0c;采用C语言编写。 http://t.csdnimg.cn/iBpFa 一、驱动层 1.1 SList.h #pragma once#include<stdio.h> #include<stdlib.h> #include<assert.h> #include"…

pytest教程-25-生成覆盖率报告插件-pytest-cov

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest多重断言插件pytest-assume,本小节我们讲解一下pytest生成覆盖率报告插件pytest-cov。 测量代码覆盖率的工具在测试套件运行时观察你的代码&#xff0c;并跟踪哪些行被运行&#xff0c;…

10:00面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

【我的小工具】生成React页面类

有了数据表的结构信息&#xff0c;就能生成React 的页面类&#xff0c;快捷方便。 生成界面如下&#xff1a; 生成的React FrmUser.js页面如下&#xff1a; 只需再写里面的操作逻辑代码。

Claude使用教程

claude 3 opus面世后&#xff0c;网上盛传吊打了GPT-4。网上这几天也已经有了许多应用&#xff0c;但竟然还有很多小伙伴不知道国内怎么用gpt&#xff0c;也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…

C语言操作符详解(三)

一、表达式求值 1.1整型提升 C语言中整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升。 如何进行整型提升呢&#xff1f; 1. 有符号整数提升是按…

不入耳开放式耳机哪个品牌好?2024年热销榜前五名品牌推荐

为何开放式耳机近年来如此火爆&#xff1f;首先&#xff0c;开放式耳机以其开放式的声学设计&#xff0c;打破了传统耳机的局限&#xff0c;为用户带来了更加自然、宽广的音质体验。其次&#xff0c;随着音乐文化的普及和人们对高品质生活的追求&#xff0c;开放式耳机作为高端…

QSettings保存配置信息,读取配置信息

保存配置 QSettings setting("config.ini",QSettings::IniFormat); setting.beginGroup("para"); setting.setValue("database","test"); setting.setValue("hostName","localhost"); setting.setValue("us…

PHP 转换HTML 为节点数组 ,可用于uni-app的rich-text渲染

在Web开发中&#xff0c;HTML文档的结构和内容往往需要通过编程方式进行操作和解析。PHP DOMDocument类是一个强大的工具&#xff0c;可以将HTML转换为可操作的对象结构&#xff0c;本文将介绍一下使用PHP的DOMDocument类将HTML转换为节点数组的过程。htmlToNodes函数将HTML字符…

4.9学习总结

一.File类 (一).概述: File 类的对象代表操作系统的文件&#xff08;文件、文件夹&#xff09;,File 类提供了诸如&#xff1a;创建文件对象代表文件&#xff0c;获取文件信息&#xff08;大小、修改时间&#xff09;、删除文件、创建文件&#xff08;文件夹&#xff09;等功…

HarmonyOS开发实例:【数字管家app】

一&#xff0e;概述 本应用是基于RK3399开发板&#xff0c;使用OpenHarmony3.1-Release开发的应用。通过OpenHarmony的分布式技术&#xff0c;使多人能够一起画画。 1.应用运行效果图&#xff1a; 2.分布式画板使用示意图 如上图所示&#xff0c;用户1、用户2在各自本地端进行…

Stack_经典例题_最小栈

题目&#xff1a; 题目分析&#xff1a; 在满足栈的特点的同时&#xff0c;还需要设计一个接口&#xff0c;就是获取栈内的最小元素&#xff01; 解题思路&#xff1a; 因为是栈&#xff0c;所以不好遍历的&#xff01;所以这题的方式不能采用遍历的方式&#xff0c;如果采取…

在FMCOS CPU卡上建立简单的测试PBOC支付环境

本文目的在于快速搭建一个简易的支付环境&#xff0c;方便进行电子钱包的圈存、消费测试。因此省略了许多数据文件及安全机制。 请勿将这个测试支付环境应用在生产系统中&#xff0c;否则可能带来极大的安全隐患。 建立简易的测试PBOC支付环境 在根目录&#xff08;3F00&…

C#使用Exchange Web服务(/EWS/exchange.asmx)发送邮件

使用Exchange Web服务发送邮件 发送代码&#xff0c;Mail类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography.X509Certificates; using System.Net; using System.Net.Security; using Microsof…

C++中的异常机制

1.异常是什么&#xff1f; 在 C 中&#xff0c;异常处理是一种用于处理程序运行时可能发生的错误或异常情况的机制。当某些异常情况发生时&#xff0c;程序可以通过抛出异常来通知调用栈&#xff0c;并且可以通过异常处理代码来捕获和处理这些异常。 2.检测异常的三个步骤 检查…

分布式锁-redission可重入锁原理

5.3 分布式锁-redission可重入锁原理 在Lock锁中&#xff0c;他是借助于底层的一个voaltile的一个state变量来记录重入的状态的&#xff0c;比如当前没有人持有这把锁&#xff0c;那么state0&#xff0c;假如有人持有这把锁&#xff0c;那么state1&#xff0c;如果持有这把锁的…

DELL VMWare R730 R740 R750 iDRAC配置与ESXI安装部署

VMware vCenter Server与ESXI版本兼容对照表 ESXI下载 VMware vcenter7.0许可证 Esxi7.0许可证 VSAN 7.0许可证 DELL VMWare R730 R740 R750 iDRAC配置与ESXI安装部署 vmware vcenter server 7.0 安装教程 1. 进入BIOS界面配置iDRAC网络 开机按F10&#xff0c;开机点击F10选择…