LLMs训练的算力优化Computational challenges of training LLMs

当您尝试训练大型语言模型时,您仍然经常遇到的最常见问题之一是内存不足。如果您曾尝试在Nvidia GPU上训练或甚至只是加载模型,那么这个错误消息可能看起来很熟悉。
在这里插入图片描述

CUDA,即Compute Unified Device Architecture的缩写,是为Nvidia GPU开发的库和工具集合。像PyTorch和TensorFlow这样的库使用CUDA来提高深度学习中常见操作的性能。

您会遇到这些内存不足的问题,因为大多数LLM都很大,需要大量的内存来存储和训练它们的所有参数。

让我们快速做些数学计算,以了解问题的规模。单个参数通常由32位浮点数表示,这是计算机表示实数的一种方式。您将很快看到如何以此格式存储数字的更多详细信息。32位浮点数占用四个字节的内存。因此,要存储十亿个参数,您需要四个字节乘以十亿个参数,或32位全精度下的4GB的GPU RAM。
在这里插入图片描述

这是很多的内存,注意,到目前为止,我们只计算了存储模型权重所需的内存。如果您想训练模型,您还必须为训练期间使用的GPU内存的其他组件做计划。这些包括两个Adam优化器状态、梯度、激活以及函数所需的临时变量。这可以轻松地导致每个模型参数需要额外的20个字节的内存。

在这里插入图片描述
实际上,为了考虑到训练期间的所有这些开销,您实际上需要的GPU RAM量是模型权重单独占用的大约20倍。
在这里插入图片描述

要在32位全精度下训练一个十亿参数的模型,您需要大约80GB的GPU RAM。
在这里插入图片描述

这对于消费者硬件来说绝对太大了,即使对于数据中心使用的硬件来说,如果您想使用单个处理器进行训练,也是具有挑战性的。80GB是单个Nvidia A100 GPU的内存容量,这是云中用于机器学习任务的常见处理器。

您有哪些选择来减少训练所需的内存?您可以使用的一种减少内存的技术称为量化。这里的主要思想是,通过将它们的精度从32位浮点数减少到16位浮点数或8位整数,来减少存储模型权重所需的内存。
在这里插入图片描述

深度学习框架和库中使用的相应数据类型是FP32用于32位全位置,FP16或Bfloat16用于16位半精度,以及int8 eight-bit整数。
在这里插入图片描述

您可以使用FP32表示的数字范围从大约 3 ∗ 1 0 − 38 3 * 10^{-38} 31038 3 ∗ 1 0 38 3 * 10^{38} 31038

默认情况下,模型权重、激活和其他模型参数都存储在FP32中。量化统计地将原始32位浮点数投影到基于原始32位浮点数范围计算的缩放因子的低精度空间。
在这里插入图片描述

让我们看一个例子。假设您想在不同的位置存储PI到小数点后六位。浮点数存储为一系列位,零和一。在FP32中存储数字的32位由一个位表示符号,其中零表示正数,而一表示负数。然后是8位表示数字的指数,以及表示数字的小数的23位。小数也称为尾数或有效数字。它表示数字的精确位。如果您将32位浮点值转换回十进制值,您会注意到精度的轻微损失。为了参考,这是Pi的实际值,精确到19位小数。
在这里插入图片描述

现在,让我们看看如果您将这个FP32表示的Pi投影到FP16,16位低精度空间会发生什么。16位由一个位表示符号,如您所见的FP32,但现在FP16只分配五位来表示指数和10位来表示小数。因此,您可以使用FP16表示的数字范围远远小于从负65,504到正65,504。原始FP32值在16位空间中被投影到3.140625。注意,您在这个投影中失去了一些精度。
在这里插入图片描述

您会发现,在大多数情况下,这种精度损失是可以接受的,因为您正在优化内存占用。

在FP32中存储一个值需要四个字节的内存。相反,以FP16存储一个值只需要两个字节的内存,所以通过量化,您将内存需求减少了一半。
在这里插入图片描述

AI研究社区已经探索了如何优化16位量化的方法。尤其是BFLOAT16,最近已经成为FP16的流行替代品。BFLOAT16,简称Brain Floating Point Format,是在Google Brain开发的,已经成为深度学习中的流行选择。许多LLM,包括FLAN-T5,都使用BFLOAT16进行了预训练。

BFLOAT16或BF16是半精度FP16和全精度FP32之间的混合体。BF16显著地帮助训练稳定性,并得到了NVIDIA的A100等较新GPU的支持。BFLOAT16通常被描述为一个截断的32位浮点数,因为它捕获了完整的32位浮点数的完整动态范围,但只使用了16位。

BFLOAT16使用完整的八位来表示指数,但将小数截断为只有七位。这不仅节省了内存,而且通过加速计算提高了模型性能。缺点是BF16不适合整数计算,但在深度学习中这些相对较少。
在这里插入图片描述

为了完整起见,让我们看看如果您将Pi从32位量化到更低精度的8位空间会发生什么。如果您使用一个位表示符号,INT8值由其余的七位表示。这给了你一个范围来表示从负128到正127的数字,不出所料,Pi在8位低精度空间中被投影到或3。这将新的内存需求从原来的四个字节减少到只有一个字节,但显然导致了相当大的精度损失。
在这里插入图片描述

让我们总结一下您在这里学到的内容,并强调您应该从这次讨论中得到的关键点。

请记住,

  1. 量化的目标是通过减少模型权重的精度来减少存储和训练模型所需的内存。
  2. 量化统计地将原始32位浮点数投影到使用基于原始32位浮点数范围计算的缩放因子的低精度空间。
  3. 现代深度学习框架和库支持量化感知训练,该训练在训练过程中学习量化缩放因子。这个过程的细节超出了这门课程的范围。但您已经看到了这里的关键点,即您可以使用量化来减少训练期间模型的内存占用。
  4. BFLOAT16已经成为深度学习中的流行选择,因为它保持了FP32的动态范围,但将内存占用减少了一半。许多LLM,包括FLAN-T5,都使用BFOLAT16进行了预训练。
    在这里插入图片描述

请在下周的实验室中注意BFLOAT16的提及。

现在,让我们回到将模型适应GPU内存的挑战,并看看量化可能带来的影响。通过应用量化,您可以将存储模型参数所需的内存消耗减少到只有2GB,使用16位半精度,节省了50%。您可以通过将模型参数表示为8位整数,进一步减少内存占用,这只需要1GB的GPU RAM。请注意,在所有这些情况下,您仍然有一个拥有十亿参数的模型。正如您所看到的,代表模型的圆圈大小相同。
在这里插入图片描述

量化在训练时也会给您带来同样程度的节省。正如您之前听到的,当您尝试在32位全精度下训练一个十亿参数的模型时,您很快就会达到单个NVIDIA A100 GPU的80 GB内存的限制。当您尝试在单个GPU上进行训练时,如果您想使用16位或8位量化,您需要考虑使用它。
在这里插入图片描述

请记住,现在许多模型的大小超过了500亿甚至1000亿参数。这意味着您需要更多的内存容量来训练它们,数万GB。这些巨大的模型使我们一直在考虑的十亿参数模型相形见绌,
在这里插入图片描述

如左图所示。当模型规模超过几十亿参数时,使用单个GPU进行训练变得不可能。相反,您需要转向分布式计算技术,同时在多个GPU上训练模型。这可能需要访问数百个GPU,这是非常昂贵的。
在这里插入图片描述

这也是为什么您大多数时候不会从头开始预训练自己的模型的另一个原因。

但是,还有一个额外的训练过程叫做微调,您将在下周了解。也需要在内存中存储所有训练参数,而且您很可能希望在某个时候微调模型。

为了帮助您更多地了解跨GPU训练的技术方面,我们为您准备了一个可选的视频。它非常详细,但它将帮助您了解一些为开发人员提供的训练更大模型的选项。您应该随意跳过这个视频。但如果您有兴趣了解更多,我希望您会查看它。

参考

https://www.coursera.org/learn/generative-ai-with-llms/lecture/gZArr/computational-challenges-of-training-llms

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

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

相关文章

【rust/egui】(六)看看template的app.rs:TextEdit

说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:0.22.0eframe版本:0.22.0上一篇:这里 TextEdit 文本编辑框 其定义为&#…

Grounded Language-Image Pre-training论文笔记

Title:Grounded Language-Image Pre-training Code 文章目录 1. 背景2. 方法(1)Unified Formulation传统目标检测grounding目标检测 (2)Language-Aware Deep Fusion(3)Pre-training with Scala…

【golang】派生数据类型---指针 标识符、关键字等

1、指针 对比C/C中的指针,go语言中的指针显得极为简洁,只是简单的获取某个空间的地址 或者 根据指针变量中的内容 获取对应存储空间的内容等操作。 具体示例如下: go中使用指针需要注意的点: 可以通过指针改变它所指向的内存空…

【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )

代码示例 : <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Banner 轮播</title><style>/* 取消浏览器或者其它标签的默认的内外边距 */* {margin: 0;padding: 0;}/* 取消列表样式 主要是…

数据采集:selenium 获取某网站CDN 商家排名信息

写在前面 工作中遇到&#xff0c;简单整理理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#xff0c;是对大…

【内网穿透】搭建我的世界Java版服务器,公网远程联机

目录 前言 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 2. 测试局域网联机 3. 公网远程联机 3.1 安装cpolar内网穿透 3.1.1 windows系统 3.1.2 linux系统&#xff08;支持一键自动安装脚本&#xff09; 3.2 创建隧道映射内网端口 3.3 测试公网远程…

【电源专题】18650圆柱电芯内部结构及器件

18650圆柱锂离子电池是一种直径为18mm、高度为65mm的锂离子电池,它最大的特点是拥有非常高的能量密度,它是比较成熟的锂离子电池,各方面系统质量稳定性较好,广泛适用于10千瓦时左右的电池容量场合,例如在、在手机、笔记本电脑等小型电器上。 常见的18650电池分为锂离子电池…

亚马逊云科技 re:Inforce 大会云安全合规与技术实践及 Security Jam 大赛,快来报名吧!...

‍‍ 2023年8月31日在北京 亚马逊云科技 re:Inforce 大会 首次登陆中国&#xff01; 我们期待您的莅临&#xff0c; 并与您一起迎接 AI 时代&#xff0c; 开启全面智能的安全旅程&#xff01; 在13:00-17:00的 培训与动手实验环节中 云安全合规与技术实践 及 Security Jam 大赛…

Python3 列表

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进…

韶音骨传导耳机值得入手吗,韶音骨传导耳机可以水洗吗

韶音家的代表作可以说是OpenRun Pro骨传导耳机&#xff0c;在发声单元位置上采用了开孔的处理&#xff0c;佩戴上耳的时候发声单元可以贴合耳道&#xff0c;在低频延伸性&#xff0c;但在中高频的时候整体会出现震感&#xff0c;纤细的耳挂在佩戴的时候是有着不错的舒适度的&am…

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容&#xff0c;通过计算机网络的开发技术&#xff0c;在互联网上进行展示&#xff0c;然后通过计算机网…

单片机TVS/ESD二极管防护

TVS 瞬态电压抑制二极管Transient Voltage Suppressor ESD 静电释放二极管 Electro-Static discharge 这两种本质上都是二极管。都是利用了二极管正向导通、反向截止的特性。二极管在反向截止截止条件下&#xff0c;如果电压继续增大&#xff0c;将会引发雪崩&#xff0c;使得…

ubuntu20.04安装gcc5.4 g++5.4

在进行ubuntu20.04的系统中安装gcc g5.4中&#xff0c;会出现安装问题 1、pip安装&#xff0c;失败 2、使用apt-get install 进行安装时&#xff0c;提示没有候选项&#xff1b; 原因&#xff1a;ubuntu20.04的系统下&#xff0c;系统默认安装的gcc9.0的版本&#xff0c;默认…

7.Oracle视图创建与使用

1、视图的创建与使用 在所有进行的SQL语句之中&#xff0c;查询是最复杂的操作&#xff0c;而且查询还和具体的开发要求有关&#xff0c;那么在开发过程之中&#xff0c;程序员完成的并不是是和数据库的所有内容&#xff0c;而更多的是应该考虑到程序的设计结构。可以没有一个项…

WordPress使用子主题插件 Child Theme Wizard,即使主题升级也能够保留以前主题样式

修改WordPress网站样式&#xff0c;主题升级会导致自己定义设置的网站样式丢失&#xff0c;还需要重新设置&#xff0c;很繁琐工作量大&#xff0c;发现在WordPress 中有Child Theme Wizard子主题插件&#xff0c;使用Child Theme Wizard子主题插件&#xff0c;即使主题升级&am…

HTML-常见标签、HTML5新特性

HTML 软件架构 1.C/S架构 (1) C/S架构即Client/Server&#xff08;客户机/服务器&#xff09;结构。 (2) C/S 架构特点 ​ C/S结构在技术上很成熟&#xff0c;它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。但是该结构的程序是…

8年测试经验之谈 —— 接口自动化测试requests

1.什么是requests&#xff1f; requests是一个Python第三方库&#xff0c;处理URL资源特别方便 2.安装requests pip3 install requests 如果遇到Permission denied安装失败&#xff0c;请加上sudo重试 3.使用requests 3.1get请求方法 3.1.1基本的get请求 import reques…

如何使用CSS实现一个3D旋转效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 3D效果实现⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域…

python下载bilibili视频,下载合集,下载选集

一. 内容简介 bilibili视频下载&#xff0c;下载合集&#xff0c;下载选集 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a;https://pan.baidu.com/s/1tO8xSmaqqoTxHI9P_UkDBw?pwd1234 提取码&#xff1a;1234 三.主要流程 3.1 …

C语言-内存分布(STM32内存分析)

C/C内存分布 一、内存组成二、静态区域文本段 &#xff08;Text / 只读区域 RO&#xff09;已初始化读写数据段&#xff08;RW data -- Initialized Data Segment&#xff09;未初始化数据段&#xff08;BSS -- Block Started by Symbol&#xff09; 三、动态区域堆&#xff08…