第十三课 高效神经网络训练

news/2025/3/15 13:54:08/文章来源:https://www.cnblogs.com/dingxingdi/p/18773172

先来复习一下各个类型在计算机中的表现形式

  • \(32\)位浮点数
    image
    绿色数位越多,所能表示的范围越大(既可以表示更小的数,也可以表示更大的数);蓝色数位越多,所能表示的精度越高
  • \(16\)位浮点数
    image
    好处是可以节省内存。如果我们正在训练神经网络,但是突然发现内存不够了,有哪些解决方法呢?
    • 我们就可以把所有\(32\)位浮点数转换成\(16\)位浮点数。当然这个样子会导致一些问题,如下
      • 很小的数会变成\(0\),很大的数会变成NaN.容易导致梯度消失和梯度爆炸
      • 精度更小:在半精度下,\(1.0001\)会变成\(1\).我们可以使用如下的方法来查看类型的信息
        image
        主要是关注eps,这个数代表\(1\)能加的不被舍入到\(1\)的最小的数。也就是说,如果\(1\)加上了比这个数还小的数,那么就会变成\(1\)(或者理解成,比eps小的数就会直接变成\(0\)
    • 同时使用\(16\)位浮点数和\(32\)位浮点数来解决保存的参数精度不足的问题,如下
      image
      注意,我们的参数都是存储在FP32里面的,只是在传播过程中要将FP32转换成FP16再进行传播(第六步就是为了下一次的前向传播做准备);但是这个样子显然也会导致梯度;正确的做法还要结合放大策略,如下
      image
      Pytorch实现如下
      image
      但是现在还存在一个问题,就是缩放太大了会导致梯度爆炸(注意现在是FP16,表示的范围较小),有没有什么方法不用梯度缩放呢?为了保证空间不炸,只有一个方法,就是牺牲精度
      image
      虽然精度下降了,但是在实践中这个完全可行。Pytorch实现如下
      image
      但是我觉得这个代码写得有一点奇怪啊,autocastdtype默认是FP16的,如果要使用BFP16就需要显式指定,为什么这里不用指定呢?
      下面来看一下效果
      image
      BFP16比FP64还高的原因:前者具有正则化效果

下面我们进入多GPU训练的场景。先来介绍一下单GPU训练
image
Model parameters就是前文说的传播过程中的FP16
多GPU其实比较简单。首先将数据分成若干份,在每个GPU上进行前向传播和反向传播,然后每个GPU就会得到不同的梯度;我们再将每个GPU的梯度进行合并(如求和或者平均)得到一个统一的梯度(这种操作叫做全局规约操作),再去更新所有的GPU(由上面的过程不难知道,更新完的每个GPU都是一模一样的)
image
通信开销就是在不同GPU之间转移数据的开销。上述方法叫做分布式数据并行
上述方法有一个非常明显的缺点,就是内存占用太大了
image
我们可以使用一个叫做ZeRO的技术解决,这个技术一共有三种类型。核心思想是让每个GPU不再需要维持所有状态,而是进行分片处理,然后使用通信进行同步

  • 类型一:优化器状态分片
    image
    image
    注意每一块GPU都是包含所有的前向传播的FP16参数的(只是FP32的主权重分散在各个GPU中),所以可以对自己分到的数据集进行完整的传播(也可以计算所有参数在自己分到的这个数据集上的梯度;这个操作叫做归约分散),然后每个GPU向其他GPU请求自己包含的主权重的梯度(注意这个梯度在不同的GPU上不同,因为每个GPU分到的是不同的数据集)从而对自己的主权重进行更新,然后再通过通信同步状态(这个操作叫做全收集)
    上述三种MPI操作的关系如下
    image
    所以我们无代价地节约了内存,所以任何时候都应该使用ZeRO
  • 类型二:优化器状态和梯度分片
    image
    image
    image
  • 类型三:完全分片数据并行
    image
    image
    image
    一共有\(16\)个GPU和\(16\)个参数(包括填充)
    image
    image
    image

对三种类型的总结如下
image

我们现在再来看一下GPU显存里面到底存储了什么东西
image
所以有些时候我们想要加大批量大小是不行的
我们调参的基本工作流程图如下
image
那么为什么我们要关注高效训练呢?
image
image
image
下面介绍全微调(从视频00:43:00开始一直结束,后面还有个低秩什么的,没学过,所以没看)
image
image

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

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

相关文章

Arduino-多彩音乐蜂鸣器

利用Arduino Uno实现简易多彩音乐播放器。最近开始接触Arduino,利用它可以搭建一些电子系统,实现相关功能。本文所要介绍的就是利用全彩LED和蜂鸣器,搭建一个简易的多彩音乐播放器。 器材准备Arduino UNO R3开发板一块 5mm全彩LED(共阴极)一只 无源蜂鸣器一只 1k\(\Omega\…

82.7K star!大气炫酷UI开源项目,超级火!

shadcn/ui 是一款基于 Radix UI 和 Tailwind CSS 构建的现代化 UI 组件库,专为追求设计品质与开发效率的开发者打造。不同于传统组件库,它提供完全可定制的组件代码模板,让开发者既能享受开箱即用的便利,又能保持对设计系统的完全掌控。嗨,大家好,我是小华同学,关注我们…

20241415 实验一 《Python程序设计》实验报告

20241415 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2414 姓名: 赵邵宁 学号:20241415 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序…

前后端分离开发:如何高效调试API?有工具 vs 无工具全解析

在前后端分离的开发模式中,API 的调试是非常重要的一部分。特别是使用 Java 作为后端开发时,保证接口的功能正确性、性能稳定性,以及响应数据的准确性,都是前端和后端高效协作的关键。本文将结合接口调试的实际开发场景,探讨在有调试工具和没有调试工具两种情况下,如何实…

服务器SSH 仅密钥登录

前言 随着我服务器上Alist资源的增多,服务器【本身】这个存放着Alist内所有密码(虽然都是随机生成的)的存在就显得非常的脆弱。 尽管我的ssh密码选择了随机生成并交给电脑记住,但是服务器被攻破导致全部密码我都得改一遍的后果我承担不起。 另注:因为上传到云盘的重要资料…

JDK7-日历类--java进阶day07

1.Calendar类 用于获取或者修改时间,之前学的Date类,获取和修改时间的方法已经过时2.Calendar对象的创建 Calendar类里面有很多抽象方法,如果创建对象就要全部重写,所以不能直接创建 我们可以使用多态解决创建对象的问题,由于其子类对象也较难创建,所以我们使用下图中的方…

Vue3-DeepSeek-Chat流式AI对话|vite6+vant4+deepseek智能ai聊天助手

原创新作vue3.5+deepseek+vant4+vant4仿DeepSeek-R1流式输出ai聊天对话。 deepseek-vue3-chat : 实战2025智能大模型ai会话,基于Vue3+Vite6+OpenAI集成接入DeepSeek聊天小助手模板,支持流式打字输出效果、浅色/暗黑主题模式、代码高亮显示、针对移动端+PC端适配处理。🐬使用…

Sections 多列混排

学习点@Reusable 装饰器 WaterFlow瀑布流容器 模块组件 代码讲解效果图@Reusable 装饰器使用场景 @Reusable 是一个在 HarmonyOS ArkTS 中使用的装饰器,主要用于自定义组件的复用。从 API version 10 开始,@Reusable 装饰器得到了支持。它的主要功能是当一个标记为 @Reusable…

后缀数组(SA)学习笔记(倍增算法)

倍增求SA后缀数组是一个非常好的东西。一开始看不出来这个东西有什么用,但是它非常的有用。(以下 \(N\) 为字符串长度) 有了后缀数组,我们就可以在 \(O(N \log N)\) 的时间内:得到所有后缀的字典序关系。(最基本的功能) 求出任意两个子串的最长公共前缀 (LCP)。 求出字符…

Chat2DB 数据库客户端邀请码

推荐一款超好用的AI数据库管理工具Chat2DB,支持22种数据库,包括国产的达梦、OpenGuass、OceanBase、TiDB等,还有非关系型MongoDB、Redis等,快来试试吧! 🔥 官网:https://chat2db-ai.com/ 🔥 邀请码:622888 邀请码介绍:https://docs.chat2db-ai.com/docs/settings/i…

基于Java的全栈入门学习路线

Java全栈JavaSE数据库前端JavaWebSSM框架Linux学完以上可独立开发,下面是微服务协同开发 SpringBootSpringCloudHadoop