【小白入门篇6】常识|怎么计算模型需要的资源

news2024/12/25 1:44:25

01 背景

各个公司相继推出大模型, 有开源和不开源,有些技术爱好者也开始心痒难耐,萌生了私有本地模型,甚至有伙伴构建大模型并进行训练的想法, 大模型不仅比拼技术, 也是比拼爹(资源)的存在, 我个人在实战经历经常问自己,到底需要什么样配置才能跑起来这个模型, 完成这个实验目标, 由此引发对估算大模型需要的GPU显存的进一步了解.

02 模型参数量

如下图(来源于网络), 我们经常会看到模型名称带70B、14B、32B等字眼,这些就是表示模型参数的个数, 反映出模型大小, b代表英文单词“billio****n”的意思, 也就是10亿. 所以70B就是700亿个参数左右, 14B就是140亿个参数左右, 32B就是320亿个参数左右. 在大模型以前的时代, 也有一些比较小模型,单位一般都是M(百万)为计算单位, LLM出现之后, 基本模型参数数量基本是以亿为基本单位.

image.png

03 参数精度

影响模型占用显存大小,除了参数量, 还有参数精度,所谓参数精度,就是参数的数据类型. 我们之前在《Transformer原理》中学到Transformer, 神经网络一般都是用具体数字表示, 所以我们这里所说的参数数据类型都是浮点数, 常见浮点数的精度类型有以下几种:

类型

描述

说明

float64

双精度浮点数 (64位)

双精度浮点数提供更高的精度,适用于需要更高数值精度的应用,但会占用更多的内存。占用8个字节(64位)

float32

单精度浮点数 (32位)

单精度浮点数用于表示实数,具有较高的精度,适用于大多数深度学习应用。4字节(32位)

float16

半精度浮点数 (16位)

半精度浮点数用于表示实数,但相对于单精度浮点数,它的位数较少,因此精度稍低。然而,它可以在某些情况下显著减少内存占用并加速计算。字节数:2字节(16位)

int32, int64

整数 (通常为32位或64位)

整数用于表示离散的数值,可以是有符号或无符号的。在某些情况下,例如分类问题中的标签,可以使用整数数据类型来表示类别。

字节数:通常为4字节(32位)或8字节(64位

int4

量化技术:int4 (4位整数)

int4使用4位二进制来表示整数。在量化过程中,浮点数参数将被映射到一个有限的范围内的整数,然后使用4位来存储这些整数。

int8

量化技术 int8(8位整数)

含义:int8使用8位二进制来表示整数。在量化过程中,浮点数参数将被映射到一个有限的范围内的整数,然后使用8位来存储这些整数。

字节数:1字节(8位)

模型参数精度的选择往往是一种权衡。使用更高精度的数据类型可以提供更高的数值精度,但会占用更多的内存并可能导致计算速度变慢。相反,使用较低精度的数据类型可以节省内存并加速计算,但可能会导致数值精度损失. 关于量化技术,等后面单独给大家仔细讲解.以下一张图可以先大概了解量化的过程:

image.png

上图来源于网络

有了参数个数和每个参数的数据类型, 我们就可以开始估算GPU显存大小, 但是推理和训练又不太一样. 推理一般相对训练需要的资源要少, 接下来我们分为2大块内容介绍一下,在推理和训练分别需要的资源是多少?

03 推理显存组成

3.1 模型权重: 主要由模型的参数个数* 参数的数据类型占用字节数

3.2 输入数据大小: 数据维度和batchsize(批次大小), 所以现在大模型api一般都用输入token和输出token进行收费

3.3 推理中间结果:在模型的推理过程中,可能会产生一些中间计算结果,这些中间结果也会占用一定的显存。

04 训练显存组成

4.1 模型权重: 主要由模型的参数个数* 参数的数据类型占用字节数。

4.2 梯度 : 计算梯度用于更新模型的参数值, 梯度数量与模型参数是相同。

4.3 优化器参数: 一般优化器需要保存一些参数状态,以便更新调整,不同的优化器占用的显存大小是不一样的,比如SGD和参数数量是一样的, 而AdamW是参数的2倍

4.4 输入数据: 数据维度和batchsize(批次大小)

4.5 训练中间结果:在模型的训练前向传播和后向传播过程中,可能会产生一些中间计算结果,这些中间结果也会占用一定的显存。

05估算LLama3-8b

假设参数精度是float32,那就是4个字节:

5.1模型参数

如果显存不够,可以用FP16精度,或者更低,一般都是2倍关系

5.2梯度大小:一般和模型一样的大小29.8GB

5.3 优化器参数: 以Adamw 为例优化器参数是模型参数的2倍, 29.8*2GB

5.4 中间激活:对于每一层,都会有一些中间的激活值。这些激活值的数量通常与模型的宽度和输入数据的大小有关。假设每层的激活需X个浮点数,那么激活的总大小为:X*4字节

5.5 输入数据的激活大小: 假设批次大小为B, B*X*4字节,

所以如果是推理的话基本是29.8GB+中间激活+输入数据激活大小即可, 差不多在30GB左右,但是如果训练的话, 那就4倍以上.

06 总结

上面所说的推理大小也是不考虑用户并发的情况,如果考虑并发的情况永不止这些. 由于训练所需要的资源是巨大,现在为了让普通人也能训练大模型, 行业内已经出现一些相关技术,比如上面所说量化,如果使用量化int8,基本是上面计算的1/4左右, 模型切分、混合精度计算、微调框架等等.

有人说,那每一次我要估算资源,都要充分了解模型结构,然后再计算, 当然不用了,现在HuggingFace的官方库Accelerate直接推出了一个在线大模型显存消耗资源估算工具Model Memory Calculator, 有在线版和官方版本,可以帮大家快速计算出来, 即使有工具,我们也要知道其中原理, 这样我们才能知其然知其所以然也.

注意: 如果有需要工具如何使用,可以关注我的公众号, 回复“大模型显存计算工具Model Memory Calculator”
在这里插入图片描述

感谢您完成阅读

推荐阅读:

【小白入门篇1】GPT到底是怎样练成?

【小白入门篇2】总有一款AI工具适合你

【小白入门篇3】还是GPT4更香

【小白入门篇4】兄弟,你还在网上盗图吗

【小白入门篇5】哪些免费GPU羊毛可以薅?

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

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

相关文章

玩转cpp小项目星球3周年了!

公众号原创文章破600!玩转cpp小项目星球目前已运营3年,平时不怎么宣传,借此机会给大家分享一下这三年里面我沉淀了哪些内容。里面包含: 1.小项目:一些核心模块的拆解,例如:grpc、mutex、线程池等…

python数据分析——数据分类汇总与统计

数据分类汇总与统计 前言一、Groupby分类统计语法按列分组示例一示例二示例三 遍历各分组示例 使用字典和Series分组示例 使用函数分组示例 二、数据聚合groupby的聚合函数示例一示例二 逐列及多函数应用示例一示例二 返回不含行索引的聚合数据示例 三、一般性的“拆分-应用-合…

程序员日志之星际争霸

目录 传送门正文日志1、概要2、星际争霸编年史2.1、最早版本 Alpha2.2、早期版本 Early Beta2.3、测试版 Beta2.4、正式版 StarCraft2.5、母巢之战测试版 BroodWar Beta2.6、星际争霸-母巢之战 BroodWar2.7、地图编辑器(1.07及以上) StarEdit2.8、《星际…

掌握决策之道:层次分析法(AHP)的步骤、应用与局限性

目录 一、层次分析法简介 举一个小例子: 评价类问题可用打分解决,比如:小华高考结束后,在华科和武大两所学校之间做抉择。 评价类问题可用打分解决 二、层次分析法的步骤 (一)一道引出层次分析法的例…

造纸废水处理有哪些工艺设备

造纸废水处理是一个复杂的过程,因为造纸过程中产生的废水含有大量的有机物、悬浮物、色素、油脂、木质素、纤维素等污染物。为了有效处理这些废水,通常需要采用一系列的工艺设备。以下是一些常见的造纸废水处理工艺设备: 格栅:用于…

申贷时,银行级大数据自己能查到吗?

随着金融风控的不断健全,大数据作为辅助的风控工具正在被越来越多的银行和机构使用。在进行申贷时,银行通常会进行大数据查询,以便评估申请人的信用状况。那么,这些大数据自己能查到吗?接下来本文就为大家详细介绍一下&#xff0…

OKHTTP 3.12.0 以后版本 headers 中不可携带中文

今天遇到的报错: java.lang.llegalArgumentException: Unexpected char 0x957f at 0 in x-brand value: 电视堆栈 okhttp3.Headers.checkValue(Headers.java:272) okhttp3.Headers$Builder.add(Headers.java:312) okhttp3.Request$Builder.addHeader(Request.iava:…

超便捷备忘录共享方法 文字文件都可共享

在这个信息爆炸的时代,备忘录已成为我们生活中不可或缺的小助手。它记录着我们的工作计划、待办事项、灵感闪现,甚至是那些温馨的家庭琐事。然而,当我们在不同的设备间穿梭,如何在手机、电脑,甚至是不同品牌的手机之间…

selenium进行xhs图片爬虫:05xhs一个博主的全部文章链接获取

在今天的文章中,是需要进行保持登录状态的,如果没有登录状态。会导致xhs博主下的文章数量缺失。 我使用的仍然是selenium远程调试,也就是我之前说的selenium操作已经打开的浏览器。这块内容配置还是挺简单的,大家可以去试试。 今…

vuerouter声明式导航

声明式导航-跳转传参数 1.查询参数传参 语法:to /path?参数名值 2.对应页面组件接受传来的值 $router.query.参数名 2.动态路由传参 1.配置动态路由 2.配置导航连接 to/path/参数值 3.对应页面组件接收传递过来的值 #route.params.参数名 多个参数传递&…

GPT搜索引擎原型曝光!

OpenAI发布会前一天,员工集体发疯中……上演大型套娃行为艺术。 A:我为B的兴奋感到兴奋;B:我为C的兴奋感到兴奋……Z:我为这些升级感到兴奋 与此同时还有小动作不断,比如现在GPT-4的文字描述已不再是“最先…

树莓派|SPI通信

SPI的原理 SPI(Serial Peripheral Interface)是一种同步的串行通信协议,它允许在单片机和外设之间高速地传输数据。SPI协议主要有以下特点: 采用全双工通信模式,同时支持主从模式(Master/Slave&#xff09…

JavaEE开发重中之重 异常 捕获并抛出异常 自定义异常 2024详解

异常就是代表程序可能出现的问题 Error代表系统级别的错误 属于严重问题 Error是给sun公司用的,不是给程序员用的 Exception代表程序可能出现的问题 叫做异常 编译阶段不会出现异常提醒 运行时会出现的异常 编译阶段就会出现的异常 异常体系的最上层父类是E…

DLRover 如何拯救算力浪费?10 分钟自动定位故障机,1 秒内保存 Checkpoint!

欢迎大家在 GitHub 上 Star 我们: 分布式全链路因果学习系统 OpenASCE: https://github.com/Open-All-Scale-Causal-Engine/OpenASCE 大模型驱动的知识图谱 OpenSPG: https://github.com/OpenSPG/openspg 大规模图学习系统 OpenAGL: https://github.com/TuGraph-…

flink cdc,读取datetime类型

:flink cdc,读取datetime类型,全都变成了时间戳 Flink CDC读取MySQL的datetime类型时会转换为时间戳的问题,可以通过在Flink CDC任务中添加相应的转换器来解决。具体来说,可以在MySQL数据源的debezium.source.converter配置项中指…

欢乐钓鱼大师攻略大全,稀有鱼介绍!

在《欢乐钓鱼大师》的广袤海域中,隐藏着无数神秘的鱼类,等待玩家们的探索。这不仅仅是一场钓鱼的冒险,更是一次心灵的洗礼。每一次挥杆都可能揭开一个新的秘密,让我们一起踏上这场奇妙的钓鱼之旅。 寻觅海域明珠:星光闪…

综合模型及应用(图论学习总结部分内容)

文章目录 前言六、综合模型及应用(以题目总结为主)分层图思想(包括拆点建图) e g 1 : 通信线路 eg1:通信线路 eg1:通信线路​​​[A-Telephone Lines](https://ac.nowcoder.com/acm/contest/1055/A)(蓝书例题) e g 2 : 小雨坐地铁 eg2:小雨坐地铁 eg2:小雨坐地铁​ [1012-小雨坐…

【手势操作-复习前一天的内容-预习今天的内容 Objective-C语言】

一、昨天呢,我们学习的是这个,事件 1.事件这一块儿呢,iOS事件,分为三大类, 1)触摸事件 2)加速计事件 3)远程控制事件 2.这个里边呢,我们主要学习的是这个触摸事件,触摸事件里边,就是Touch,touchesBegan:方法里边,有一个touches参数,它是set类型的, 3.Set,…

疯狂为你省钱 - Al一键虚拟试衣整合包

在今天的数字时代,中小服装商家以及各种带货人,面临着各种挑战,其中之一就是模特拍摄的高成本。为此,一个名为OMS-Diffusion的新开源项目应运而生,旨在帮助大家通过虚拟试衣来降低成本。使用这个工具,只需要…

PSFR-GAN复现

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言快速开始安装依赖权重下载及复原 训练网络数据集训练脚本 代码详解训练BaseOptio…