LLM大模型显存计算

一、目录

  1. 模型参数单位
  2. 内存计算案例
  3. 显卡算力
  4. 推理显存计算
  5. 训练显存计算
  6. huggface 官网计算 模型推理/训练 需要的显存
  7. 大模型输入长度与显存的关系
  8. 大模型推理 多线程与显存的关系

参考:https://blog.csdn.net/Johntill/article/details/132629075

二、实现

  1. 模型参数单位
    “10b”、“13b”、"70b"等术语通常指的是大型神经网络模型的参数数量。“10b” 意味着模型有大约 100 亿个参数。

  2. 内存计算案例
    ● fp32 精度,一个参数需要 32 bits, 4 bytes.
    ● fp16 精度,一个参数需要 16 bits, 2 bytes.
    ● int8 精度,一个参数需要 8 bits, 1 byte.
    内存分配: 1.模型参数 2. 梯度 3.优化器参数。

  3. 显卡算力
    显卡算力是什么?
    显卡算力是指显卡能够在给定时间内完成多少次浮点运算。它用于评估显卡的性能。通常被表示为每秒执行的浮点运算次数,也称为 FLOPS(Floating Point Operations Per Second)。
    计算显卡算力涉及到几个因素。首先,需要知道显卡的核心数量、时钟速度和每个核心的浮点运算单元数量。然后,将这些因素结合在一起,使用以下公式计算显卡算力:
    显卡算力 = 核心数量 x 时钟速度 x 浮点运算单元数量
    例如,如果显卡具有1280个核心,时钟速度为1400 MHz,每个核心具有两个浮点运算单元,则该显卡的算力为
    算力 = 1280 x 1400 x 2 = 3.584 TFLOPS

  4. 推理显存计算
    Llama-2-7b-hf 为例,全精度模型参数是float32类型:
    1b(10亿)个模型参数,约占用4G显存(实际大小:10^9 * 4 / 1024^3 ~= 3.725 GB),那么LLaMA的参数量为7b,那么加载模型参数需要的显存为:3.725 * 7 ~= 26.075 GB

  5. 训练显存计算
    大小=模型参数占用+梯度占用+优化器占用+CUDA kernel占用
    LLaMA-6B为例:
    模型参数:等于参数量每个参数所需内存。
    对于 fp32,LLaMA-6B 需要 6B
    4 bytes = 24GB内存
    对于 int8,LLaMA-6B 需要 6B1 byte = 6GB
    梯度:同上,等于参数量
    每个梯度参数所需内存。
    对于 fp32,LLaMA-6B 需要 6B4 bytes = 24GB内存
    对于 int8,LLaMA-6B 需要 6B
    1 byte = 6GB
    优化器参数:不同的优化器所储存的参数量不同。
    对于常用的 AdamW 来说,需要储存两倍的模型参数(用来储存一阶和二阶momentum)。
    fp32 的 LLaMA-6B,AdamW 需要 6B8 bytes = 48 GB
    int8 的 LLaMA-6B,AdamW 需要 6B
    2 bytes = 12 GB
    除此之外,CUDA kernel也会占据一些 RAM,大概 1.3GB 左右,查看方式如下。
    综上,int8 精度的 LLaMA-6B 模型部分大致需要 6GB+6GB+12GB+1.3GB = 25.3GB 左右

  6. huggface 官网计算 推理/训练 需要的显存
    https://huggingface.co/spaces/hf-accelerate/model-memory-usage

  7. 大模型输入长度与显存的关系

当前程序从启动到目前 查看显存最大占用情况:torch.cuda.max_memory_allocated("cuda:0")/1024**2
以chatglm2为例:
from transformers import AutoModel, AutoTokenizer
import torch
tokenizer = AutoTokenizer.from_pretrained("../chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("../chatglm2-6b", trust_remote_code=True).half().to(torch.device("cuda:0"))
model = model.eval()
res=[]
for i in range(100,6000,200):
    prompt=text[:i]
    max_length = len(prompt)
    top_p = 1
    temperature = 0.8
    response, history=model.chat(tokenizer, prompt, [], max_length=max_length, top_p=top_p,
                                               temperature=temperature)
    print(torch.cuda.max_memory_allocated("cuda:0")/1024**2)      #默认返回当前程序从开始所占用的最大显存
    print("=============================")
    res.append(torch.cuda.max_memory_allocated("cuda:0")/1024**2)
#查看显存
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"]
x=[i for i in range(100,6000,200)]
#服务器无法绘图,进行拷贝查看y=res
y=[11981.630859375, 12013.05419921875, 12056.77099609375, 12104.171875, 12147.87890625, 12194.2587890625, 12246.16259765625, 12283.880859375, 12326.7431640625, 12372.0830078125, 12418.00439453125, 12463.4248046875, 12504.59521484375, 12553.66162109375, 12593.26708984375, 12638.40234375, 12682.5390625, 12728.97021484375, 12790.80615234375, 12846.7744140625, 12894.125, 12944.5283203125, 12990.2294921875, 13030.0068359375, 13080.41064453125, 13126.8134765625, 13173.08203125, 13218.35302734375, 13265.4736328125, 13305.5966796875]
plt.plot(x,y,c="r")
plt.ylabel("显存占用:M")
plt.xlabel("序列长度:token")
plt.show()

在这里插入图片描述
8. 大模型推理 多线程与显存的关系

print(torch.cuda.memory_allocated("cuda:0")/1024**2)     #torch 模型占用显存
print(torch.cuda.max_memory_allocated("cuda:0")/1024**2)  #torch 模型占用显存最大值
显存大小=torch.cuda.memory_allocated("cuda:0")/1024**2 + (torch.cuda.max_memory_allocated("cuda:0")/1024**2)* 线程数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【详解】稀疏矩阵的十字链表✿◡‿◡

目录 引言: 稀疏矩阵的十字链表表示 第一步:创结点存数据 第二步:将头结点同数据结点串起来 第三步:创建一个总头结点构成循环链表 总代码如下: 运行结果如下: 结语: 引言: …

超简单的简历模板精选5篇

HR浏览一份简历也就25秒左右,如果你连「好简历」都没有,怎么能找到好工作呢? 如果你不懂得如何在简历上展示自己,或者觉得怎么改简历都不出彩,那请你一定仔细读完。 个人求职简历第 1 篇 男 22 本科 AI简历 市场营…

Open CV 图像处理基础:(五)Java 使用 Open CV 的绘图函数

Java 使用 Open CV 的绘图函数 使用 Open CV 在 Java 中对图片使用绘图函数,分别绘制矩形、斜线、圆形、椭圆形以及添加文本 Java 使用 Open CV 的绘图函数 Java 使用 Open CV 的绘图函数函数绘制矩形绘制线绘制圆形绘制椭圆添加文本 代码示例Open CV 专栏导航 函…

redis stream restTemplate消息监听队列框架搭建

整体思路 1. pom增加redis依赖&#xff1b; 2. 消息监听器&#xff0c;实现StreamListener接口&#xff0c;处理消息到达逻辑&#xff1b; 3. 将消息订阅bean及监听器注册到配置中&#xff1b; 1. pom <?xml version"1.0" encoding"UTF-8"?> <…

vue的mvvm模式

1.mvvm优点&#xff1a; 低耦合&#xff1a;视图&#xff08;View&#xff09;可以独立于Model变化和修改&#xff0c;一个ViewModel可以绑定到不同的View上&#xff0c;当View变化的时候Model可以不变&#xff0c;当Model变化的时候&#xff0c;View也可以不变。 可复用&…

PostgreSQL 配置文件、数据储存目录

文章目录 查询配置文件所在位置查询数据储存目录PostgreSQL的数据目录 查询配置文件所在位置 show config_file; -- 查询配置文件所在位置查询数据储存目录 show data_directory; -- 查询数据储存目录PostgreSQL的数据目录 在PostgreSQL的数据目录&#xff08;C:\Program…

android studio使用总结

gradle是项目构建的工具&#xff0c;在gradle-wrapper.properties这个文件中设置&#xff0c; 然后就会下载相应版本的安装包到这个路径C:\Users\ly.gradle\wrapper\dists&#xff0c;例如这里是7.0.2&#xff0c; gradle和studio中的jdk版本需要对应&#xff0c;否则无法构建项…

使用numpy处理图片——图片拼接

大纲 左右拼接上下拼接 在《使用numpy处理图片——图片切割》一文中&#xff0c;我们介绍了如何使用numpy将一张图片切割成4部分。本文我们将反其道而行之&#xff0c;将4张图片拼接成1张图片。 基本的思路就是先用两张图以左右结构拼接成上部&#xff0c;另外两张图也以左右拼…

实现用户注册功能

实现用户注册功能 注&#xff1a;打赏即可获得一对一线下辅导&#xff0c;机不可失&#xff0c;时不再来

软件系统培训方案(Word)

1. 培训概述 2. 培训目的 3. 培训对象及要求 3.1. 培训对象 3.2. 培训人员基本要求 4. 培训方式 5. 培训内容 6. 培训讲师 7. 培训教材 8. 培训质量保证 8.1. 用户培训确认报告 8.2. 培训疑问解答 软件开发全文档下载&#xff1a;软件项目开发全套文档下载_软件项目文档-CSDN博…

MySQL——SQL语句进阶

select * from 表 where 条件 group by 条件 order by 排序 limit 分组 Group by select * from 表 group by 条件 结果为每个分组的第一条记录&#xff0c;该条记录作为该组的标志 select * from subject GROUP BY gradeidselect count(1),gradeid from subject GROUP B…

vue3+ts+vite项目从0 搭建,配置安装router/pinia/element-plus/scss等

一、安装vite环境 官网&#xff1a;https://cn.vitejs.dev/guide/why.html npm init vite1.选择vue 2.选择typescipt 3.创建成功 默认项目结构如下 4.安装项目依赖 npm install 5.启动项目 npm run dev二。安装配置scss 1.运行安装scss npm install -D sass sass-loa…

[UI5] ODATA V4中的CRUD

文章目录 前言一、Read二、Create三、Update四、Delete 前言 ODATA V4在CRUD方面与V2截然不同。 这篇文章简单介绍V4中是如何进行CRUD操作 一、Read Model不再有read方法&#xff0c; 一般是把Path绑定到View中进行读取&#xff0c; 如果需要额外的读取数据&#xff0c;可使用…

Vant-ui图片懒加载

核心代码 在你的全局顶部引入和初始化 Vue.use(vant.Lazyload, {loading: /StaticFile/img/jiazai.jpg,error: /StaticFile/img/jiazai.jpg,lazyComponent: false, });//图片懒加载 <img v-lazy"https://img-blog.csdnimg.cn/direct/3d2c8a7e2c0040488a8128c3e381d58…

ubuntu20.04 deepstream 6.3安装

1.基础环境gstreamer sudo apt install \ libssl-dev \ libgstreamer1.0-0 \ gstreamer1.0-tools \ gstreamer1.0-plugins-good \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-ugly \ gstreamer1.0-libav \ libgstreamer-plugins-base1.0-dev \ libgstrtspserver-1.0-0 …

基于JavaWeb+BS架构+SpringBoot+Vue+Hadoop短视频流量数据分析与可视化系统的设计和实现

基于JavaWebBS架构SpringBootVueHadoop短视频流量数据分析与可视化系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 目  录 目  录 I 1绪 论 1 1.1开发背景 1 1.2开…

IDEA创建springboot+mybatis项目(java8 和java21可行)

IDEA创建springbootmybatis项目&#xff08;java8 和java21可行&#xff09; 今天博主讲一下&#xff0c;IDEA创建springbootmybatis项目的文章。 步骤分别是如下几步&#xff1a; 1. 创建maven项目 2. 配置pom.xml文件 3. 创建目录结构 4. 创建配置项目文件 5. 生成创建…

【pytorch】使用pytorch构建线性回归模型-了解计算图和自动梯度

使用pytorch构建线性回归模型 线性方程的一般形式 衡量线性损失的一般形式-均方误差 pytorch中计算图的作用和优势 在 PyTorch 中&#xff0c;计算图&#xff08;Computational Graph&#xff09;是一种用于表示神经网络运算的数据结构。每个节点代表一个操作&#xff0c;例如…

报错:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver

记一次关于驱动报错的问题 背景 原始驱动版本515&#xff0c;cuda 11.5.。 要将cuda 版本升级到11.7 内容 我去nvidia官网下载了 11.7.1的cuda tools nvidia CUDA 下载。 按照步骤安装后&#xff0c;执行nvcc -V ,可以看到已经正常更新 但是执行 nvidia-smi 时报错 NVIDIA…

67.网游逆向分析与插件开发-角色数据的获取-分析角色数据基址

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;角色类的数据分析与C还原-CSDN博客 基址这个东西说好找也好找&#xff0c;说不好找是真找不着&#xff0c;但就根据一个原则&#xff0c;就是确认这个东西有基址还是没基址&#xff0c;为什么会有没基…