当前位置: 首页 > news >正文

大模型(LLMs)推理篇

大模型(LLMs)推理篇

1. 为什么大模型推理时显存涨的那么多还一直占着?

  1. 首先,序列太长了,有很多Q/K/V;
  2. 其次,因为是逐个预测next token,每次要缓存K/V加速解码。

大模型在gpu和cpu上推理速度如何?

7B量级下:

  • cpu推理速度约10token/s;
  • 单卡A6000和8核AMD的推理速度通常为 10:1。

推理速度上,int8和fp16比起来怎么样?

根据实践经验,int8模式一般推理会明显变慢(huggingface的实现)

大模型有推理能力吗?

大模型有推理能力。有下面2个方面的体现:

ChatGPT拥有in-context correction的能力,即如果说错了,给出矫正,ChatGPT能"听懂"错在哪儿了,并向正确的方向修正。in-context correction要比in-context learning难了太多,描述越详细清楚,ChatGPT回答得越好。要知道,越详细的描述,在预训练的文本里越难匹配到的。

在询问ChatGPT互联网上并不存在内容的时候,能给出较好答案(如用ChatGPT学建模);ChatGPT能通过信息猜你心中的想法;你可以制定一个全新的游戏规则让ChatGPT和你玩,ChatGPT可以理解。

大模型生成时的参数怎么设置?

生成模型预测调参建议:

建议去调整下 top_p, num_beams, repetition_renalty, temperature, do_sample=True;

数据生成有重复,调高repetition_renalty;

生成任务表达单一的,样本也不多的,可适当调低 temperature,生成的样子跟训练集的比较像;如果要复现训练集的效果,temperature=0.01即可。

以上是经验参数,具体调参根据任务而定,不是固定的。
•参数解释:

top_p=0.9,
#Moderately increase the probability threshold of nucleus sampling to increase the quantity of candidate tokens and increase generation diversity.temperature=1.0,
#The previous low temperature parameter could lead to a severe polarization in the probability distribution of generated words, which degenerates the generation strategy into greedy decoding.do_sample=True,
#do_sample parameter is set to False by default. After setting to True, the generation methods turn into beam-search multinomial sampling decoding strategy.no_repeat_ngram_size=6,
#Configure the probability of the next repeating n-gram to 0, to ensure that there are no n-grams appearing twice. This setting is an empirical preliminary exploration.repetition_penalty=1.8,
#For words that have appeared before, in the subsequent prediction process, we reduce the probability of their reoccurrence by introducing the repetition_penalty parameter. This setting is an empirical preliminary exploration.

有哪些省内存的大语言模型训练/微调/推理方法?

  • 动机:大模型(LLMs)现在是 NLP 领域的最主流方法之一,但是大模型的训练/微调/推理需要的内存也越来越多。

举例来说,即使 RTX 3090 有着 24GB 的 RAM,是除了 A100 之外显存最大的显卡。但使用一块 RTX 3090 依然无法 fp32 精度训练最小号的 LLaMA-6B。

  • Memory-Efficient 的 LLMs 的训练/微调/推理方法
    • fp16
    • int8
    • LoRA
    • Gradient checkpointing
    • Torch FSDP
    • CPU offloading

如何估算模型所需的RAM?

首先,我们需要了解如何根据参数量估计模型大致所需的 RAM,这在实践中有很重要的参考意义。我们需要通过估算设置 batch_size,设置模型精度,选择微调方法和参数分布方法等。

接下来,我们用LLaMA-6B 模型为例估算其大致需要的内存。首先考虑精度对所需内存的影响:

  • fp32 精度,一个参数需要 32 bits, 4 bytes.
  • fp16 精度,一个参数需要 16 bits, 2 bytes.
  • int8 精度,一个参数需要 8 bits, 1 byte.

其次,考虑模型需要的 RAM 大致分三个部分:

  • 模型参数
  • 梯度
  • 优化器参数

模型参数:等于参数量*每个参数所需内存。

  • 对于 fp32,LLaMA-6B 需要 6B*4 bytes = 24GB内存
  • 对于 int8,LLaMA-6B 需要 6B*1 byte = 6GB

梯度:同上,等于参数量*每个梯度参数所需内存。

优化器参数:不同的优化器所储存的参数量不同。

对于常用的 AdamW 来说,需要储存两倍的模型参数(用来储存一阶和二阶momentum)。

  • fp32 的 LLaMA-6B,AdamW 需要 6B*8 bytes = 48 GB
  • int8 的 LLaMA-6B,AdamW 需要 6B*2 bytes = 12 GB

除此之外,CUDA kernel 也会占据一些 RAM,大概 1.3GB 左右,查看方式如下。

    > torch.ones((1,1)).to("cuda")> print_gpu_utilization()>>>GPU memory occupied: 1343 MB

综上,int8 精度的 LLaMA-6B 模型部分大致需要 6GB+6GB+12GB+1.3GB = 25.3GB 左右。

再根据LLaMA的架构(hidden_size = 4096, intermediate_size =11008, num_hidden_layers = 32, context_length = 2048)计算中间变量内存。

每个 instance 需要:

    (4096 +11008)* 2048 *32 * 1byte = 990MB

所以一张 A100(80GB RAM)大概可以在 int8 精度;batch_size = 50 的设定下进行全参数训练。查看消费级显卡的内存和算力:

2023 GPU Benchmark and Graphics Card Comparison Chart:https://www.gpucheck.com/gpu-benchmark- graphics-card-comparison-chart

Fp16-mixed precision

在这里插入图片描述

混合精度训练的大致思路是在 forward pass 和 gradient computation 的时候使用 fp16 来加速,但是在更新参数时使用 fp32。

用 torch 实现:

CUDA Automatic Mixed Precision examples:https://pytorch.org/docs/stable/notes/amp_examples.html
torch fp16 推理:直接使用 model.half() 将模型转换为fp16.

    model.eval()model.half()

使用 Huggingface Transformers:在 TrainingArguments 里声明 fp16=True
fp16=Truehttps://huggingface.co/docs/transformers/perf_train_gpu_one#fp16-training

Int8-bitsandbytes

Int8 是个很极端的数据类型,它最多只能表示 - 128~127 的数字,并且完全没有精度。

为了在训练和 inference 中使用这个数据类型,bitsandbytes 使用了两个方法最大程度地降低了其带来的误差:

  1. vector-wise quantization
  2. mixed precision decompasition

Huggingface 在这篇文章中用动图解释了 quantization 的实现:https://huggingface.co/blog/hf-bitsandbytes-integration

论文:

LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale:https://arxiv.org/abs/2208.07339

借助 Huggingface PEFT,使用 int8 训练 opt-6.5B 的完整流程:

https://github.com/huggingface/peft/blob/main/examples/int8_training/Finetune_opt_bnb_peft.ipynb

LoRA

在这里插入图片描述

Low-Rank Adaptation 是微调 LLMs 最常用的省内存方法之一。

LoRA 发现再微调 LLMs 时,更新矩阵(update matrix)往往特别 sparse,也就是说 update matrix 是低秩矩阵。LoRA 的作者根据这一特点将 update matrix reparametrize 为两个低秩矩阵的积积 。

其中,,A 和 B 的秩为 r,且 。

如此一来,A+B 的参数量将大大小于 .

LoRA 的论文:https://arxiv.org/pdf/2106.09685.pdf

借 助 Huggingface PEFT 框 架 , 使 用 LoRA 微 调 mt0:

https://github.com/huggingface/peft/blob/main/examples/conditional_generation/peft_lora_seq2seq.ipynb

Gradient Checkpointing

在 torch 中使用 - 把 model 用一个 customize 的 function 包装一下即可,详见:

Explore Gradient-Checkpointing in PyTorch:https://qywu.github.io/2019/05/22/explore-gradient-checkpointing.html

在 Huggingface Transformers 中使用:

https://huggingface.co/docs/transformers/v4.27.2/en/perf_train_gpu_one#gradient-checkpointing

Torch FSDP+CPU offload

Fully Sharded Data Paralle(FSDP)和 DeepSpeed 类似,均通过 ZeRO 等分布优化算法,减少内存的占用量。其将模型参数,梯度和优化器状态分布至多个 GPU 上,而非像 DDP 一样,在每个 GPU 上保留完整副本。CPU offload 则允许在一个 back propagation 中,将参数动态地从 GPU -> CPU, CPU -> GPU 进行转移,从而节省 GPU 内存。

Huggingface 这篇博文解释了 ZeRO 的大致实现方法:https://huggingface.co/blog/zero-deepspeed-fairscale

借助 torch 实现 FSDP,只需要将 model 用 FSDPwarp 一下;同样,cpu_offload 也只需要一行代码:

https://pytorch.org/blog/introducing-pytorch-fully-sharded-data-parallel-api/

在这个可以查看 FSDP 支持的模型:https://pytorch.org/docs/stable/fsdp.html

在 Huggingface Transformers 中使用 Torch FSDP:

https://huggingface.co/docs/transformers/v4.27.2/en/main_classes/trainer#transformers.Trainin

根据某些 issue,shard_grad_op(只分布保存 optimizer states 和 gradients)模式可能比 fully_shard 更稳定:

https://github.com/tatsu-lab/stanford_alpaca/issues/32

如何让大模型输出合规化

根据用户的输入问题内容,大模型进行生成回答的内容,但是生成的回答,不直接对外输出给用户。需要进行合规的处理,因为大模型的输出内容不可控,对于严肃的场景,以免引起用户的投诉。所以需要进合并处理。

目前处理的方法,模型生成内容,再把这些内容生成向量,再查询话术向量库,得到最相似的话术。如果查询结果或相似得分比较阈值低或者查询不到结果,则走兜底策略。兜底策略按用户所在的对话阶段,实验不同的兜底话术。或者使用万能兜底话术。

应用模式变更

机器人销售场景的case:

纯大模型AI模式,最初直接是大模型机器人直接和用户对话,全流程都是大模型对话走流程。

对比之前的AI(小模型意图、话术策略)+人工模式,发现之前的初始阶段通过率高些,初步判断可能是用户说的太发散,大模型不好收敛。

就调整为AI+大模型AI模式。这样前面的AI主要是小模型意图、话术策略模式,任务引导更明确。大模型可以更好的和有意向的用户进行交互,更容易引导用户成单。

模型输出的分布比较稀疏,怎么处理?

可以采用一些方法来处理模型输出的分布稀疏,例如使用softmax函数的温度参数调节来平滑输出分布,或者引入正则化技术,如Dropout,以减少模型对特定类别的过度依赖。

总结

本文讨论了大模型(LLMs)推理时的显存占用、推理速度、推理能力、生成参数设置以及省内存的训练/微调/推理方法。大模型推理时显存占用高主要因为序列长和缓存K/V加速解码。推理速度在GPU和CPU上差异显著,int8模式推理速度较慢。大模型具有推理能力,如ChatGPT的in-context correction。生成参数设置需调整top_p, num_beams, repetition_renalty, temperature等。省内存方法包括fp16混合精度、int8量化、LoRA、梯度检查点和Torch FSDP+CPU offload。通过这些方法,可以在有限的计算资源下高效训练和推理大模型。

相关文章:

大模型(LLMs)推理篇

大模型(LLMs)推理篇 1. 为什么大模型推理时显存涨的那么多还一直占着? 首先,序列太长了,有很多Q/K/V;其次,因为是逐个预测next token,每次要缓存K/V加速解码。 大模型在gpu和cpu上…...

Leetcode 412. Fizz Buzz

Problem Given an integer n, return a string array answer (1-indexed) where: answer[i] “FizzBuzz” if i is divisible by 3 and 5.answer[i] “Fizz” if i is divisible by 3.answer[i] “Buzz” if i is divisible by 5.answer[i] i (as a string) if none of t…...

双因子认证:统一运维平台安全管理策略

01双因子认证概述 双因子认证(Two-Factor Authentication,简称2FA)是一种身份验证机制,它要求用户提供两种不同类型的证据来证明自己的身份。这通常包括用户所知道的(如密码)、用户所拥有的(如…...

CMake笔记:install(TARGETS target,...)无法安装的Debug/lib下

1. 问题描述 按如下CMake代码,无法将lib文件安装到Debug/lib或Release/lib目录下,始终安装在CMAKE_INSTALL_PREFIX/lib下。 install(TARGETS targetCONFIGURATIONS DebugLIBRARY DESTINATION Debug/lib) install(TARGETS targetCONFIGURATIONS Release…...

使用ENSP实现NAT

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为12.12.12.1/30 ip address 12.12.12.1 30进入e0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置…...

漫步北京小程序构建智慧出行,打造旅游新业态模式

近年来,北京市气象服务中心持续加强推进旅游气象服务,将旅游气象监测预警基础设施纳入景区配套工程,提升气象和旅游融合发展水平,服务建设高品质智慧旅游强市。 天气条件往往影响着旅游景观的体验,北京万云科技有限公…...

对齐输出

对齐输出 C语言代码C 语言代码Java语言代码Python语言代码 💐The Begin💐点点关注,收藏不迷路💐 输入三个整数,按每个整数占8个字符的宽度,右对齐输出它们。 输入 只有一行,包含三个整数&…...

Wekan看板安装部署与使用介绍

Wekan看板安装部署与使用介绍 1. Wekan简介 ​ Wekan 是一个开源的看板式项目管理工具,它的配置相对简单,因为大多数功能都是开箱即用的。它允许用户以卡片的形式组织和跟踪任务,非常适合敏捷开发和日常任务管理。Wekan 的核心功能包括看板…...

VisionPro 机器视觉案例 之 黑色齿轮

第十五篇 机器视觉案例 之 齿轮齿数检测 文章目录 第十五篇 机器视觉案例 之 齿轮齿数检测1.案例要求2.实现思路2.1 统计齿轮齿数使用模板匹配工具CogPMAlignTool,并从模板匹配工具的结果集中得到每一个齿的中心点。2.2 测量距离需要知道两个坐标点,一个…...

学习python的第十三天之数据类型——函数传参中的传值和传址问题

学习python的第十三天之数据类型——函数传参中的传值和传址问题 函数传参中的传值和传址问题 函数传参的机制可以理解为传值(pass-by-value)和传址(pass-by-reference)的混合体,但实际上更接近于传对象引用&#xff…...

Windows11深度学习环境配置

CUDA、CUDNN 一、安装另一个版本的CUDA 下载.exe文件,网址打不开自己开热点就能解决:CUDA Toolkit 11.2 Downloads | NVIDIA Developer 若遇到“You already have a newer version of the NVIDIA Frameview SDK installed” 1.把电脑已经存在的FrameVi…...

电销老是被标记,该如何解决!!!

在当今的商业世界中,电话销售依然是许多企业拓展业务、接触客户的重要手段。然而,电销人员常常面临一个令人头疼的问题 —— 老是被标记。 一、电销被标记的困扰 当你的电话号码被频繁标记为 “骚扰电话”“推销电话” 等,会带来一系列不良…...

MyBatis入门——基本的增删改查

目录 一、MyBatis简介 二、搭建MyBatis (一)配置依赖 (二)log4j日志功能 (三)数据库配置文件——jdbc.properties (四)创建MyBatis的核心配置文件 (五)使用MyBatisX插件 三、项目其他配置搭建 (一)创建数据库连接工具类 (二)创建表 (三)创建数据库的实体类 (四)Use…...

学习Gentoo系统中二进制软件包和源代码包的概念

Gentoo Linux 是一个以源代码包管理和高度定制化特性著称的Linux发行版。以下是关于Gentoo系统中二进制软件包和源代码包的概念、发展历程以及它们各自的优势: 二进制软件包概念及发展历程: 概念:Gentoo的二进制软件包是指预先编译好的软件包…...

麦肯锡报告 | 未来的经济引擎:解读下一代竞争领域

随着科技和商业的快速发展,一些具有高增长性和高动态性的行业正在悄然崛起,成为推动全球经济发展的新引擎。这些行业被称为“竞争领域”(Arenas)。据麦肯锡全球研究院(MGI)的研究,这些领域有望在…...

连接mysql并读取指定表单数据到DataFrame

提问 python 如何连接mysql并读取指定表单数据到DataFrame 解答 要在Python中连接MySQL并读取指定表单数据到DataFrame,你可以使用pandas库结合sqlalchemy引擎或者mysql-connector-python。这里我将展示两种方法的示例代码。 使用pandas和sqlalchemy 确保安装了…...

从入门到精通数据结构----四大排序(上)

目录 首言: 1. 插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 3. 交换排序 3.1 冒泡排序 3.2 快排 结尾: 首言: 本篇文章主要介绍常见的四大排序:交换排序、选择排序、插入排序、归并排…...

【bug】使用transformers训练二分类任务时,训练损失异常大

使用transformers训练二分类任务时,训练损失异常大 问题分析 问题 training_loss异常大,在二分类损失中,收敛在1~2附近,而eval_loss却正常(小于0.5) 分析 参考: Bug in gradient accumulation…...

文献阅读与笔记整理技巧

文献阅读 1.原因 (1)了解背景知识(硕博学位论文,大牛文献综述) (2)把握研究方向(行业最新论文,大牛文献综述) (3)学习设计思路&am…...

Python Flask中集成SQLAlchemy和Flask-Login

在现代Web应用开发中,数据库和用户认证是两个非常重要的功能。Flask作为一个轻量级的Python Web框架,本身只提供了最基本的Web功能。但是,它可以通过集成各种优秀的扩展库来增强功能。本文将介绍如何在Flask应用中集成SQLAlchemy(数据库)和Flask-Login(用户认证),并提供一个完整…...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...