小白入门的DeepSpeed原理和代码实现(一)训练的内存需求

这篇文章探讨了在多个GPU上分布式训练神经网络的技术,并测试了微软的DeepSpeed库提供的多种分布式训练优化。

一、训练的内存需求

本页的大部分内容将集中在减少训练神经网络所需的内存的技术上。因此,为了更好地理解和欣赏这些技术,我将首先分解训练过程中内存消耗的所有方式。

根据Sohoni等人的说法,我将使用以下术语来描述训练期间内存消耗的来源(Sohoni等人只描述了三个来源,但我将梯度内存和优化器内存分开,因为DeepSpeed中也做了同样的区分,稍后将展示):

  • 模型内存:存储模型权重所需的内存。
  • 梯度内存:存储每个模型权重梯度所需的内存。
  • 优化器内存:存储优化器所需的任何额外状态所需的内存。
  • 激活内存:存储在前向传递期间计算的中间值所需的内存。

测量四种内存消耗源

让我们现在看看如何测量这四种来源消耗的内存量,从一个简单的全连接神经网络开始:

model = torch.nn.Sequential(
    torch.nn.Linear(512, 1024),
    torch.nn.Linear(1024, 1024),
    torch.nn.Linear(1024, 1024),
    torch.nn.Linear(1024, 512)
)

要获得总的模型内存,我们计算模型中的参数数量,并乘以每个参数用来表示的字节数(在这种情况下是4个字节,因为每个权重是一个32位浮点数):

def get_model_memory(model: torch.nn.Module):
    """
    返回给定模型的内存使用情况
    """
    total_memory = 0
    for param in model.parameters():
        total_memory += param.numel() * param.element_size()
    return total_memory

print("模型内存:{:,} 字节".format(get_model_memory(model)))
模型内存:12,597,248 字节   

梯度内存与模型内存相同,因为在后向传递期间我们需要为每个权重存储梯度。

消耗的总优化器内存取决于训练期间使用的优化器类型。下表显示了PyTorch中一些流行的优化器所需的优化器内存,其中M_model代表模型内存[2]:

在这里插入图片描述

最后,要计算总的激活内存,我们需要计算在前向传递期间计算的隐藏层输出。有几种不同的方法可以做到这一点;这里,我们将递归地注入PyTorch前向Hook到每个子模块中以捕获该子模块的输出大小。

首先,我们定义了Hook以及一个简单的辅助类ActivationCounter,用于跟踪模型隐藏层输出的总大小:

class ActivationCounter:

    def __init__(self):
        self.activation_bytes = 0

    def add_activations(self, tensor):
        self.activation_bytes += tensor.numel() * tensor.element_size()

def activation_counter_hook(counter: ActivationCounter):

    def hook(self, input, output):
        counter.add_activations(output.data)

    return hook

接下来,我们定义一个函数,它将递归地将Hook注入到模型的每个子模块中:

def register_hooks_recursive(model, counter: ActivationCounter):
  for module in model.children():
      module.register_forward_hook(activation_counter_hook(counter))
      register_hooks_recursive(module, counter)

activation_counter = ActivationCounter()
register_hooks_recursive(model, activation_counter)

现在要找到激活内存消耗的总量,我们执行模型的一个前向传递,然后打印activation_counter.activation_bytes的值:

inputs = torch.randn(4, 512)
outputs = model(inputs)

# 因为Hook只捕获层输出,我们需要单独添加原始输入张量的大小
activation_counter.add_activations(inputs)

print("激活内存:{:,} 字节".format(
  activation_counter.activation_bytes
))
激活内存:65,536 字节   

计算密集神经网络模型内存和激活内存的完整脚本可以在GitHub仓库中找到:estimate_nn_memory.py

Transformer模型的内存需求

由于Rajbhandari, Samyam等人。(在他们的论文中介绍了DeepSpeed实现的许多训练优化)将实验集中在Transformer模型上,我想更好地了解这类模型的内存需求。

使用上述相同的方法,我计算了一个基本Transformer模型(详见附录A)的模型和激活内存,作为验证我估计Transformer模型内存的公式,以及Korthikanti, Vijay Anand等人提供的Transformer激活内存公式(都显示在下面):

在这里插入图片描述

给定以下条件:

n:层数
h:隐藏层大小
m:注意力头数
b:批量大小
l:序列长度


如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 2024行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方优快云官方认证二维码,免费领取【保证100%免费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值