混合精度训练中的内存占用

news2024/11/20 6:33:53

结论:

在模型训练中,fp16会比fp32快很多,因此,一般会使用fp16的参数进行模型的前向和后向计算。然而,在进行梯度累加的时候,fp16往往会精度不够,无法满足计算需求。因此,会在反向计算的时候,采用fp32。假设模型一共有 M 个参数,则fp16的参数和梯度,一共需要 4M bytes,而fp32需要存参数、adam中的momentum 和 variances,一共是 12M​ bytes。因此,模型参数、梯度和优化器状态,一共会需要 16M bytes的存储[3]。
来源:https://zhuanlan.zhihu.com/p/647133493

补充说明:这里用到5份参数,而且如果这里不采用混合精度而是采用单精度,那就需要20M bytes

比如说7B的模型,就会需要12 * 7G内存,即84G

问题一、为什么进行模型的前后和后向计算时要fp16,而反向计算的时候要fp32?

回归本质:fp16与fp32的主要区别是fp16的表示范围小很多,而且精度更低;所以一定是存在fp16无法胜任的地方,即溢出和舍入:
范围表示数的大小
精度则为浮点数的小数位所能表达的位数
范围存在溢出是否的问题
精度存在舍入与否的问题

在这里插入图片描述
如果是1.0001就被会舍入
在这里插入图片描述
存在下溢现象。
在这里插入图片描述
图片来源:https://arxiv.org/pdf/1710.03740.pdf
模型训练的数值涉及三个模块:模型参数、梯度及中间变量(每层的输出);而梯度更新算法涉及优化算法,一般使用adam算法,就会包含momentum 和 variances;具体含义如下:

Adam是一种常用的优化算法,它结合了动量法和自适应学习率的优点。在Adam中,momentum和variances是两个重要的参数,它们分别用于计算梯度的一阶矩估计和二阶矩估计。

具体来说,momentum用于计算梯度的一阶矩估计,它类似于动量法中的动量参数,用于加速梯度下降的过程。在Adam中,momentum是一个指数加权移动平均值,它对历史梯度进行平均,从而减少梯度的方差,使得梯度下降更加平稳。

variances用于计算梯度的二阶矩估计,它类似于自适应学习率算法中的学习率参数,用于自适应地调整学习率。在Adam中,variances也是一个指数加权移动平均值,它对历史梯度的平方进行平均,从而估计梯度的方差,使得学习率可以自适应地调整。

通过使用momentum和variances,Adam算法可以自适应地调整学习率,并且可以加速梯度下降的过程,从而更快地收敛到最优解。

更详细的解释:
https://zhuanlan.zhihu.com/p/79887894
在这里插入图片描述

import torch
from torch import nn, optim
from torch.cuda.amp import autocast, GradScaler

# 定义模型
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc1 = nn.Linear(10, 20)
        self.fc2 = nn.Linear(20, 1)

    def forward(self, x):
        x = self.fc1(x)
        x = torch.relu(x)
        x = self.fc2(x)
        return x

# 定义数据和优化器
data = torch.randn(32, 10).cuda()
target = torch.randn(32, 1).cuda()
model = MyModel().cuda()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 定义自动混合精度
scaler = GradScaler()

# 训练模型
for epoch in range(10):
    optimizer.zero_grad()
    with autocast():
        output = model(data)
        loss = nn.functional.mse_loss(output, target)
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()

    print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, 10, loss.item()))
output:
Epoch [1/10], Loss: 1.0314
Epoch [2/10], Loss: 1.0246
Epoch [3/10], Loss: 1.0180
Epoch [4/10], Loss: 1.0116
Epoch [5/10], Loss: 1.0053
Epoch [6/10], Loss: 0.9991
Epoch [7/10], Loss: 0.9932
Epoch [8/10], Loss: 0.9874
Epoch [9/10], Loss: 0.9817
Epoch [10/10], Loss: 0.9762

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

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

相关文章

SOLIDWORKS等轴测剖切视图的创建技巧

在SOLIDWORKS工程图中,经常会用到等轴测剖切视图来显示零件或装配体的内部结构,下面介绍一下两种创建方式,供大家参考,以下图为例。 方法一 第一步,打开零件,创建一个切除拉伸的配置,该配置为 …

全网超细,Jenkins持续集成-自动化测试(详细整理)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 执行集成构建 持…

计算机top命令

top 快捷键 1 核心参数 1 1 参考资料 [1]. https://blog.csdn.net/weixin_45465395/article/details/115728520 [2].https://www.cnblogs.com/liushui-sky/p/13224762.html

为了规避风险,如何给大模型打水印?

大型语言模型,如最近开发的ChatGPT,可以撰写文件、创建可执行代码和回答问题,通常具有人类般的能力。 随着这些大模型的应用越来越普遍,越来越大的风险也显现了出来,它们可能被用于恶意目的。这些恶意目的包括&#xf…

uni-app选择器( uni-data-picker)选择任意级别

背景说明 uni-app 官方的插件市场有数据驱动选择器,可以用作多级分类的场景。引入插件后,发现做不到只选择年级,不选择班级(似乎,只能到最后子节点了)。 需求中,有可能选择的不是叶子。比如&a…

渣罐炉倾翻液压系统比例阀控制器

渣罐炉倾翻液压系统是一种用于渣罐炉倾翻的液压系统,由液压泵、油缸、阀组、油箱、管路等组成。 2. 启动液压泵,将液压油输送到油缸。 总之,渣罐炉倾翻液压系统具有操作简便、高效稳定等特点,适用于各种类型的渣罐炉倾翻。

SpringBoot+Vue开发笔记

参考:https://www.bilibili.com/video/BV1nV4y1s7ZN?p1 ----------------------------------------------------------概要总结---------------------------------------------------------- 1、MVC架构: View:与用户交互 Controller&…

浅谈下API初步认知

当我们谈论API,我们指的是应用程序接口(Application Programming Interface)。API允许不同的软件应用程序之间互相通信和交互。它定义了一组规定和协议,用于确定数据传输和请求的格式、方法和功能。 API的作用是在软件开发中提供一…

运动蓝牙耳机什么款式好、适合运动的蓝牙耳机推荐

夏天到了,越来越多的年轻人会选择在一天的忙碌之后通过简单的运动缓解疲劳。而在运动装备的选择上,除了常规的衣服、鞋之外,耳机也成为了当下年轻群体的必备项,尤其是在运动的过程中听听喜欢的音乐或者电台能够更好地放松身心。那…

Go init 顺序 使用建议

init函数的主要作用: 初始化不能采用初始化表达式初始化的变量。程序运行前的注册,例如初始化数据库链接。实现sync.Once功能。其他 init函数的主要特点: init函数先于main函数自动执行,不能被其他函数调用;init函数…

LeetCode每日一题Day3——1. 两数之和

✨博主:命运之光 🦄专栏:算法修炼之练气篇(C\C版) 🍓专栏:算法修炼之筑基篇(C\C版) 🐳专栏:算法修炼之练气篇(Python版) …

Java编程常用数据转换:String与int互转、Date与String互转、BigDecimal与int比较

一、String与Int互转 在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换。 String str "555555555"; int a Integer.parseInt(str); // 方式1 int b Integer.valueOf(str).intValu…

从虚拟到现实:数字孪生助力建筑创新

随着科技的不断进步,数字孪生技术正逐渐成为建筑行业的新宠。数字孪生是一种将实体世界与数字世界相结合的技术,通过将现实世界中的物体、系统或过程以数字化的方式进行建模和仿真,实现了真实世界与虚拟世界的互通。 在建筑行业中&#xff0c…

酷开系统 | 酷开科技,让数据变得更有价值!

身处信息时代,我们每个人时刻都在生成、传递和应用数据,数据已经成为了现代社会中宝贵的资源之一,而在人工智能领域,数据更是被称为人工智能的“燃料”。 而在AI的发展中,只有拥有高质量、多样性且充分代表性的数据集…

Sqli-labs1~65关 通关详解 解题思路+解题步骤+解析

Sqli-labs 01关 (web517) 输入?id1 正常 输入?id1 报错 .0 输入?id1-- 正常判断是字符型注入,闭合方式是这里插一句。limit 100,1是从第100条数据开始,读取1条数据。limit 6是读取前6条数据。 ?id1 order by 3-- 正常判断回显位有三个。?id…

途乐证券|医药板块走高,神奇制药、双成药业涨停,科源制药等拉升

医药板块3日盘中震动走高,截至发稿,睿智医药涨超15%,景峰医药、神奇制药、双成药业等涨停,誉衡药业、科源制药涨约7%,精华制药、赛托生物涨约6%。 途乐证券指出,医药商场当前仍处于磨底行情,但行…

手机商城免费搭之java商城 电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c bbc

​ 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前…

Kali搭建Suricata环境及使用方式

这个和上一个snort如出一辙,并且兼容snort的规则,有一个有的没的我就不赘述了,直接开整! 开整! 0x01 环境0x02 配置0x03 使用 0x01 环境 kali2021 && suricata apt install suricata #安装 suricata-updat…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 5

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

远程仓库的操作

一、远程仓库的操作命令 git remote # 查看当前项目关联的远程库 我事先关联了一个GitHub的远程仓库,关于如何关联远程仓库,可以看这篇文章远程仓库GitHub和Gitee_林涧泣的博客-CSDN博客 git remote add [仓库服务器名] [远程仓库地址] # 关联远程仓库…