Huggingface Trainer:Removed shared tensor while saving问题的解决

bug概述:【踩坑记录📝】Removed shared tensor while saving.
简单来说,这个bug的危害是trainer.save()无法正确存储权重。这篇博文的作者也给出了两种处理方法,但要么要改transformers版本,要么要包裹Trainer类,太麻烦了。

我使用transformers版本4.38.0,deepspeed zero 0/1/2复现了这篇博文所述bug,研究得知bug的具体原因后,给出以下解决思路:

第一步:获得正确的state_dict

trainer调用_save方法时,默认入参state_dict=None,然后_save方法通过self.model.state_dict()获得state_dict,导致报错。原因是此时self.model是通过accelerator加载的,state_dict需要用self.accelerator.get_state_dict(self.model)的方式获得。

解决思路是提前在调用_save之前提前通过self.accelerator.get_state_dict(self.model)把state_dict取出,然后直接带state_dict入参来调用_save方法,实现权重存储。

我在这里借鉴了QWen-VL仓库finetune.py的写法,参考代码如下:

def safe_save_model_for_hf_trainer(trainer: Trainer, output_dir: str, bias="none"):"""Collects the state dict and dump to disk."""# check if zero3 mode enabledif trainer.args.hf_deepspeed_config.config['zero_optimization']['stage'] == 3:state_dict = trainer.model_wrapped._zero3_consolidated_16bit_state_dict()else:state_dict = trainer.accelerator.get_state_dict(trainer.model)if trainer.args.should_save and trainer.args.local_rank == 0:trainer._save(output_dir, state_dict=state_dict)

第二步:顺利把state_dict存在文件里

trainer在初始化时,args.save_safetensors要设置为false,来让_save方法内部调用model.save_pretrained时不存model.safetensors文件,避免这处调用报错。

第三步:顺利加载权重文件

以上两步做好后,可以保证正确的state_dict在pytorch_model.bin里存下来,而不至于丢失。
再次使用这份权重时,为了从pytorch_model.bin而不是model.safetensors加载权重,可以在from_pretrained的时候要设置use_safetensors=False;也可以把加载目录的model.safetensors直接删掉。

做好以上几步就可以完美解决这个bug.

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

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

相关文章

【面试题】等保(等级保护)的工作流程

等保(等级保护)的工作流程主要包括以下几个步骤,以下将详细分点介绍: 系统定级: 确定定级对象:根据《信息系统等级保护管理办法》和《信息系统等级保护定级指南》的要求,确定需要进行等级保护的…

CRMEB开源商城系统Java版:新零售时代的技术创新与实战案例

一、引言 随着新零售概念的兴起和电子商务的飞速发展,企业对商城系统的需求也日益多元化和个性化。CRMEB开源商城系统Java版,凭借其先进的技术架构、丰富的功能模块和灵活的扩展性,成为了众多企业构建和扩展自身电商业务的首选。本文将对CRM…

【Android】我的手机在...自己下载...那个(浅析Intent基础运用)

【Android】我的手机在…自己下载…那个(浅析Intent基础运用) 在Android开发中,Intent(意图)是一个非常重要的概念。它不仅仅是用于在应用程序的各个组件之间进行通信的工具,也是启动新的Activity、Servic…

表组装示例

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDO…

光伏能源圈

2021年&#xff0c;新型电力系统之下&#xff0c;中国已形成了两网五大六小的电力新格局&#xff1a; 两大电网&#xff1a;国家电网、南方电网 五大电力央企&#xff1a;国家能源投资集团、中国华能集团、中国华电集团、中国大唐集团、国家电力投资集团。 六小豪门&#xf…

python判断语句

目录 布尔类型和比较运算符if语句的基本格式if else 语句if elif else 语句判断语句的嵌套 布尔类型和比较运算符 1、布尔类型 bool布尔类型只有两个结果&#xff1a;真或假 布尔类型的字面量&#xff1a; True 表示真&#xff08;是、肯定&#xff09; False 表示假&#x…

一切前端概念,都是纸老虎

4、listener可以通过 store.getState() 得到当前状态。如果使用的是 React&#xff0c;这时可以触发重新渲染 View。 function listerner() { let newState store.getState(); component.setState(newState); } 对比 Flux 和 Flux 比较一下&#xff1a;Flux 中 Store 是…

ChatGPT API教程在线对接OpenAI APIKey技术教程

一、OpenAI基本库介绍 您可以通过 HTTP 请求与 API 进行交互&#xff0c;这可以通过任何编程语言实现。我们提供官方的 Python 绑定、官方的 Node.js 库&#xff0c;以及由社区维护的库。 要安装官方的 Python 绑定&#xff0c;请运行以下命令&#xff1a; pip install open…

【总结】在SpringBoot项目中如何动态切换数据源、数据库?(可直接CV)

注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 前言 本文参考若依源码&#xff0c;介绍了如何在SpringBoot项目中使用AOP和自定义注解实现MySQL主从数据库的动态切换&#xff0c;当从库故障时&#xff0c;能自动切换到主库&#xff0c;确…

1-什么是自动驾驶?

自动驾驶&#xff08;Autonomous Driving&#xff09;是指利用计算机系统来实现车辆的自主控制&#xff0c;使车辆能够在没有人类司机的情况下安全行驶的技术。自动驾驶车辆通常配备有多种传感器&#xff0c;如雷达&#xff08;Radar&#xff09;、激光雷达&#xff08;Lidar&a…

集群开发学习(三)修改用户模块(git 使用,局域网设代理)

git 使用 参考&#xff1a;https://blog.csdn.net/weixin_60033897/article/details/136016074 在服务器端创建公钥私钥 git config --global user.email "1686660735qq.com" git config --global user.name qinliangql git config --global -l # 查看信息# 这样可…

Java-内部类成员内部类

类的五大成员 属性 方法 构造方法 代码块 内部类 什么是内部类&#xff1f; 在一个类的里面&#xff0c;再定义一个类。 举例&#xff1a;在A类的内部定义B类&#xff0c;B类就被称为内部类 内部类表示的事物是外部类的一部分 内部类单独出现没有任何意义 内部类的访问特点 1.…

java中的this关键字—调用本类属性

在java中&#xff0c;当成员变量与局部变量发生重名问题时&#xff0c;需要使用this关键字分辨成员变量与局部变量 这里首先说使用this关键字调用本类中的属性 下面是一段代码 lass Student6{private String name;private int age;public Student6(String name,int age) {na…

YOLOv8模型代码学习

1.参考文献 链接1 2.网络模型解析 2.1卷积神经单元&#xff08;conv.py&#xff09; 在该文件中定义了yolov8网络中的卷积神经单元&#xff0c;位置如图所示。 def autopad(k, pNone, d1): # kernel(卷积核), padding(填充), dilation(扩张)"""Pad to same…

解决Java中的InstantiationException异常的技术指南

解决Java中的InstantiationException异常的技术指南 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;InstantiationException异常是开…

Python中位运算详解

✨前言&#xff1a; 在Python中&#xff0c;位运算用于直接操纵数值的二进制位。以下是Python中的几种位运算符&#xff0c;每个位运算符的功能及其使用实例&#xff1a; ✨按位与&#xff08;AND&#xff09; - & 当两个操作数的位都为1时&#xff0c;结果的相应位才是…

Nginx日志管理之错误日志配置

Nginx 的错误日志可以帮助用户及时判断 Nginx 配置及运行时出错的原因&#xff0c;错误日志也可以通过 Nginx 内置指令进行配置&#xff0c;但不支持格式定义。配置指令如下表所示。 说明 错误日志指令组成主指令error_log作用域main、http、mail、stream、server、location默…

坐标传送指令

目录 主城传送 联盟 部落 中立 副本传送 旧世界&#xff08;Vanilla 1.0&#xff09; 燃烧的远征&#xff08;TBC 2.0&#xff09; 巫妖王之怒&#xff08;WLK 3.0&#xff09; 大灾变&#xff08;CTM 4.0&#xff09; 熊猫人之谜&#xff08;MOP 5.0&#xff09; 德…

Xlua三方库Android编译出错解决办法

Xlua三方库Android编译出错解决办法 最近听老师的热更教程&#xff0c;讲到xlua编译android平台会报错&#xff0c;也是看了老师的博客&#xff0c;按照方法去解决&#xff0c;然而问题并没有解决。应该是因为代码更新或者版本不一样&#xff0c;在此简单记录一下解决过程。 参…

Node.js 事件循环的工作流程

Node.js 的事件循环由六个主要阶段组成&#xff0c;每个阶段都有一个或多个回调队列。事件循环依次遍历这些阶段&#xff0c;并在每个阶段执行相应的回调函数。具体的流程如下&#xff1a; Timers&#xff08;计时器阶段&#xff09;&#xff1a; 执行已到期的 setTimeout 和 s…