LLM - 训练与推理过程中的 GPU 算力评估

目录

一.引言

二.FLOPs 和 TFLOPs

◆ FLOPs [Floating point Opearation Per Second]

◆ TFLOPs [Tera Floating point Opearation Per Second]

三.训练阶段的 GPU 消耗

◆ 影响训练的因素

◆ GPT-3 训练统计

◆ 自定义训练 GPU 评估

四.推理阶段的 GPU 消耗

◆ 影响推理的因素

◆ 自定义推理 GPU 评估

◆ 计算差异

五.基于 Token 的计算方式

六.总结


一.引言

LLM 大模型时代,GPU 显卡的算力至关重要,无论是训练还是推理都离不开大规模 GPU 的支持。由于工作需要,需要评估 LLM 任务所需显卡算力,搜了一下发现网上关于 GPU 评估计算的文章并不多,特此记录,有不妥的地方欢迎大家评论区多多交流。

二.FLOPs 和 TFLOPs

介绍 GPU 算力评估之前,首先我们需要了解下 GPU 计算能力的常见评估指标。

 FLOPs [Floating point Opearation Per Second]

        表示设备每秒所执行的浮点运算数量。

 TFLOPs [Tera Floating point Opearation Per Second]

        表示设备每秒执行一万亿次浮点运算的数量,即 10^12 次方。

其中浮点运算是指涉及小数点的计算,例如加减乘除。TFLOPs 比 FLOPs 单位更大,其用于衡量计算机或处理器的更高性能。以 L40S 为例,在精度为 FP32 的情况下,其算力可达 91.6 TFLOPs,而 A800 则只有 19.5 TFLOPs,RTX 3060 大约是 12.5 TFLOPS。如果是超级计算机其 TFLOPS 性能指标可达 1000 万亿次每秒。

三.训练阶段的 GPU 消耗

影响训练的因素

计算前先看下训练阶段有哪些因素会影响训练的进程。

- 训练数据大小

- 模型参数规模

- 训练 Epoch 次数

- 显卡算力

GPT-3 训练统计

上面我们介绍了 FLOPs 和 TFLOPs,这里 ZettaFLOPs 代表每秒十万京 (10^21) 次的浮点运算,不同指标之间主要是单位的差异。以 GPT-3 为参照,其为 1750 亿参数的模型,45 TB 训练数据,训练一次大约需要 175 ZettaFLOPs 即 1.75 x 10^23 次浮点数运算。由于这里我们没有获取到 175 ZFLOPs 是一个 Epoch 还是完整训练,所以后续的计算我们先统一按完整训练所需为参照。

自定义训练 GPU 评估

这里假定我们训练的模型是 LLaMA-33B,参数量为 330 以,训练数据量为 50G,GPU 算力以 A800 下 FP32 计算即 19.5 TFLOPs,则训练该模型需要 GPU 算力为:

NeedFLOPs = (330 / 1750) * (0.048828125 / 45) * 1.75 * 10^23 FLOPs

我们使用设备为 A800,则其可提供的算力为:

CalcByA800 = 19.5 * 10^12 FLOPs

最后结合我们需要的天数,例如训练 5 天结束,则 5 天的 s 数为:

TrainTime = 86400 * 5

最终所需 GPU 数量为:

GPUCount = NeedFLOPs / (CalcByA800 * TrainTime)

为了方便计算我们直接改写为 Python 代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-"""Returns the estimated number of GPUsParameters----------args_num : 当前模型参数数量,单位为 亿data_size : 当前训练数据大小,单位为 GBReturns-------count : 所需 GPU 数量, 未向上取整
"""def calc_gpu_num(_args_num, _data_size, _train_days):need_flops = (_args_num / 1750) * (_data_size / 45) * 1.75 * 10 ** 23calc_by_a800 = 19.5 * 10 ** 12train_time = 86400 * _train_daysgpu_count = need_flops / (calc_by_a800 * train_time)return gpu_countif __name__ == '__main__':args_num = 330 # LLaMA-33Bdata_size = 0.048828125 # 50Gtrain_days = 5 # 训练5天count = calc_gpu_num(args_num, data_size, train_days)print(count)

计算得到 count = 4.250628165558721,我们向上取整可得 5 天训练 50G 数据的 LLaMA-33B 模型需要 5 张 A800,不过这里并未考虑显存或者性能损耗等问题,只是粗略估算。

四.推理阶段的 GPU 消耗

影响推理的因素

- 输入输出数据

- 模型参数规模

- 显卡算力

推理阶段需要计算输入与输出的文本之和,实际计算中,需要将文本 tokenizer 到 token_ids 以便 transformers 计算,中文字符与 token 比例大概为 1:2 即 1 个中文字符对应 2 个 token_ids。GPU 推理计算时,其与输入输出文本和 L、模型维度 D 和模型层数 N 成正比。

自定义推理 GPU 评估

假设输入的 query 文本数为 100,输出的文本书为 1000,则 L = (100 + 1000) * 2 = 2200,按模型维度 D = 1280,层数 N = 96,则计算所需算力:

​NeedFLOPs ≈ L * D * N ≈ 270336000 = 2.7 * 10^8

假设我们使用 A800 用 1s 时间完成本次推理请求:

CalcByA800 = 19.5 * 10^12 FLOPs

则需要 GPU 数量:

count = 270336000 / (19.5 * 10**12) = 1.3863384615384615e-05

反过来 CalcByA800 / NeedFLOPs 可以计算一张 A800 可以满足约 7.2 w 用户 1s 内获取回复,不过这只是理想情况:

people = (19.5 * 10**12) / 270336000 = 72132.45738636363

◆ 计算差异

推理时涉及到文字和计算,例如生成连贯的剧情、生成数学逻辑的推理。这些处理对算力的消耗几乎相同,这是 LLM 的本质是语言模型,只要在输入输出相同的情况下,其处理的都是 token_ids,推理得到的也都是 next_token 的分布,还是 token_ids,所以与具体的表现形式无关,即不同类型的任务,只要输入输出相近,则其对算力的消耗也相近。

五.基于 Token 的计算方式

上面的方式都是基于 FLOPs 为基准计算的,但是由于实际场景下很多信息我们获取的并不完整。例如 GPT-3 的训练 FLOPs 是否准确,训练的 FLOPs 是一个 epoch 还是一整个训练流程,因此实际场景下还可以采用另一种方式,即基于 Token 处理效率的计算,但是这种计算方式有一个前提,就是需要你事先测算出对应 GPU 设备每秒处理的 token 数量,即 Process Tokens / s。

以博主实际测算为例,P40 即 4090 的 token 处理能力约为 25 Token / s,假设我们一天需要请求 1000 次,每次输入输出共 1000 个汉字,共花费 10 h 处理完成,则需要 P40 的数量可通过下述公式计算:

def calc_gpu_num_by_token(post_token_num, post_time_all, token_process):return post_token_num / (post_time_all * token_process)if __name__ == '__main__':token_num = 1000 * 1000 * 2  # 1000 次请求、1000 个汉字对应 2000 个 tokentime_cost = 10 * 3600  # 总处理时间token_process_num = 25  # 每s可处理 token 数目print(calc_gpu_num_by_token(token_num, time_cost, token_process_num))

算下来 10h 处理完这些需求需要 2.223 台 P40,则向上取整得到需要 3 台 P40。

六.总结

这里分享了几种 GPU 算力计算的方法,上面的计算都是基于理想状态,实际情况下还需要考虑多机多卡的 IO 延迟,机器的网络延迟,以及模型大小与 GPU 显存的供需关系等等。更多的数据还是需要自己实践出真知,有问题欢迎大家在评论区一直讨论,因为现在网上这方面的信息还是相对较少,可以一起分享一起进步!

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

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

相关文章

Pap.er for Mac:高清壁纸应用打造你的专属视觉盛宴

在浩瀚的互联网海洋中,你是否曾为寻找一张心仪的高清壁纸而烦恼?或者是在大量的壁纸应用中感到困扰,不知道哪一个能满足你的需求?今天,我要向你介绍的,是一款独特的5K高清壁纸应用——Pap.er for Mac。 Pa…

leetcode:374. 猜数字大小(二分查找)

一、题目 函数原型:int guessNumber(int n) 二、思路 本题其实就是从 1 - n 中找出所要的答案。利用guess函数来判断数字是否符合答案。 答案小于当前数字,guess函数返回-1 答案等于当前数字,guess函数返回0 答案大于当前数字,gue…

Android NDK开发详解之ndk-build 脚本

Android NDK开发详解之ndk-build 脚本 内部原理从命令行调用选项可调试 build 与发布 build要求 ndk-build 脚本使用 NDK 的基于 Make 的构建系统构建项目。我们针对 ndk-build 使用的 Android.mk 和 Application.mk 配置提供了更具体的文档。 内部原理 运行 ndk-build 脚本相…

JVM 分代垃圾回收过程

堆空间划分了代: 年轻代(Young Generation)分为 eden 和 Survivor 两个区,Survivor 又分为2个均等的区,S0 和 S1。 首先,新对象都分配到年轻代的 eden 空间,Survivor 刚开始是空的。 当 eden …

招生报名缴费小程序开发笔记(上)

前期调研 1.数字化趋势: 随着社会的数字化转型,越来越多的教育机构倾向于采用数字工具来简化和优化他们的招生和报名过程。招生报名缴费小程序是应对这一趋势的一种解决方案,可以提供高效、方便、快速的在线招生渠道。2.用户需求&#xff1a…

Jtti:Apache服务的反向代理及负载均衡怎么配置

配置Apache服务的反向代理和负载均衡可以帮助您分散负载并提高应用程序的可用性和性能。下面是一些通用的步骤,以配置Apache反向代理和负载均衡。 1. 安装和配置Apache: 确保您已经安装了Apache HTTP服务器。通常,Apache的配置文件位于/etc…

VSCode-C/C++环境配置

0.下载VSCode VSCode官网 Visual Studio Code - Code Editing. Redefined 1.安装VSCode 2.编译器下载与配置 2.1下载编译器安装包 编译器的安装包分为两种一种是在线的一种是离线的,其区别的特点如下 在线安装(只是个下载器,打开后还要下载各种东西…

RocketMQ生产者消息发送出去了,消费者一直接收不到怎么办?(Rocket MQ订阅关系一致性)

问题: 使用RocketMQ消息队列,生产者将数据发送出去了,但是生产者一致没接收到(或者是间隔好几分钟,突然接收到一条数据)怎么办?并且通过rocket web控制台查看消息的状态为NOT_ONELINE或者NOT_CONSUME&#…

韦东山D1S板子——利用xfel工具初始化内置64MB内存,并直接下载程序到内存运行

1、前言 (1)最近使用韦东山老师的D1S板子学习RISC-V架构知识,我是结合《RISC-V体系结构编程与实践》这本书的进行学习,其中韦东山老师对书中的代码做了部分移植,到MMU模块就没有在移植书中代码; &#xff0…

java毕业设计基于springboot+vue高校本科学生综评系统

项目介绍 本系统是利用Spring Boot框架而设计的一款结合用户的实际情况而设计的平台,利用VUE技术来将可供学生和管理员来使用的所有界面来显示出来,利用Java语言技术来编程实现用户和管理员所执行的各类操作业务逻辑,以MySQL数据库来存取系统…

把Qt6.2.4内置的标签打印了一遍

2023年10月31日&#xff0c;周二晚上 #include <QGridLayout> #include <QPushButton> #include <QLabel> #include <QApplication> #include <QStyle>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget widget;widget.set…

Python 数学函数和 math 模块指南

Python 提供了一组内置的数学函数&#xff0c;包括一个广泛的数学模块&#xff0c;可以让您对数字执行数学任务。 内置数学函数。min() 和 max() 函数可用于在可迭代对象中查找最低或最高值&#xff1a; 示例&#xff1a;查找可迭代对象中的最低或最高值&#xff1a; x min…

Webpack常见的插件和模式

文章目录 一、认识插件Plugin1.认识Plugin 二、CleanWebpackPlugin三、HtmlWebpackPlugin1.生成index.html分析2.自定义HTML模板3.自定义模板数据填充 四、DefinePlugin1.DefinePlugin的介绍2.DefinePlugin的使用 五、Mode配置 一、认识插件Plugin 1.认识Plugin Webpack的另一…

MySQL主从复制原理

1、MySQL主从复制的三个步骤及其原理图 slave会从master读取binlog来进行数据同步 MySQL复制过程分成三步&#xff1a; 1、master将改变记录到二进制日志&#xff08;binary log&#xff09;。这些记录过程叫做二进制日志事件&#xff0c;binary log events。 2、slave将ma…

AcWing 第127场周赛 构造矩阵

构造题目&#xff0c;考虑去除掉最后一行最后一列先进行考虑&#xff0c;假设除了最后一行和最后一列都已经排好了&#xff08;你可以随便排&#xff09;&#xff0c;那么分析知最后一个数字由限制以外其他都已经确定了&#xff0c;无解的情况是k为-1 并且n&#xff0c;m的奇偶…

【多线程面试题十七】、如果不使用synchronized和Lock,如何保证线程安全?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;如果不使用synchronized…

【Linux】虚拟机部署与发布J2EE项目(Linux版本)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…

零资源的大语言模型幻觉预防

零资源的大语言模型幻觉预防 摘要1 引言2 相关工作2.1 幻觉检测和纠正方法2.2 幻觉检测数据集 3 方法论3.1 概念提取3.2 概念猜测3.2.1 概念解释3.2.2 概念推理 3.3 聚合3.3.1 概念频率分数3.3.2 加权聚合 4 实验5 总结 摘要 大语言模型&#xff08;LLMs&#xff09;在各个领域…

FedGNN: Federated Graph Neural Network for Privacy-Preserving Recommendation

FedGNN&#xff1a;用于隐私保护推荐的联邦图神经网络 参考笔记 ICML-21-workshop 本文的主要创新工作 在具有局部差分隐私的模型训练中保护模型梯度&#xff0c;并提出一种伪交互项目采样技术来保护用户与之交互的项目。提出了一种保护隐私的用户-项目图扩展方法&#xff0…

Go学习第十七章——Gin中间件与路由

Go web框架——Gin中间件与路由 1 单独注册中间件1.1 入门案例1.2 多个中间件1.3 中间件拦截响应1.4 中间件放行 2 全局注册中间件3 自定义参数传递4 路由分组4.1 入门案例4.2 路由分组注册中间件4.3 综合使用 5 使用内置的中间件6 中间件案例权限验证耗时统计 1 单独注册中间件…