LLM - Baichuan-13B 多卡加载与推理测试

目录

​编辑

一.引言

二.模型加载

1.量化加载

◆ 基础配置

◆ 8_bit 加载

◆ 4_bit 加载

2.多卡加载

◆ API 加载

◆ accelerate 加载

三.模型推理

1.显存查看

◆ Nvidia 显卡监控

◆ Python subprocess 调用

2.双卡推理

◆ 双卡 divice 分配

◆ 双卡推理 GPU-Util

3.三卡推理

◆ 三卡 divice 分配

◆ 三卡推理 GPU-Util

◆ 多卡推理效率差异

四.总结


一.引言

Baichuan-13B 具有良好的中文语料输出功能,在部署 Baichuan-13B 模型时,博主尝试不同张数的显卡部署模型推理服务,下面看看不同卡以及是否量化模型在内存和推理时间上有何区别。

二.模型加载

1.量化加载

◆ 基础配置

    config_kwargs = {"trust_remote_code": True,"cache_dir": None,"revision": 'main',"use_auth_token": None,}

8_bit 加载

    config_kwargs["load_in_8bit"] = Trueconfig_kwargs["quantization_config"] = BitsAndBytesConfig(load_in_8bit=True,llm_int8_threshold=6.0)

4_bit 加载

 config_kwargs["load_in_4bit"] = Trueconfig_kwargs["quantization_config"] = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_compute_dtype=torch.float16,bnb_4bit_use_double_quant=True,bnb_4bit_quant_type="nf4")

Tips:

这里实际测试情况下,Baichuan-13B 量化前后显存消耗一致,即量化未生效,可以试试调整 llm_int8_threshold 的阈值再尝试一下。

2.多卡加载

API 加载

    bc_model = AutoModelForCausalLM.from_pretrained(ori_model_path,config=config,torch_dtype=torch.float16,low_cpu_mem_usage=True,trust_remote_code=True,revision='main',device_map='auto')

添加 device_map='auto' 参数,如果还不生效可以尝试在脚本中添加:

export CUDA_VISIBLE_DEVICES=0,1

根据实际卡的情况,修改对应的 device_id 即可。

accelerate 加载

if torch.cuda.device_count() > 1:from accelerate import dispatch_modelfrom accelerate.utils import infer_auto_device_map, get_balanced_memorydevice_map = infer_auto_device_map(bc_model, max_memory=get_balanced_memory(bc_model))bc_model = dispatch_model(bc_model, device_map)print('multi GPU predict => {}'.format(device_map))
else:bc_model = bc_model.cuda()print("single GPU predict")

通过 infer_auto_device_map 获取不同 layer 对应的 device,这里 accelerate 版本为 0.21.0。 

三.模型推理

这里采用 P40-24G 作为基础显卡,常规 Baichuan-13B 加载需要 28G 显存,下面使用双卡 P40 和三卡 P40 尝试推理。

1.显存查看

为了观察推理时多卡的显存占用情况,我们使用 shell 命令和 python 命令对显存进行监控。

Nvidia 显卡监控

在 shell 命令行输入下述命令,每 3 s 调用一次 nvidia-smi 查看一次显卡使用情况

watch -n 3 nvidia-smi

Python subprocess 调用

import subprocessdef get_gpu_memory_usage(info):# 使用nvidia-smi命令获取显卡信息cmd = "nvidia-smi --query-gpu=memory.used --format=csv,nounits,noheader"result = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True, encoding='utf-8')memory_used = result.stdout.strip().split('\n')print("[%s Memory Usage: %s]" %(info, ','.join(memory_used)))

使用 python subprocess 调用 nvidia-smi cmd 命令,最后得到的 memory_used 为每张卡的显存使用情况,我们只需要在需要监控显卡显存的位置调用该函数即可,info 为对应的日志节点,例如加载模型前后,推理任务前后。

2.双卡推理

双卡 divice 分配

{'model.embed_tokens': 0, 'model.layers.0': 0, 'model.layers.1': 0, 'model.layers.2': 0, 'model.layers.3': 0, 'model.layers.4': 0, 'model.layers.5': 0, 'model.layers.6': 0, 'model.layers.7': 0, 'model.layers.8': 0, 'model.layers.9': 0, 'model.layers.10': 0, 'model.layers.11': 0, 'model.layers.12': 0, 'model.layers.13': 0,'model.layers.14': 0, 'model.layers.15': 0, 'model.layers.16': 0, 'model.layers.17': 0, 'model.layers.18': 0, 'model.layers.20': 1, 'model.layers.21': 1, 'model.layers.22': 1, 'model.layers.23': 1, 'model.layers.24': 1, 'model.layers.25': 1, 'model.layers.26': 1, 'model.layers.27': 1, 'model.layers.28': 1, 'model.layers.29': 1,'model.layers.30': 1, 'model.layers.31': 1, 'model.layers.32': 1, 'model.layers.33': 1, 'model.layers.34': 1, 'model.layers.35': 1, 'model.layers.36': 1, 'model.layers.37': 1, 'model.layers.38': 1, 'model.layers.39': 1,'model.norm': 1, 'lm_head': 1, 'model.layers.19': 1}

0-19 的 model.layers 分在了 0 卡,20-39 的 model.layers 分在了 1 卡,查看显存日志:

[模型加载后 Memory Usage: 12232,13436] 
[模型生成前 Memory Usage: 13746,13548]

基本单卡的负载在 12G + 的情况。

双卡推理 GPU-Util

 推理期间双卡的显存占用都在 13G,GPU-Util 均在 50% 左右,测试了两次耗时:

Cost: 804.4720668792725 Count: 54
Cost: 673.4583792686462 Count: 54

平均生成一条样本耗时 13.67 s,两次耗时波动还是有点大,更精确的结果需要更多次试验且结合自己的输入输出的 token 数量。

3.三卡推理

三卡 divice 分配

 {'model.embed_tokens': 0, 'model.layers.0': 0, 'model.layers.1': 0, 'model.layers.2': 0, 'model.layers.3': 0,'model.layers.4': 0, 'model.layers.5': 0, 'model.layers.6': 0, 'model.layers.7': 0, 'model.layers.8': 0, 'model.layers.9': 0, 'model.layers.10': 0, 'model.layers.11': 0, 'model.layers.13': 1, 'model.layers.14': 1, 'model.layers.15': 1, 'model.layers.16': 1, 'model.layers.17': 1, 'model.layers.18': 1, 'model.layers.19': 1,'model.layers.20': 1, 'model.layers.21': 1, 'model.layers.22': 1, 'model.layers.23': 1, 'model.layers.24': 1, 'model.layers.25': 1, 'model.layers.27': 2, 'model.layers.28': 2, 'model.layers.29': 2, 'model.layers.30': 2,'model.layers.31': 2, 'model.layers.32': 2, 'model.layers.33': 2, 'model.layers.34': 2, 'model.layers.35': 2, 'model.layers.36': 2, 'model.layers.37': 2, 'model.layers.38': 2, 'model.layers.39': 2, 'model.norm': 2, 'lm_head': 2, 'model.layers.26': 2, 'model.layers.12': 1}

0-11 的 model.layers 分配给 0 卡,12-25 卡1,26-39 分给卡2,除此卡 1 还加载了 embed_tokens ,卡 2 还加载了 lm_head,查看显存日志:

[模型加载后 Memory Usage: 8018,8596,9222] 
[模型生成前 Memory Usage: 9510,8674,9300]

基本单卡负载在 8-9 G。

三卡推理 GPU-Util

推理期间双卡的显存占用都在 9G 附近,GPU-Util 均在 30% 左右,同样测试两次耗时:

常规: Cost: 751.8843202590942 Count: 54
量化: Cost: 773.8875942230225 Count: 54

平均生成一条样本耗时 14.11 s。

多卡推理效率差异

上面测试 3卡 推理 14.11s 每条,2卡 推理 13.67s 每条,多一张卡甚至比少一张卡还慢,下面看下可能导致多卡推理速度变慢的可能:

● 通信开销

在多卡GPU系统中,不可避免地需要进行数据传输和同步操作。当使用三张GPU时,需要更多的数据传输和同步操作,这会导致额外的通信开销,从而降低了推理的性能。

● 内存带宽限制

多卡GPU系统中,每张GPU上的内存是相互独立的,无法直接访问其他GPU上的数据。当进行推理时,如果模型和数据无法完全适应单个GPU的内存容量,就需要将数据分配到不同的GPU上进行计算。在三卡GPU系统中,由于每个GPU要处理的数据更多,可能会导致内存带宽成为瓶颈,从而影响了推理的速度。

● 算力利用率

在某些情况下,模型的规模可能无法充分利用多卡 GPU 系统的并行计算能力。例如,如果模型较小或者推理过程中存在大量串行计算的部分,那么多卡 GPU 系统的优势可能无法充分发挥。在这种情况下,使用三卡GPU可能会增加额外的开销,并不能带来明显的性能提升。

这里出现上述情况可能是 [通信开销] 和 [算力利用率] 导致。

四.总结

这里使用 Baichuan-13B 尝试了不同的量化策略和多卡推理,这里量化并未生效,博主采用 LLaMA-33B 尝试相同配置 8Bit 量化生效,模型可以从 65G 显存占用下降至 33G 附近,具体模型量化效果请参考根据模型与实际业务使用场景。除此之外,多卡推理目前看除了可以在显存实现均匀分配外,在效率上并未取得明显提升,有相关的经验的同学也可以评论区一起交流。

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

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

相关文章

网络直播源码UDP协议搭建:为平台注入一份力量

网络直播源码中的UDP协议的定义: UDP协议又名用户数据报协议,是一种轻量级、无连接的协议。在网络直播源码平台中,UDP协议有着高速传输与实时性的能力,尤其是在网络直播源码实时性要求较高的场景,UDP协议的应用有着重要…

【Flutter】Flutter 使用 flutter_timezone 获取当前操作系统的时区

【Flutter】Flutter 使用 flutter_timezone 获取当前操作系统的时区 文章目录 一、前言二、flutter_timezone 包的背景三、安装和基本使用四、深入理解时区五、实际业务中的用法六、完整示例七、总结 一、前言 大家好!我是小雨青年,今天我想和大家分享一…

NeRFMeshing - 精确提取NeRF中的3D网格

准确的 3D 场景和对象重建对于机器人、摄影测量和 AR/VR 等各种应用至关重要。 NeRF 在合成新颖视图方面取得了成功,但在准确表示底层几何方面存在不足。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 我们已经看到了最新的进展,例如 NVIDIA 的 …

软件工程(二十) 系统运行与软件维护

1、系统转换计划 1.1、遗留系统的演化策略 时至今日,你想去开发一个系统,想完全不涉及到已有的系统,基本是不可能的事情。但是对于已有系统我们有一个策略。 比如我们是淘汰掉已有系统,还是继承已有系统,或者集成已有系统,或者改造遗留的系统呢,都是不同的策略。 技术…

WPF基础入门-Class4-WPF绑定

WPF基础入门 Class4&#xff1a;WPF绑定 一、简单绑定数据 1、cs文件中设置需要绑定的数据&#xff1a; public partial class Class_4 : Window{public Class_4(){InitializeComponent();List<Color> test new List<Color>();test.Add(new Color() { Code &q…

Java并发编程第6讲——线程池(万字详解)

Java中的线程池是运用场景最多的并发框架&#xff0c;几乎所有需要异步或并发执行任务的程序都可以使用线程池&#xff0c;本篇文章就详细介绍一下。 一、什么是线程池 定义&#xff1a;线程池是一种用于管理和重用线程的技术&#xff08;池化技术&#xff09;&#xff0c;它主…

微服务中间件--分布式搜索ES

分布式搜索ES 11.分布式搜索 ESa.介绍ESb.IK分词器c.索引库操作 (类似于MYSQL的Table)d.查看、删除、修改 索引库e.文档操作 (类似MYSQL的数据)1) 添加文档2) 查看文档3) 删除文档4) 修改文档 f.RestClient操作索引库1) 创建索引库2) 删除索引库/判断索引库 g.RestClient操作文…

http协议与apache

http概念&#xff1a; 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念 万维网&#xff1a;万维网并非某种特殊的计算机网络&#xff0c;是一个大规模的、联机式的信息贮藏库&…

长胜证券:沪指探底回升涨0.47%,券商、酿酒板块拉升,传媒板块活跃

24日早盘&#xff0c;沪指盘中震动回落&#xff0c;接近午盘快速拉升走高&#xff1b;深成指、创业板指强势上扬&#xff1b;北向资金今天转向&#xff0c;早盘积极出场&#xff0c;半日净买入近30亿元。 到午间收盘&#xff0c;沪指涨0.47%报3092.88点&#xff0c;深成指涨1.1…

最新AI创作系统ChatGPT源码+详细图文部署教程/支持GPT-4/AI绘画/H5端/Prompt知识库/思维导图生成

一、AI系统 如何搭建部署AI创作ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01;SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、Midjourney绘画&#xf…

Django(8)-静态资源引用CSS和图片

除了服务端生成的 HTML 以外&#xff0c;网络应用通常需要一些额外的文件——比如图片&#xff0c;脚本和样式表——来帮助渲染网络页面。在 Django 中&#xff0c;我们把这些文件统称为“静态文件”。 我们使用static文件来存放静态资源&#xff0c;django会在每个 INSTALLED…

LiveGBS伴侣

【1】LiveGBS 简介 LiveGBS是一套支持国标(GB28181)流媒体服务软件。 国标无插件;提供用户管理及Web可视化页面管理&#xff1b; 提供设备状态管理&#xff0c;可实时查看设备是否掉线等信息&#xff1b; 实时流媒体处理&#xff0c;PS&#xff08;TS&#xff09;转ES&…

GFPGAN 集成Flask 接口化改造

GFPGAN是一款腾讯开源的人脸高清修复模型&#xff0c;基于github上提供的demo&#xff0c;可以简单的集成Flask以实现功能接口化。 GFPGAN的安装&#xff0c;Flask的安装请参见其他文章。 如若使用POSTMAN进行测试&#xff0c;需使用POST方式&#xff0c;form-data的请求体&am…

5G 数字乡村数字农业农村大数据中心项目农业大数据建设方案PPT

导读&#xff1a;原文《5G 数字乡村数字农业农村大数据中心项目农业大数据建设方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。以下是部分内容&#xff0c; 喜…

TCP协议的重点知识点

TCP协议的重点知识点 TCP(传输控制协议)是一种面向连接、可靠的数据传输协议,工作在传输层,提供可靠的字节流服务。它是互联网协议栈中最重要、最复杂的协议之一,也是面试中常被问到的知识点。本文将详细介绍TCP协议的各个重要概念。 TCP基本特性 TCP主要具有以下基本特性: …

Django(9)-表单处理

django支持使用类创建表单实例 polls/forms.py from django import forms class NameForm(forms.Form):your_nameforms.CharField(label"Your name",max_length100)这个类创建了一个属性&#xff0c;定义了一个文本域&#xff0c;和它的label和最大长度。 polls/vi…

浅析Linux SCSI子系统:设备管理

文章目录 概述设备管理数据结构scsi_host_template&#xff1a;SCSI主机适配器模板scsi_host&#xff1a;SCSI主机适配器主机适配器支持DIF scsi_target&#xff1a;SCSI目标节点scsi_device&#xff1a;SCSI设备 添加主机适配器构建sysfs目录 添加SCSI设备挂载LunIO请求队列初…

华为云Stack的学习(三)

四、华为云Stack公共组件 1.华为云Stack公共负载均衡方案介绍 1.1 LVS原理 LVS是四层负载均衡&#xff0c;建立在OSI模型的传输层之上&#xff0c;所以效率非常高。 LVS有两种转发模式&#xff1a; NAT模式的转发主要通过修改IP地址&#xff08;位于OSI模型的第三层网络层&…

Jmeter(二十八):beanshell的使用

Beanshell 是一种轻量级的 Java 脚本,纯 Java 编写的,能够动态的执行标准 java 语法及一些扩展脚本语法,类似于 javaScript,在工作中可能用的多的就是: Beanshell 取样器:跟Http取样器并列Beanshell前置处理器:一般放在Http请求下,在请求前处理一些数据Beanshell后置处…

基于 xhr 实现 axios

基于 xhr 实现 axios 上面我们讲到二次封装 axios &#xff0c;但是现在我们尝试完全脱离 axios&#xff0c;自己实现一个 axios&#xff0c;由于 axios 底层是基于 xhr 做了二次封装&#xff0c;所以我们也可以尝试一下。 xhr 二次封装 src/plugins/xhr.js /*** 请求拦截器…