在多机多卡训练时,保存的文件无法读取,报错文件已经损坏

news2024/11/27 12:54:09

问题描述:多机多卡训练保存了optimizer.pt文件,但是该文件在被读取时显示已经损坏。
原来的报错:

Traceback (most recent call last):
  File "/mnt/petrelfs/tongjingqi/train-moe/smoe/entrypoint/cpt_fpt.py", line 280, in <module>
    main()
  File "/mnt/petrelfs/tongjingqi/train-moe/smoe/utils/notification.py", line 146, in wrapper_sender
    raise ex
  File "/mnt/petrelfs/tongjingqi/train-moe/smoe/utils/notification.py", line 95, in wrapper_sender
    value = func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/petrelfs/tongjingqi/train-moe/smoe/entrypoint/cpt_fpt.py", line 265, in main
    train_result = trainer.train(resume_from_checkpoint=checkpoint)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/petrelfs/tongjingqi/anaconda3/envs/moeenv/lib/python3.11/site-packages/transformers/trainer.py", line 1539, in train
    return inner_training_loop(
           ^^^^^^^^^^^^^^^^^^^^
  File "/mnt/petrelfs/tongjingqi/anaconda3/envs/moeenv/lib/python3.11/site-packages/transformers/trainer.py", line 1752, in _inner_training_loop
    self.control = self.callback_handler.on_train_begin(args, self.state, self.control)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/petrelfs/tongjingqi/anaconda3/envs/moeenv/lib/python3.11/site-packages/transformers/trainer_callback.py", line 353, in on_train_begin
    return self.call_event("on_train_begin", args, state, control)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/petrelfs/tongjingqi/anaconda3/envs/moeenv/lib/python3.11/site-packages/transformers/trainer_callback.py", line 397, in call_event
    result = getattr(callback, event)(
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/petrelfs/tongjingqi/train-moe/smoe/callbacks/save_model.py", line 134, in on_train_begin
  File "/mnt/petrelfs/tongjingqi/anaconda3/envs/moeenv/lib/python3.11/site-packages/torch/serialization.py", line 798, in load
    with _open_zipfile_reader(opened_file) as opened_zipfile:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/petrelfs/tongjingqi/anaconda3/envs/moeenv/lib/python3.11/site-packages/torch/serialization.py", line 283, in __init__
    super().__init__(torch._C.PyTorchFileReader(name_or_buffer))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: PytorchStreamReader failed reading zip archive: invalid header or archive is corrupted

对bug进行最小化的复现:

>>> import torch
>>> torch.load("outputs/cpt-moe-fpt-test_lr_change-1811148/optimizer.pt")
outputs/cpt-moe-fpt-test_lr_change-1811148/optimizer.pt _is_zipfile: True
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/mnt/petrelfs/tongjingqi/anaconda3/envs/moeenv/lib/python3.11/site-packages/torch/serialization.py", line 798, in load
    with _open_zipfile_reader(opened_file) as opened_zipfile:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/petrelfs/tongjingqi/anaconda3/envs/moeenv/lib/python3.11/site-packages/torch/serialization.py", line 283, in __init__
    super().__init__(torch._C.PyTorchFileReader(name_or_buffer))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: PytorchStreamReader failed reading zip archive: invalid header or archive is corrupted

造成错误的保存代码:

    def on_save(self, args: TrainingArguments, state: TrainerState, control: TrainerControl, **kwargs):
        optimizer = kwargs['optimizer']
        optimizer_state = optimizer.state_dict()
        save_path = os.path.join(args.output_dir, OPTIMIZER_NAME)
        torch.save(optimizer_state, save_path)

原因:在多机多卡训练时,每个卡的进程都会保存这个文件,如果多个卡同时写文件,就会造成文件损坏。

找出bug的方法:首先尝试用最简单的方法复现出bug,当时报错是在自定义文件读取函数中发生的,为了排除是自定义文件读取函数的问题,尝试直接使用命令行使用torch.load库函数读取文件,果然复现了这个bug。之后为了排除是文件保存函数torch.save()的问题,做了torch.save()的最小化实现,发现可以正常保存和读取,说明不是库函数版本等环境问题。于是将问题范围缩小到自定义文件保存函数上面。
最终发现在保存文件中插入的print函数执行了16次,说明文件被反复的写入,推测可能是多进程写入的冲突导致文件损坏。

修改方法:
在函数开头加入判断,只有全局rank为0的进程才执行保存,这样只会保存一份,就不会出现多进程同时写入冲突导致文件损坏的问题了。

 def on_save(self, args: TrainingArguments, state: TrainerState, control: TrainerControl, **kwargs):
        if os.environ.get("RANK", "0") == "0":
            optimizer = kwargs['optimizer']
            optimizer_state = optimizer.state_dict()
            save_path = os.path.join(args.output_dir, OPTIMIZER_NAME)
            torch.save(optimizer_state, save_path)

解决问题后,文件果然可以正常读:
在这里插入图片描述

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

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

相关文章

Android Aidl跨进程通讯(三)--进阶使用

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为2478字&#xff0c;预计阅读6分钟 前言 Android的AIDL使用和异常报错都已经介绍过了&#xff0c;今天这篇还是在原来的Demo基础上加入几个AIDL的进阶使用方法。 】 AIDL进阶使用 微卡智享 in,out,inout的使…

定时线程池原理解析

基本使用 ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来在给定的延迟之后运行任务&#xff0c;或者定期执行任务。 public class ScheduledThreadPoolExecutorTest {public static void main(String[] args) {ScheduledThreadPoolExecutor threadPoolExecu…

QT DAY7

主要完成多人聊天室&#xff0c;注册与登录使用sql3数据库进行对密码的保存&#xff0c;避免了用户重复登录、错误密码登录、重复注册的问题&#xff0c;之后使用TCP通信&#xff0c;连接上服务器后可在聊天室多人交流

怎么处理zk或redis脑裂

很极端场景会出现脑裂 什么是分布式的脑裂 怎么理解zk脑裂 就是ZK&#xff0c;与客户端可能因为网络原因&#xff0c;客户端A还在跑着后续程序&#xff0c;而zk与客户端之前的心跳断了&#xff0c;此zk就把这节点给删除了&#xff0c;这时另一个客户会加锁成功&#xff0c;就样…

[Java]异常

目录 1.异常的概念与体系结构 1.1异常的概念 1.1.1算术异常 1.1.2数组越界异常 1.1.3空指针异常 1.2异常的体系结构 1.3异常的分类 2.异常的处理 2.1 防御式编程 2.2异常的抛出 2.3异常的捕获 2.3.1 异常声明throws 将光标放在抛出异常方法上&#xff0c;alt Insert …

咖啡店小程序:吸引顾客的创新营销手段

近日&#xff0c;“酱香拿铁”的大火让大家再次把目标聚焦在年轻人都喜欢的咖啡上。现在咖啡已经成为年轻一代的社交硬通货&#xff0c;咖啡店也遍地开花。而随着移动互联网的快速发展&#xff0c;咖啡店小程序已经成为了各大咖啡店主的选择&#xff0c;因为它提供了便捷的方式…

【Leetcode-面试经典150题-day22】

目录 97. 交错字符串 97. 交错字符串 题意&#xff1a; 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 …

便捷、快速、稳定、高性能!以 GPU 实例演示 Alibaba Cloud Linux 3 对 AI 生态的支持 | 龙蜥技术

编者按&#xff1a;日前&#xff0c;Alibaba Cloud Linux 3 为使 AI 开发体验更高效&#xff0c;提供了一些优化升级&#xff0c;本文为“Alibaba Cloud Linux 3 AI 能力介绍”系列文章预告篇&#xff0c;以 GPU 实例为例&#xff0c;为大家演示 Alibaba Cloud Linux 3 对 AI 生…

Vue + Element UI 前端篇(五):国际化实现

Vue Element UI 实现权限管理系统 前端篇&#xff08;五&#xff09;&#xff1a;国际化实现 国际化支持 1.安装依赖 执行以下命令&#xff0c;安装 i18n 依赖。 yarn add vue-i18n $ yarn add vue-i18n yarn add v1.9.4 warning package-lock.json found. Your project …

数据分析必知的统计知识——区间估计(其四)

4. 区间估计 还以为你被上节课的内容唬住了~终于等到你&#xff0c;还好没放弃&#xff01; 本节我们将说明两个问题&#xff1a;总体均值 μ \mu μ 的区间估计和总体比例 p ˉ \bar{p} pˉ​ 的区间估计。 区间估计经常用于质量控制领域来检测生产过程是否正常运行或者在…

机车整备场数字孪生 | 图扑智慧铁路

机车整备场是铁路运输系统中的重要组成部分&#xff0c;它承担着机车的维修、保养和整备工作&#xff0c;对保障铁路运输的运维和安全起着至关重要的作用。 随着铁路运输的发展、机车技术的不断进步&#xff0c;以及数字化转型的不断推进&#xff0c;数字孪生技术在机车整备场…

【Nginx23】Nginx学习:响应头与Map变量操作

Nginx学习&#xff1a;响应头与Map变量操作 响应头是非常重要的内容&#xff0c;浏览器或者客户端有很多东西可能都是根据响应头来进行判断操作的&#xff0c;比如说最典型的 Content-Type &#xff0c;之前我们也演示过&#xff0c;直接设置一个空的 types 然后指定默认的数据…

OPC UA Tunnel提高了OPC Classic通信的安全性

2023年8月22日&#xff0c;Softing工业自动化推出了dataFEED OPC Suite 5.30版本。该版本增加了两项新功能&#xff1a;OPC UA Tunnel和InfluxDB数据库连接。 &#xff08;OPC UA Tunnel提高了OPC Classic通信的安全性&#xff09; | OPC UA Tunnel——用于提高OPC Classic通信…

日志框架Slf4j作用及其实现原理

目录 1 设计模式门面模式2 slf4j源码解析 1 设计模式门面模式 设计模式之门面模式与装饰器模式详解和应用&#xff1a;https://blog.csdn.net/ZGL_cyy/article/details/129073521 slf4j是门面模式的典型应用&#xff0c;因此在讲slf4j前&#xff0c;我们先简单回顾一下门面模…

前端日期比较大小(超简单版,不需要转换时间戳)

思路&#xff08;把日期转换为Number类型进行比较&#xff09; 效果如图&#xff1a; 第一步&#xff1a;如果获取到的日期是 &#xff1a;"2023-08-03 00:00:00" 用 timesss.split( )[0] // .split( ) 中间有个空格哦 timesss是自己数据的变…

nlp系列(7)实体识别(Bert)pytorch

模型介绍 本项目是使用Bert模型来进行文本的实体识别。 Bert模型介绍可以查看这篇文章&#xff1a;nlp系列&#xff08;2&#xff09;文本分类&#xff08;Bert&#xff09;pytorch_bert文本分类_牧子川的博客-CSDN博客 模型结构 Bert模型的模型结构&#xff1a; 数据介绍 …

解决Android U无法通过adb安装应用(Caller has no access to session -1)的问题

在Android U&#xff08;14&#xff09;上&#xff0c;对通过adb安装应用做了限制。默认的情况下&#xff0c;当执行以下命令的时候 adb install XXX.apk会提示执行异常 Performing Streamed Install adb: failed to install XXX.apk: Exception occurred while executing in…

java面试之ThreadLocal问题

什么是ThreadLocal,它的基本用法是什么 简单来说就是能在多线程中保持变量独立的线程对象 不用Threadlocal多线程访问同一个变量会出现的问题 package com.pxx;/*** Created by Administrator on 2023/9/3.*/ public class Demo1 {private String v1;public String getV1() …

群晖 DS918通过CISCO SG250 LACP 链路聚合效果不佳的问题解决

问题表现 使用的是CISCO交换机打开LACP 链路聚合&#xff0c;且DS918上完成接口聚合并配置为平衡TCP模式后。通过IPREF测速整体网络性能仅能达到300Mbps左右。 问题解决 检查CISCO交换机LAG配置中&#xff0c;针对DS918的接口组是否正确配置了流量配置。请按照如下图所示&#…

易云维®医院后勤管理系统软件利用物联网智能网关帮助实现医院设备实现智能化、信息化管理

近年来&#xff0c;我国医院逐渐意识到医院设备信息化管理的重要性&#xff0c;逐步建立医院后勤管理系统软件&#xff0c;以提高信息化管理水平。该系统是利用数据库技术&#xff0c;为医院的中央空调、洁净空调、电梯、锅炉、医疗设备等建立电子档案&#xff0c;把设备监控、…