DLA 神经网络的极限训练方法:gradient checkpointing

gradient checkpointing

        一般来说,训练的过程需要保存中间结果(不管是GPU还是CPU)。前向传播根据输入(bottom_data)计算输出(top_data),后向传播由top_diff计算bottom_diff(如果某个变量打开梯度进行训练的话)。top和bottom是包含数据和梯度的两个结构体,整个网络的每层top和bottom在训练的过程中都会保存,这消耗了大量的内存。

        如果不保存这些变量,每次传播时重新分配和计算,会大大减少内存的使用量,但是也会使得网络的训练时间无限延长。为了平衡这两个矛盾,论文Training Deep Nets with Sublinear Memory Cost 使用亚线性内存成本训练深度网络:我们提出了一种系统方法来减少深度的内存消耗 神经网络训练。具体来说,我们设计了一种成本高昂的算法 O(sqrt(n)) 内存来训练 n 层网络,只需计算成本 每个小批量的额外前向传递。每隔 sqrt(n)保留一个检查点的feature map。

CODE

  • https://pytorch.org/docs/stable/checkpoint.html
// https://discuss.pytorch.org/t/trying-to-understand-torch-utils-checkpoint/95224
import torch
from torch import nn
from torch.utils.data import Dataset, DataLoader
import numpy as np
from tqdm.notebook import tqdmfrom torch import optim
import torchvision.models as models
from torch import nnCHECKPOINT = True
BATCH_SIZE = 32
dev = "cuda:0"class ImageDataset(Dataset):def __init__(self,length = 100000,size = 244):self.length = lengthself.size = 244def __len__(self):return self.lengthdef __getitem__(self,idx,display = False):return torch.from_numpy(np.random.randn(2,3,self.size,self.size))
train = ImageDataset()
trainloader = DataLoader(train,batch_size = BATCH_SIZE,num_workers = 24,pin_memory = True
)resnet = models.resnet50(pretrained = False)class MODEL(nn.Module):def __init__(self,model):super(MODEL,self).__init__()self.model = modelself.LR = nn.Linear(1000,1000)def forward(self,x):if CHECKPOINT == False:o1 = self.model(x[:,0])o2 = self.model(x[:,1])else:o1 = torch.utils.checkpoint.checkpoint(self.model,x[:,0])o2 = torch.utils.checkpoint.checkpoint(self.model,x[:,1])return torch.mean((self.LR(o1)-o2)**2)resnet = MODEL(resnet).to(dev)optimizer = optim.SGD(resnet.parameters(),lr = .001)for T in tqdm(trainloader):out = torch.mean(resnet(T.float().to(dev)))optimizer.zero_grad()out.backward()optimizer.step()

CG

在这里插入图片描述

  • https://github.com/merrymercy/dtr-prototype

ZeRO-Offload

  • https://arxiv.org/pdf/2101.06840.pdf 大规模模型训练一直是少数人的比赛场地 需要复杂的模型重构和访问昂贵的 GPU 集群。ZeRO-Offload 通过使 几乎每个人都可以访问大型模型训练。它可以训练模型 单个 GPU 上超过 13 亿个参数,与 GPU 相比,大小增加了 10 倍 流行的框架,如PyTorch,它不需要任何模型就可以做到这一点。 从数据科学家改变或牺牲计算效率。 ZeRO-卸载通过卸载数据和计算来实现大型模型训练 中央处理器。为了保持计算效率,它旨在最大限度地减少数据 移入/移出 GPU,减少 CPU 计算时间,同时最大化内存 节省 GPU 成本。因此,ZeRO-Offload可以在单个上实现40 TFlops / GPU。 NVIDIA V100 GPU 用于 10B 参数模型,与单独使用 PyTorch 的 30TF 相比 对于 1.4B 参数模型,可以训练而不会耗尽的最大参数模型 的记忆。ZeRO-Offload 还设计为在以下情况下在多个 GPU 上进行扩展 可用,可在多达 128 个 GPU 上提供近乎线性的加速。此外,它可以 与模型并行性协同工作,训练超过 70 亿的模型 单个 DGX-2 盒子上的参数,与模型尺寸相比增加了 4.5 倍 单独使用模型并行性。通过将计算和内存效率与 易于使用,ZeRO-Offload 使大规模模型训练民主化,使其成为 即使是数据科学家也可以访问,只需访问一个 GPU。

梯度累积

        训练时大的batch一般能得到更稳定的训练效果,梯度累积训练方法是一种用于训练深度神经网络的技术,旨在减少显存需求并提高训练效果。在传统的训练方法中,模型的参数是通过单个批次(batch)的数据计算得到的梯度平均值进行更新。但在梯度累积训练中,模型的参数更新是通过多个批次的梯度累积得到的。

以下是梯度累积训练的基本步骤:

  1. 设置梯度累积步数(accumulation steps),它决定了要累积多少个批次的梯度。

  2. 初始化模型的参数。

  3. 对于每个训练批次(batch):

    • 使用当前批次的数据进行前向传播计算损失。
    • 对损失进行反向传播计算梯度。
    • 累积当前批次的梯度到之前的梯度值上。
  4. 当累积达到设置的步数时,将累积的梯度应用于模型参数的更新:

    • 通过将累积的梯度平均化来获得参数的更新值。
    • 使用更新值来更新模型的参数。
  5. 重复步骤3和4,直到完成所有的训练批次。

梯度累积训练的主要优势在于能够降低每个批次所需的显存量,允许在具有有限显存的硬件上训练更大的模型。此外,梯度累积还可以改善模型的收敛性,提高模型的性能和泛化能力。

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

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

相关文章

Android 获取网络连接状态新方法

一. 问题背景 Android12上,有的app模块判断当前网络的类型和连接状态时,还是使用的旧的API,导致返回的结果不准确,影响代码逻辑判断,本篇文章就这一问题,整理一下判断网络类型和连接状态的新方法。 二. 原因…

CC++内存管理与模版初阶

目录 四、C&C内存管理 (一)C/C内存分布 (二)C内存管理方式 1、new/delete操作内置类型 2、new和delete操作自定义类型 (三)operator new与operator delete函数 (四)new和delete的实现原理 1、内置类型 2、自定义类型 (五)定位new表达式(placement-new) (六)八股文 1、n…

华为发布数字资产继承功能

在华为开发者大会2023(HDC.Together)上,华为常务董事、终端BG CEO、智能汽车解决方案BU CEO余承东正式发布了数字资产继承功能,HarmonyOS提供了安全便捷的数字资产继承路径。 在鸿蒙世界中,我们每个人在每台设备、应用…

Git从远程仓库中删除文件,并上传新文件

目录 删除: 拉取远程分支的更新: ​编辑 首先查看git状态: ​编辑 删除文件并提交版本库: 提交: 上传新文件: 首先查看git状态: 提交到暂存区: 提交到版本库: 上…

windows环境下如何更改pip安装的默认位置

1.查看配置信息 python -m site2.查看配置文件位置 python -m site -help3.修改配置文件 USER_SITE "D:\\soft\\Anaconda\\Lib\\site-packages" USER_BASE "D:\\soft\\Anaconda\\Scripts"如果遇到文件无法保存情况,请给用户增加权限。 4.…

Netty框架自带类DefaultEventExecutorGroup的作用,用来做业务的并发

一、DefaultEventExecutorGroup的用途 DefaultEventExecutorGroup 是 Netty 框架中的一个类,用于管理和调度事件处理器(EventExecutor)的组。在 Netty 中,事件处理是通过多线程来完成的,EventExecutor 是处理事件的基…

uniapp scroll-view 隐藏滚动条

/*清除滚动条 - 适配安卓*/::-webkit-scrollbar {width: 0;height: 0;color: transparent;}/*清除滚动条 - 适配IOS*/::-webkit-scrollbar {display: none;}

ffmpeg下载安装教程

ffmpeg官网下载地址https://ffmpeg.org/download.html 这里以windows为例,鼠标悬浮到windows图标上,再点击 Windows builds from gyan.dev 或者直接打开 https://www.gyan.dev/ffmpeg/builds/ 下载根据个人需要下载对应版本 解压下载的文件,并复制bin所在目录 新打开一个命令…

clickhouse调研报告2

由Distributed表发送分片数据 clickhouse分区目录合并 clickhouse副本协同流程 clickhouse索引查询逻辑 clickhouse一级索引生成逻辑(两主键) clickhouse的data目录下包含如下目录: [root@brfs-stress-01 201403_10_10_0]# ll /data01/clickhouse/data total 4 drwxr-x---…

stable-diffusion-webui 界面汉化

本教程通过安装 sd-webui-bilingual-localization 插件来达到汉化目的, 项目地址为:https://github.com/journey-ad/sd-webui-bilingual-localization 一、安装插件 先进入插件安装界面 在搜索栏搜索 zh_CN Localization 中文语言包, 项目地址: https://github.com/dtlnor/st…

数据结构--最小生成树

数据结构–最小生成树 连通图 \color{red}连通图 连通图的生成树是 包含图中全部顶点的一个极小连通子图 \color{red}包含图中全部顶点的一个极小连通子图 包含图中全部顶点的一个极小连通子图。 若图中顶点数为n,则它的生成树含有 n-1 条边。对生成树而言&#xff…

Elasticsearch:如何创建 Elasticsearch PEM 和/或 P12 证书?

你是否希望使用 SSL/TLS 证书来保护你的 Elasticsearch 部署? 在本文中,我们将指导你完成为 Elasticsearch 创建 PEM 和 P12 证书的过程。 这些证书在建立安全连接和确保 Elasticsearch 集群的完整性方面发挥着至关重要的作用。 友情提示:你可…