【PyTorch][chapter 28] 揭秘 Transformer:缩放定律指南

概括

       我们介绍了 LLM 的各种缩放定律,研究了模型损失如何随着训练数据和参数数量的增加而变化。讨论包括对用于解释 LLM 缩放定律的 IsoLoss 轮廓和 IsoFLOPs 切片的解释,从而为优化计算资源提供了见解。

       最后,我们讨论了 FLOP 和 FLOPS 的概念,它们分别衡量计算量和速度。以 GPT-4 或 Llama3 为例,我们阐明了训练 LLM 所涉及的复杂性。在我们的下一篇博客文章中,我们将探讨使用模型并行或数据并行等技术以及微调 LLM 的缩放定律来大规模训练 LLM 的策略,从而进一步深入了解高效的大规模训练技术。


目录:

  1.     缩放定律简介
  2.     OpenAI 和 DeepMind 的实证
  3.     Sample-Efficient LLMs
  4.     Appendix 


一  缩放定律

   论文:《Scaling Laws for Neural Language Models》

              https://arxiv.org/pdf/2001.08361

          各大云服务提供商和众多公司正在大力投资收购数十万个 GPU 集群并利用海量训练数据来开发大型语言模型 (LLM),这已不足为奇。为什么模型越大越好?对于 LLM 而言,下一个 token(1 个 token 约为 0.75 个单词)预测的丢失是可预测且平稳的。事实证明,您只需要知道两个关键变量即可估计其准确性:

     模型中的参数总数 (N) 和用于训练模型的文本 token 的大小 (D)

     参数数量反映了模型学习和表示数据中复杂关系的能力,而训练数据量则使模型能够从更多种类的示例和上下文中学习。

仅使用这两个变量(即 N 和 D),我们就可以预测 LLM 在下一个标记预测任务中的损失。随着我们在更多数据上训练更大的模型,我们继续看到准确性的提高。然而,Transformer 的神经网络架构在过去 7 年中进行了适度修改。我们希望未来的研究能够提出更优化的架构,因为 LLM 以耗能和耗数据而闻名。

LLM 的缩放定律揭示了模型质量如何随着其规模、训练数据量和计算资源的增加而变化这些见解对于应对训练大型模型的复杂性以及做出明智的资源分配决策至关重要。

因此,了解这些扩展规律对于优化 LLM 的开发和部署是必需的,以确保有效利用资源来实现所需的性能水平。

此外,过度拟合的风险与模型大小与数据集大小的比例密切相关建议 D ≥ 5 x 10³ N^(0.74) 以避免模型过度拟合(参见 OpenAI论文中的公式 4.4 )。训练曲线往往遵循可预测的幂律模式,允许根据当前的训练进度粗略预测未来的表现。

 

二  OpenAI 和 DeepMind 的实证实验

        

      从根本上说,研究人员正在试图回答 LLM 缩放定律的问题:

      在以 FLOP、浮点运算衡量的受限计算预算的情况下,模型大小N和训练数据大小D(以令牌数量衡量)的最佳组合是什么,以实现最低损失?

    计算预算有多种形式:PF-天(10¹⁵ FLOP/秒 x 24 小时 x 3600 秒/小时,总计 8.64x10¹⁹ FLOP)是最常见的单位之一。有关 FLOP 的更多详细信息,请参阅附录 1。

人们进行了各种实验来研究语言模型的缩放规律,涉及不同的模型大小、数据集大小和其他因素,例如:

  • 模型大小(N):   范围从 768 到 15 亿个非嵌入参数。
  • 数据集大小(D):从 2200 万到 230 亿个标记不等。
  • 模型形状:            包括深度、宽度、注意力头数量和前馈维度的变化。
  • 上下文长度:
  •               主要为 1024,一些实验使用较短的长度。请注意,人们可能会从各种论文或代码实现中看到上下文长度、上下文窗口大小或块大小。它们都指的是同一件事,即转换器在训练期间看到的最长的连续标记序列,并且可以一次推理。本博客文章中的代码使用块大小。

训练变量:

  • 测试交叉熵损失(L):表示模型的性能。
  • 计算(C):用于训练模型的计算资源。

       尽管这些实验已有近 4 年历史,但它提供了对 LLM 培训要求的深刻理解。当 OpenAI 研究人员研究 LLM 时,有两个重要发现引人注目:

   

首先:    规模对模型损失的影响比模型架构的影响更为明显。规模是指用于训练的参数数量(N)、数据集的大小(D)和计算资源(C,以 FLOP 为单位,如附录 1 中所述)。这些因素共同对模型损失的降低程度产生的影响比架构细节(即改变前馈比、长宽比、注意头尺寸等)更大,如图 2 所示。这意味着增加模型的大小、使用更广泛的数据集和分配更多的计算能力可能会比仅仅调整模型的结构产生更好的结果。

     其次:  如图1所示,当各个缩放因子( N, D , C )不受彼此制约时,模型性能与各个缩放因子( N, D , C )之间存在幂律关系,

如Eq1表中的三种情况所示:

  1. 情况 1:参数 = Nopt(计算高效的模型大小),数据 = Dopt(计算高效的数据令牌大小),计算 = Cmin(计算高效的计算预算)
  2. 情况 2:参数 = 无穷大,数据 = D,计算 = 提前停止
  3. 情况 3:参数 = N,数据 = 无穷大,计算 = 无穷大

这种关系适用于很多种,表明了一种一致的模式,即随着这些因素的增加,性能会可预测地提高。换句话说,随着模型大小、数据集大小或计算资源的扩大,我们可以预期模型性能会得到相应且可预测的改善,遵循幂律趋势。

 

      经验上,OpenAI 的研究人员拟合了 Eq1(即 N,D 为有限,提前停止,固定 batch size 的情况),估计 Nc = 8.8x10¹³,AlphaN = 0.076,AlphaD = 0.095,Dc = 5.4x1⁰¹³。以Llama 3为例,它有 70B 参数和 15T token,因此损失为 L(70x10⁹,15x10¹²)= 1.72。 


三   Sample-Efficient LLMs

论文  Training Compute-Optimal Large Language Models

   https://arxiv.org/pdf/2203.15556

   

      大型模型比小型模型具有更高的样本效率,以更少的优化步骤和更少的数据点达到相同的性能水平。很明显,对于给定的处理的 token,较大的模型实现较低的测试损失,如图 3 所示

    DeepMind 发表了另一篇论文,详细介绍了训练计算优化 LLM 的缩放定律的各种方法,这些方法与 OpenAI 的方法不同。他们进行了 400 多次 LLM 训练,发现对于计算优化训练,模型大小和数据集大小(token 数量)应该相等缩放。

他们应用了三种方法来计算缩放定律,并将他们的发现与 OpenAI 的结果叠加,如图 4 右侧所示。他们发现,为了实现相同的模型性能,这三种方法都建议使用小得多的模型尺寸。也就是说,在给定的计算预算和训练数据的情况下,可以用较小的模型尺寸实现相同的模型性能,如图 4 左侧所示。


 

当 DeepMind 的研究人员将损失建模为模型大小和 token 数量的函数,并使用OpenAI研究人员建议的约束 FLOPs (N, D) ~ 6ND 时,一种有趣的 LLM 缩放定律解释方式就出现了:

 绘制出 IsoLoss 轮廓或 IsoFLOPs 切片,如图 5 所示。为了理解左侧的 IsoLoss 轮廓图,让我们使用第一原理来掌握情况。对于给定的 IsoLoss(黑线),我们的目标是拥有最少的计算能力,这意味着最少的 FLOP。当你追踪所有代表所有 IsoLosses 的最少 FLOP 的点时,这些点可以连接成一条蓝线。这条线被称为有效前沿,这个概念对于在金融或商学院学习过运筹学的人来说很熟悉。

可以使用蓝线推断在计算预算较大(即训练 FLOP 较多)的情况下,最佳模型大小和预测损失可能是多少。例如,在 Gopher 模型中,给定预算的最佳模型大小为 40B 个参数。

为了实现最佳的计算效率训练,DeepMind 建议每 1 个模型参数有 ≥ 20 个训练 token,如图 6 所示。为了便于理解, Meta 发布的Llama 3的 token 与参数比例为 215:1。

  与 OpenAI 的缩放定律方程不同,DeepMind 的科学家使用了不同的缩放方程,并根据经验拟合了 Eq2。他们了解到 E = 1.69,A = 406.4,B = 410.7。以 Llama 3 为例,它是一个具有 70B 参数和 15T 标记的模型。损失为 L(70x10⁹,15x10¹²)= 1.86,比使用 Eq1 的估计值(即 1.72)略高。


四 Appendix 

    以 FLOP(浮点运算)衡量的计算预算

    模型的计算资源或计算复杂度以 FLOP 或浮点运算来衡量。它们用于估计训练和运行模型所需的计算资源,如图 7 的 y 轴所示。

从更直观的角度来看,据估计,OpenAI 使用了 1330 亿 petaFLOP 来训练 GPT4。在计算大型语言模型的 FLOP 时,重要的是要考虑训练过程中涉及的所有操作,包括与嵌入矩阵相关的操作。以下是 Transformer 模型前向传递的 FLOP 计算的细分:

# 参考:https://github.com/Lightning-AI/litgpt/blob/410a7126f82ea550d4a43dab89367547b073b5a3/litgpt/utils.py#L321 def  flops_per_param ( max_seq_length: int , n_layer: int , n_embd: int , n_params: int ) -> int : flops_per_token = 2 * n_params   # 每个参数用于每个网络操作的 MAC(2 FLOPS)# 假设所有样本都有等于块大小的固定长度# 这在微调期间很可能是错误的flops_per_seq = flops_per_token * max_seq_length attn_flops_per_seq = n_layer * 2 * 2 * (n_embd * (max_seq_length** 2 )) return flops_per_seq + attn_flops_per_seq def  assess_flops ( model: "GPT" , training: bool ) -> int : """测量 MFU 的估计 FLOP。参考:* https://ar5iv.labs.arxiv.org/html/2205.05198#A1 * https://ar5iv.labs.arxiv.org/html/2204.02311#A2 """ # 使用所有参数是一种简单的高估,因为并非所有模型参数实际上都有助于# 这个 FLOP 计算(例如嵌入、范数)。因此,与测量的 FLOP 相比,结果将高出固定百分比#(~10%),使结果更低但更现实。 # 为了进行正确的估计,这需要更细粒度的计算,如论文附录 A 中所示。     n_trainable_params = num_parameters(model, require_grad= True )     trainable_flops = flops_per_param(         model.max_seq_length, model.config.n_layer, model.config.n_embd, n_trainable_params     ) # 前向 + 后向 + 梯度 (假设没有梯度积累)     ops_per_step = 3 if training else 1     n_frozen_params = num_parameters(model, require_grad= False )     freeze_flops = flops_per_param(model.max_seq_length, model.config.n_layer, model.config.n_embd, n_frozen_params) # 前向 + 后向    freeze_ops_per_step = 2 if training else 1 return ops_per_step * trainable_flops + freeze_ops_per_step * freeze_flops

要注意的是,此计算仅涵盖前向传递。对于训练,还需要考虑后向传递,这通常涉及类似量的计算。

如果这变得太复杂,经验法则是分布式训练的计算要求(C)约为 6 ND 或 8 ND,其中 N 是 Transformer 的参数数量,D 是训练数据大小,以 token 为单位。C 前向约为 2 ND;C 后向约为 4 ND。

附录 2:以 FLOPS(每秒浮点运算次数)为单位的计算速度

   FLOPS,即每秒浮点运算次数,是计算的速度。下面是 Nvidia A100和H100 GPU 性能表,如图 8 所示。

可以根据表格和计算需求(即 6 ND 估计)估算训练 LLM 所需的 GPU 数量。例如,GPT4 需要 1330 亿petaFLOPs,即 1.33 x 10²⁶ FLOPs(或 1.7 万亿个参数并使用 13 万亿个 token,从而产生 6 x 1.7 x 10¹² x 13 x 10¹²,1.33 x 10²⁶ FLOPs)。假设计算使用稀疏的 FP16 Tensor Core 运行,A100 将提供 624TFLOPS(每秒 6.24 x 10¹⁴ 浮点运算)。据报道,OpenAI 使用了 25,000 台 A100。因此,1.33x10²⁶/(6.24x10¹⁴ x 25,000) = 8525641 秒或 98.67 天,这与报告和帖子一致。很好,计算正确!:)

 翻译 

https://medium.com/sage-ai/demystify-transformers-a-comprehensive-guide-to-scaling-laws-attention-mechanism-fine-tuning-fffb62fc2552


 

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

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

相关文章

【课堂笔记】隐私计算实训营第四期:隐私求交PSI

隐私计算实训营第四期:隐私求交PSI 安全求交集(PSI)定义PSI功能和分类最基础的PSI:Two-Party Semi-Honest PSI如何设计Two-Party Semi-Honest PSI方法1:一个基于Hash的PSI方法2:基于Diffie-Hellman密钥交换…

数据结构(基本概念及顺序表——c语言实现)

基本概念: 1、引入 程序数据结构算法 数据: 数值数据:能够直接参加运算的数据(数值,字符) 非数值数据:不能够直接参加运算的数据(字符串、图片等) 数据即是信息的载…

Springboot+Vue的项目搭建(一)

一、JDK配置环境变量 1、在官网下载jdkJava Downloads | Oracle 中国 2、下载之后双击安装。 3、配置环境变量,做法:此电脑->右键->属性->高级系统设置 然后点击确定即可 点击winr java -version 检查一下是否配置成功 二、maven包管理器…

使用 JavaScript 制作 To-Do List

使用 JavaScript 制作 To-Do List 本文记录了使用 HTML、CSS 和 JavaScript 制作一个简单的 To-Do List 网页的全过程,包含功能描述、代码实现以及优化方向。 **🎉🎉🎉欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的…

esp32c3开发板通过micropython的mqtt库连MQTT物联网消息服务器

MQTT介绍 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议,旨在设备之间进行通信,尤其是在网络条件较差的情况下。MQTT v3.1.1 和 MQTT v5 是该协议的两个主要版本。 MQTT v3.1.1: 优点&#xff…

stm32启动过程解析startup启动文件

1.STM32的启动过程模式 1.1 根据boot引脚决定三种启动模式 复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于…

数据结构查找-哈希表(开发地址法+线性探测法)+(创建+查找+删除代码)+(C语言代码)

#include<stdlib.h> #include<stdio.h> #include<stdbool.h> #define NULLKEY -1//单元为空 #define DELKEY -2//单元内容被删除 #define M 20 typedef struct {int key;//关键字int count;//统计哈希冲突探测次数 }HashTable; //插入到哈希表 void InsertHT…

〔 MySQL 〕数据类型

目录 1.数据类型分类 2 数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float 2.3.2 decimal 3 字符串类型 3.1 char 3.2 varchar 3.3 char和varchar比较 4 日期和时间类型 5 enum和set mysql表中建立属性列&#xff1a; 列名称&#xff0c;类型在后 n…

数据库审计工具--Yearning 3.1.9普民的使用指南

1 页面登录 登录地址:18000 &#xff08;不要勾选LDAP&#xff09; 2 修改用户密码 3 DML/DDL工单申请及审批 工单申请 根据需要选择【DML/DDL/查询】中的一种进行工单申请 填写工单信息提交SQL检测报错修改sql语句重新进行SQL检测&#xff0c;如检测失败可以进行SQL美化后…

tcp 超时计时器

在 TCP&#xff08;传输控制协议&#xff09;中有以下四种重要的计时器&#xff1a; 重传计时器&#xff08;Retransmission Timer&#xff09; 作用&#xff1a;用于处理数据包丢失的情况。当发送方发送一个数据段后&#xff0c;就会启动重传计时器。如果在计时器超时之前没有…

前端(4)——demo分享

这两天需要用HTML、CSS和js简单组合一个html网页用于展示一些数据内容&#xff0c;这是我简单组合别人的一些文件形成的简单demo&#xff0c;大家也可以拿过去使用。 登录界面&#xff1a; 场景选择界面&#xff0c;有五个场景&#xff0c;每个场景中都需要展示一些特定的数据…

Java-空链处理

什么是 null 在 Java 中&#xff0c;null 是一个非常常见的关键字&#xff0c;用于表示“没有值”或“空”。然而&#xff0c;对于初学者来说&#xff0c;null 的本质可能会感到有些困惑。在本文中&#xff0c;我们将详细探讨 null 在 Java 中的含义和使用。 在 Java 中&…

PyTorch使用教程-深度学习框架

PyTorch使用教程-深度学习框架 1. PyTorch简介 1.1-什么是PyTorch ​ PyTorch是一个广泛使用的开源机器学习框架&#xff0c;特别适合深度学习的应用。它以其动态计算图而闻名&#xff0c;允许在运行时修改模型&#xff0c;使得实验和调试更加灵活。PyTorch提供了强大的GPU加…

供应链管理、一件代发系统功能及源码分享 PHP+Mysql

随着电商行业的不断发展&#xff0c;传统的库存管理模式已经逐渐无法满足市场需求。越来越多的企业选择“一件代发”模式&#xff0c;即商家不需要自己储备商品库存&#xff0c;而是将订单直接转给供应商&#xff0c;由供应商直接进行发货。这种方式极大地降低了企业的运营成本…

Pr:音频过渡

Adobe Premiere Pro 自带一组共三个音频过渡 Audio Transitions效果。 对音频剪辑之间应用交叉淡化 Crossfade过渡&#xff0c;操作方式类似于应用视频过渡效果。 对于交叉淡化&#xff0c;要保证前剪辑的出点之后及后剪辑的入点之前有足够的预留内容&#xff08;也称“手柄”&…

前端页面开发步骤详解

目录 前言1. 页面搭建1.1 HTML 标签结构1.2 CSS 样式设计 2. 数据绑定与事件处理2.1 数据绑定2.2 表单校验 3. 调用后台接口3.1 接口文档与工具封装3.2 参数传递与接口调用 结语 前言 在前端开发过程中&#xff0c;从页面搭建到与后台接口对接是一个必不可少的完整流程。无论是…

A037-基于Spring Boot的二手物品交易的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

两行命令搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),含完整的 Docker 安装步骤

深度学习环境的配置过于繁琐&#xff0c;所以我制作了两个基础的镜像&#xff0c;希望可以帮助大家节省时间&#xff0c;你可以选择其中一种进行安装&#xff0c;版本说明&#xff1a; base 版本基于 pytorch/pytorch:2.5.1-cuda11.8-cudnn9-devel&#xff0c;默认 python 版本…

EXCEL延迟退休公式

如图&#xff1a; A B为手工输入 C2EOMONTH(A2,B2*12) D2EOMONTH(C2,IF(C2>DATEVALUE("2025-1-1"),INT((DATEDIF(DATEVALUE("2025-1-1"),C2,"m")4)/4),0)) E2EOMONTH(A2,B2*12IF(EOMONTH(A2,B2*12)>DATEVALUE("2025-1-1"),INT(…