使用deepspeed,transformers,safetensor中常见的训练精度,共享权重问题

使用deepspeed可能需要注意精度问题

在这里插入图片描述

混合精度,LayerNorm

虽然deepspeed有混合精度训练的功能,但是对于网络上各种奇奇怪怪的代码的DIY转化中,他还是很弱小的。它的精度问题,使用deepspeed如果模型中有部分模型使用的是half精度,那么整个模型都会使用half精度,即使是nn.LayerNorm这样新创立的层。因为我们通常可能在计算权重的时候使用half,在LayerNorm的时候使用float32这样更好的归一化,防止 梯度 因为 精度 的问题消失或者爆炸。所以通常建议使用float32精度进行计算。但是这样的强制数据类型转化,在deepspeed中就会因为将模型的全部精度都降低而难以实现。
这个难题可以解决,但是需要特别设置,尤其是原来代码没有这样设置的时候。

class LayerNorm(nn.LayerNorm):
    def __init__(self, normalized_shape, eps=1e-5, elementwise_affine=True):
        super(LayerNorm, self).__init__(normalized_shape, eps=eps, elementwise_affine=elementwise_affine)
        # 确保权重和偏置初始化为float32,即使之后模型转换为fp16
        if self.elementwise_affine:
            self.weight.data = self.weight.data.float()
            self.bias.data = self.bias.data.float()
    
    def forward(self, x: torch.Tensor):
        # print(f"这是是layernorm")
        # embed()
        orig_type = x.dtype
        # ret = super().forward(x.type(torch.float32))
        ret = super().forward(x)
        return ret.type(orig_type)

一个很好的检查模型计算精度的方法是将模型的权重精度打印出来,单纯的显示出来模型并不能显示出来计算精度。

def print_model_parameters(model):
    for name, param in model.named_parameters():
        print(name, param.size(), id(param))
        ## 我更喜欢使用 .dypte 来直接查看精度
print_model_parameters(your_model_instance)

共享张量(Shared Tensors)

safetensor可并没有那么好,它保存不了某些特别的自定义的共享张量。共享张量是PyTorch中一种用于减少内存使用并提高计算效率的特性。通过共享相同的数据缓冲区,多个张量可以引用相同的内存空间,而不需要复制数据。在transformers模型中,嵌入层(embeddings)和语言模型头(lm_head)经常共享权重,这样做既节省了参数数量,又使得梯度更有效地传播到模型的不同部分。共享向量是很多多模态领域训练的精髓。

共享张量说白了就是模型的参数传递,这种传递是直接赋值,而不是用另一个模型参数去计算。这种现象很常见就是一个张量数据是传递一致的,但是在模型的运算传递多次使用到。

layer1 = nn.Linear(10, 10)
layer2 = nn.Linear(10, 10)

# 明确共享layer1的权重和偏置到layer2
layer2.weight = layer1.weight
layer2.bias = layer1.bias

这里报错误实际上和我实例化两个参数有关,实际上可以避免,但是模型原来的设计者可没有想到这一点。
报错的显示

RuntimeError: 
            Some tensors share memory, this will lead to duplicate memory on disk and potential differences when loading them again: 
            [{'encoder_decoder.cmn.linears.0.weight', 'encoder_decoder.model.cmn.linears.0.weight'},
             {'encoder_decoder.model.cmn.linears.0.bias', 'encoder_decoder.cmn.linears.0.bias'}, 
             {'encoder_decoder.cmn.linears.1.weight', 'encoder_decoder.model.cmn.linears.1.weight'},
              {'encoder_decoder.cmn.linears.1.bias', 'encoder_decoder.model.cmn.linears.1.bias'}, 
              {'encoder_decoder.model.cmn.linears.2.weight', 'encoder_decoder.cmn.linears.2.weight'}, 
              {'encoder_decoder.cmn.linears.2.bias', 'encoder_decoder.model.cmn.linears.2.bias'}, 
              {'encoder_decoder.cmn.linears.3.weight', 'encoder_decoder.model.cmn.linears.3.weight'},
               {'encoder_decoder.model.cmn.linears.3.bias', 'encoder_decoder.cmn.linears.3.bias'}].
            A potential way to correctly save your model is to use `save_model`.
            More information at https://huggingface.co/docs/safetensors/torch_shared_tensors
       0%|          | 1/410000 [00:34<3883:03:26, 34.10s/it]        

使用原始的pytorch存储格式就好使了,而transformers版本大一点的,如4.35,4.36它们在使用transformers.train函数调用自动保存时,保存的结果都是safetensor,但是safetensor应该是为了节约空间,做了一些现在还不完善的处理。导致出现了上面需要显示保存或者修改继承的方式。

安装库错误的问题

需要在集群上经常安装库,在报错的时候,尤其是下面这种,缺乏CUDA编译器的问题,直接使用module ava, load需要的CUDA库往往就能解决问题。

Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting deepspeed==0.9.5
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/99/0f/a4ebd3b3f6a8fd9bca77ca5f570724f3902ca90b491f8146e45c9733e64f/deepspeed-0.9.5.tar.gz (809 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 809.9/809.9 kB 2.9 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... error
  error: subprocess-exited-with-error

  × python setup.py egg_info did not run successfully.
  │ exit code: 1
  ╰─> [8 lines of output]
      Traceback (most recent call last):
        File "<string>", line 2, in <module>
        File "<pip-setuptools-caller>", line 34, in <module>
        File "/tmp/pip-install-uc05hpfj/deepspeed_b69d07d91ac4496684f65ba796150c78/setup.py", line 82, in <module>
          cuda_major_ver, cuda_minor_ver = installed_cuda_version()
        File "/tmp/pip-install-uc05hpfj/deepspeed_b69d07d91ac4496684f65ba796150c78/op_builder/builder.py", line 41, in installed_cuda_version
          assert cuda_home is not None, "CUDA_HOME does not exist, unable to compile CUDA op(s)"
      AssertionError: CUDA_HOME does not exist, unable to compile CUDA op(s)
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
module ava
module load cuda/7/11.8  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

0基础如何进入IT行业?

前言 俗话说得好“隔行如隔山”&#xff0c;每个人从事自己陌生的行业都是十分艰难的。但现在网上不是流行一种这样的说法吗&#xff1f;360行&#xff0c;行行转IT。我觉得这个说的真的挺对的&#xff0c;因为从我身边认识的同事确实有很多大学并非是计算机科学专业的&#x…

【项目新功能开发篇】开发编码

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

练习 20 Web [HCTF 2018]admin

本题由于GitHub上的源码已经不见了&#xff0c;看了wp也没法复现&#xff0c;只用用保利破解的方式做题。 其他方法还有&#xff1a; Flask Session 伪造 https://blog.csdn.net/qq_46918279/article/details/121294915 暴力破解 打开后看到右上角有菜单栏 然后进入register界…

【THM】Nmap Post Port Scans(后端口扫描)-初级渗透测试

介绍 本房间是 Nmap 系列的最后一个(网络安全简介模块的一部分)。在这个房间中,我们重点关注端口扫描之后的步骤:特别是服务检测、操作系统检测、Nmap脚本引擎和保存扫描结果。 Nmap实时主机发现Nmap基本端口扫描Nmap高级端口扫描Nmap后端口扫描在本系列的第一个房间中,我…

​网络socket编程(二)——面向流的TCP编程及测试(SocketTool)、Wireshark软件使用

目录 一、书接上回&#xff08;select()函数使用注意事项&#xff09; 二、面向流(TCP)的socket编程 2.1 TCP服务端编程和测试 2.1.1 TCP服务器原理流程图 2.1.2 TCP服务端编程实战 2.1.3 测试 2.2 TCP客户端编程和测试 三、Wireshark抓包软件的使用 3.1 Wireshark是什…

vue 数据埋点

最近菜鸟做项目&#xff0c;需要做简单的数据埋点&#xff0c;不是企业级的&#xff0c;反正看渡一的视频&#xff0c;企业级特别复杂&#xff0c;包括但不限于&#xff1a;错误收集、点击地方、用户行为…… 菜鸟的需求就是简单收集一下用户的ip、地址、每个界面的访问时间&a…

doccano标注工具|为机器学习建模做数据标注

目录 一、标记流程 二、配置环境 2.1 安装 2.2 运行doccano 三、案例 3.1 创建项目 3.2 上传数据 3.3 定义标签 3.4 添加成员 3.5 开始标注 3.6 导出数据 3.7 导出数据 doccano doccano是开源的数据…

在ssh 工具 Linux screen会话中使用鼠标进行上下滚动

经过几次发现 除xshell外&#xff0c; WindTerm finalshell MobaXterm 都是进入会话后&#xff0c;发现其界面无法滚动屏幕向上查看 如果想要在Linux screen会话中使用鼠标进行上下滚动。必须首先进入该screen的回滚(scrollback模式)才能进行上下滚动 第一步&#xff…

小白理智进入IT行业

职业测试 &#x1f514; 0基础请先按照以下步骤做一遍&#xff0c;试试自己的毅力 1️⃣ 请在b站搜索王佩丰vba&#xff0c;然后试着看一下 2️⃣ 看完视频&#xff0c;有两种结果 &#x1f62d; 视频看到一半就终止&#xff0c;代码只会复制粘贴。 &#x1f389; 看完全部视…

MHA高可用-解决MySQL主从复制的单点问题

目录 一、MHA的介绍 1&#xff0e;什么是 MHA 2&#xff0e;MHA 的组成 2.1 MHA Node&#xff08;数据节点&#xff09; 2.2 MHA Manager&#xff08;管理节点&#xff09; 3&#xff0e;MHA 的特点 4. MHA工作原理总结如下&#xff1a; 二、搭建 MySQL MHA 实验环境 …

mongoDB 优化(2)索引

执行计划 语法&#xff1a; db.collection_xxx_t.find({"param":"xxxxxxx"}).explain(executionStats) 感觉这篇文章写得很好&#xff0c;可以参考 MongoDB——索引&#xff08;单索引&#xff0c;复合索引&#xff0c;索引创建、使用&#xff09;_mongo …

软考高级架构师:CISC (复杂指令集计算机) 和 RISC (精简指令集计算机)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

开源博客项目Blog .NET Core源码学习(13:App.Hosting项目结构分析-1)

开源博客项目Blog的App.Hosting项目为MVC架构的&#xff0c;主要定义或保存博客网站前台内容显示页面及后台数据管理页面相关的控制器类、页面、js/css/images文件&#xff0c;页面使用基于layui的Razor页面&#xff08;最早学习本项目就是想学习layui的用法&#xff0c;不过最…

flink1.18源码本地调试环境

01 源码本地调试环境搭建 1. 从github拉取源码创建本地项⽬ https://github.com/apache/flink.git 可以拉取github上官⽅代码 https://github.com/apache/flink.git GitHub - apache/flink: Apache Flink 2. 配置编译环境 ctrlaltshifts &#xff08;或菜单&#xff09;打…

UE5启用SteamOS流程

一、安装OnlineSubsystemSteam插件 1、在UE里安装OnlineSubsystemSteam 2、设置默认开始地图 3、设置DefaultEngine.ini文件&#xff1a; 打开项目根目录/Config/DefaultEngine.ini文件 打开官网的配置说明 复制并粘贴到该文件中 4、设置运行模式 5、测试 确保Steam平台已…

Ansible批量操作(上传文件、删除文件指定文件内容、执行sh文件等)

官方网站 https://www.ansible.com/ 一、Ansible 简介 1、Ansible是新出现的自动化运维工具&#xff0c;完全基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行…

【详解】Windows系统安装Nginx及简单使用

【详解】Windows系统安装Nginx及简单使用 一、Nginx是什么&#xff1f; “Nginx 是一款轻量级的 HTTP 服务器&#xff0c;采用事件驱动的异步非阻塞处理方式框架&#xff0c;这让其具有极好的 IO 性能&#xff0c;时常用于服务端的反向代理和负载均衡。”Nginx 是一款 http 服…

RocketMQ是什么?

文章目录 一、RocketMQ是什么&#xff1f;二、RocketMQ 应用场景三、RocketMQ 优缺点1.优点2、缺点 一、RocketMQ是什么&#xff1f; RocketMQ 是一款纯 java、分布式、队列模型的消息中间件&#xff0c;支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。 二、Rocke…

软件杯 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习YOLO抽烟行为检测 该项目较为新颖&#xff0c;适合作为竞赛课…

BGP-(as-path-filter)

BGP-as-path-filter&#xff0c;缺省 as-path-filter&#xff0c;正则表达式&#xff0c;as-path过滤器&#xff0c;对于BGP的as-path属性实际上可以看成是一个包含空格的字符串。 特点&#xff1a;1、通过对BGP路由的as-path属性进行匹配达到对BGP路由的过滤。 2、在route-…