使用ExLlamaV2在消费级GPU上运行Llama2 70B

Llama 2模型中最大也是最好的模型有700亿个参数。一个fp16参数的大小为2字节。加载Llama 270b需要140 GB内存(700亿* 2字节)。

只要我们的内存够大,我们就可以在CPU上运行上运行Llama 2 70B。但是CPU的推理速度非常的慢,虽然能够运行,速度我们无法忍受。

能否在高端消费级GPU,如NVIDIA RTX 3090或4090,上运行呢,如果我们将Llama 2 70b量化到4位精度,仍然需要35 GB的内存(700亿* 0.5字节),如果有2个GPU,那么肯定是可以的。或者通过GPTQ量化,可以在不影响模型性能的情况下将精度进一步降低到3位。一个3位参数在内存中占0.375字节。Llama 2 70b量化为3比特后仍重26.25 GB,一个4090还是装不下。那么把精度降低到2位呢。他肯定可以使用24gb的VRAM加载,但根据之前对2位量化的研究,模型的性能会显著下降。

为了避免在模型的性能上损失太多,可以将模型的重要层或部分量化到更高的精度,而将不太重要的部分量化到更低的精度。这被称作混合精度量化。

在本文中,我将展示如何使用ExLlamaV2以混合精度量化模型。我们将看到如何将Llama 2 70b量化到低于3位的平均精度。

Llama 2的混合精度量化

为了量化混合精度的模型,我们需要安装ExLlamaV2。

 git clone https://github.com/turboderp/exllamav2cd exllamav2pip install -r requirements.txt

我们的目标是在消费级gpu上运行模型。

对于Llama 2 70b,我们的目标是使用24gb的VRAM,NVIDIA RTX3090/4090 gpu

对于Llama 2 13B,我们的目标是12gb的VRAM。这样RTX3060/3080/4060/4080都可以使用,并且它可以运行在免费的谷歌Colab和T4 GPU上。

如何使用ExLlamaV2

ExLlamaV2使用的量化算法与GPTQ类似。但ExLlamaV2不是选择一种精度类型,而是在测量量化误差的同时为每层尝试不同的精度类型。所有的尝试和相关的错误率都会被保存。用户提供的目标精度,ExLlamaV2算法将通过为每层模块选择平均最低错误率的目标精度的量化精度来量化模型。

在量化过程中,ExLlamaV2会输出测试的结果:

 -- Linear: model.layers.10.mlp.up_proj-- 0.05:3b/0.95:2b 32g s4         2.18 bpw    rfn_error: 0.21867-- 0.25:3b/0.75:2b 32g s4         2.38 bpw    rfn_error: 0.20617-- 0.25:4b/0.75:2b 32g s4         2.63 bpw    rfn_error: 0.20230-- 0.1:4b/0.4:3b/0.5:2b 32g s4    2.73 bpw    rfn_error: 0.18449-- 0.1:4b/0.9:3b 32g s4           3.23 bpw    rfn_error: 0.10229-- 0.2:6b/0.8:3b 32g s4           3.73 bpw    rfn_error: 0.09791-- 1.0:3b 128g s4                 3.03 bpw    rfn_error: 0.11354-- 1.0:3b 32g s4                  3.13 bpw    rfn_error: 0.10491-- 0.05:4b/0.95:3b 32g s4         3.18 bpw    rfn_error: 0.10363-- 0.4:4b/0.6:3b 32g s4           3.53 bpw    rfn_error: 0.09272-- 0.6:4b/0.4:3b 64g s4           3.66 bpw    rfn_error: 0.08835-- 1.0:4b 128g s4                 4.03 bpw    rfn_error: 0.05756-- 1.0:4b 32g s4                  4.13 bpw    rfn_error: 0.05007-- 0.1:5b/0.9:4b 32g s4           4.23 bpw    rfn_error: 0.04889-- 0.1:6b/0.9:4b 32g s4           4.33 bpw    rfn_error: 0.04861-- 1.0:5b 128g s4                 5.03 bpw    rfn_error: 0.02879-- 0.1:6b/0.9:5b 32g s4           5.23 bpw    rfn_error: 0.02494-- 0.05:8b/0.05:6b/0.9:5b 32g s4  5.33 bpw    rfn_error: 0.02486-- 0.4:6b/0.6:5b 32g s4           5.53 bpw    rfn_error: 0.02297-- 0.1:8b/0.3:6b/0.6:5b 32g s4    5.73 bpw    rfn_error: 0.02280-- 1.0:6b 128g s4                 6.03 bpw    rfn_error: 0.01503-- 1.0:6b 32g s4                  6.13 bpw    rfn_error: 0.01471-- 0.1:8b/0.9:6b 128g s4          6.23 bpw    rfn_error: 0.01463-- 1.0:8b 32g s4                  8.13 bpw    rfn_error: 0.00934-- Time: 19.57 seconds

我们可以看到,误码率随着量化精度(bpw,即每权重比特数)的增加而降低,正如预期的那样。

使用ExLlamaV2进行量化就像运行convert.py脚本一样简单:

 python convert.py \-i ./Llama-2-13b-hf/ \-o ./Llama-2-13b-hf/temp/ \-c test.parquet \-cf ./Llama-2-13b-hf/3.0bpw/ \-b 3.0

脚本的主要参数如下:

  • input model (-i):以“safetensors”格式包含模型的本地目录。
  • 用于校准的数据集(-c):我们需要一个用于校准量化的数据集。它必须以“parquet”格式存储在本地。
  • output directory (-cf):存放量化模型的本地目录。
  • 量化的目标精度(-b):模型将以混合精度进行量化,混合精度将平均为目标精度。我们选择以3位精度为目标。

需要注意的是:

ExLlamaV2不支持Hugging Face的线上模型,因为它期望模型和校准数据集存储在本地。

上面这个这个量化过程在谷歌Colab PRO上耗时2小时5分钟。在整个过程中,它消耗的VRAM不超过5 GB,但CPU RAM的峰值消耗为20 GB。

因为T4相当慢,所以如果使用V100或4090速度会更快。这里不确定在量化过程中使用了多少GPU。可能是CPU速度比GPU对量化时间的影响更大。

量化参数计算

如果要量化Llama 2 70b,我们应该预估一个以多大的精度为目标,才能使量子化的Llama 270b适合24 GB的VRAM?所以在给定硬件的情况下,可以用以下方法来确定模型的精度。

假设我们有24gb的VRAM。因为有一些推理的内存开销。所以我们以22 GB的量化模型大小为目标。

首先,我们需要将22gb转换成bits:

 22 GB = 2.2e+10 bytes = 1.76e+11 bits (since 1 byte = 8 bits)

这样模型的最大极限为1.76e+11bits(b)。Llama 270b有7e+10个参数§要量化。我们的目标精度是bpw。

     bpw = b/pbpw = 176 000 000 000 / 70 000 000 000 = 2.51

因此每个参数的平均精度为2.51bits 。

把它四舍五入到2.5 bits ,然后运行:

 python convert.py \-i ./Llama-2-70b-hf/ \-o ./Llama-2-70b-hf/temp/ \-c test.parquet \-cf ./Llama-2-70b-hf/2.5bpw/ \-b 2.5

这个量化过程在24 GB GPU的消费级硬件上是可以运行的,但是这可能需要长达15个小时。

使用ExLlamaV2在GPU上运行Llama2 70b

ExLlamaV2还提供了运行混合精度量化模型的脚本。

chat.py脚本将把模型作为聊天机器人运行,并且可以提供交互。还可以使用test_inference.py简单地测试模型。

我们就是用这个脚本检查模型速度和内存消耗:

 python test_inference.py -m ./Llama-2-70b-2.5bpw/ -p "Once upon a time,"

注意:" -p "是测试提示符。

需要几分钟(A100 GPU为8分钟)。为什么这么慢呢?

ExLlamaV2使用“torch.compile”。根据PyTorch文档:

**torch.compile通过将PyTorch代码jit编译到优化的内核中,从而使PyTorch代码运行得更快,同时需要最少的代码更改。此编译很耗时,但会被缓存。**所以再次运行test_inference.py只需30秒。

我们得到的模型是22.15 GB。在推理实验中,它恰好占用了24gb,也就是正好可以使用24G的GPU

为什么需要留出一些内存

内存中的模型实际占用22.15 GB,但推理本身也消耗额外的内存。例如,提示进行编码并将其存储在内存中。如果设置较大的最大序列长度或进行批处理解码,推理也会消耗更多内存。

所以如果使用24gb的GPU,可能会在推理过程中得到CUDA内存不足的错误,这是因为你的GPU会有一些来自操作系统的显存占用,比如(比如Ubuntu桌面消耗大约1.5 GB的VRAM,而Xfce则不到300M)。所以为了保证运行稳定,可以设置更低的bpw。例如2.4甚至2.3,这样给GPU更多的VRAM,可以保证运行稳定。

总结

ExLlamaV2模型非常快。他生成速度在15-30个令牌/秒。作为对比使用GPTQ(一个小10倍的模型)对量化为4位的Llama 27b进行测试时,大约28个令牌/秒。

所以在影响较小的地方,我们降低模型的精度,就可以在单个消费级GPU上运行大型模型(如Llama2 70b)。

但是量化就意味着精度的损失,虽然更大的模型更容易量化而性能损失不大,但总是存在一个量化模型会比未量化但参数更少的模型差的临界点,比如Llama 2 70b 2-bit可能明显差于Llama 2 13b 4 -bit,并且模型还更大。所以为了找到量化和精度的平衡点需要我们在使用时进行更详细的测试。

exllamav2项目地址,里面有更详细的说明样例:

https://avoid.overfit.cn/post/0797ea02367b4d3ea331e595f5790004

本文作者: Benjamin Marie

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

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

相关文章

postgresql-管理数据表

postgresql-管理数据表 创建表数据类型字段约束表级约束模式搜索路径 修改表添加字段删除字段添加约束删除约束修改字段默认值修改字段数据类型重命名字段重命名表 删除表 创建表 在 PostgreSQL 中,使用 CREATE TABLE 语句创建一个新表: CREATE TABLE …

量化交易全流程(四)

本节目录 数据准备(数据源与数据库) CTA策略 数据源: 在进行量化分析的时候,最基础的工作是数据准备,即收集数据、清理数据、建立数据库。下面先讨论收集数据的来源,数据来源可分为两大类:免…

nodejs开发环境搭建

Nodejs是一个开源的、跨平台JavaScript运行时环境,其使用V8引擎对JavaScript脚本执行解释,在前后端分离的应用架构设计中,其既能支持web页面服务应用的开发、也能支持后端接口服务应用的开发,类似于Java语言的J2EE运行时环境&…

Django基础入门操作 (Django-01)

一 背景介绍 Django是一个开源的 Web应用框架,由Python写成。采用了MTV的框架模式,它最初是被用来做CMS(内容管理系统)软件。 官方中文文档:Django 文档 | Django 文档 | Django 应用:做内容管理系统(新…

Swing程序设计(4)JLabel标签和导入图片

文章目录 前言一、JLabel标签 1.介绍2.实例展示二、JLabel中绘图和导入图片 1.自定义绘图2.导入图片总结 前言 本文介绍了Swing程序中JLabel标签的使用,以及在标签中导入图片和自定义图标的方法。 一、JLabel标签的使用 1.介绍 JLabel标签:在Swing程序中…

【生物信息学】计算图网络中节点的中心性指标:聚集系数、介数中心性、度中心性

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成邻接矩阵simulate_G: 2. 计算节点的聚集系数 CC(G): 3.计算节点的介数中心性 BC(G) 4. 计算节点的度中心性 DC(G) 5. 综合centrality(G) 6. 代…

基于web的画作展示系统/作品展示平台

摘 要 网络的广泛应用给生活带来了十分的便利。所以把画作展示系统与现在网络相结合,利用JSP技术建设画作展示系统,实现画作展示系统的信息化。则对于进一步提高画作展示系统的发展,丰富画作展示系统经验能起到不少的促进作用。 画作展示系统…

NLP中token总结

Token 可以被理解为文本中的最小单位。在英文中,一个 token 可以是一个单词,也可以是一个标点符号。在中文中,通常以字或词作为 token。ChatGPT 将输入文本拆分成一个个 token,使模型能够对其进行处理和理解 在自然语言处理&#…

【QT】自定义组件ui类添加到主ui界面方法

1.添加自定义组件到项目中 add new选择如下 写好类方法,确定即可 2.将新创建的ui类加入到主ui界面 选中新创建ui类的父类空块,右键选择提升为 选择并添加新创建的类

asp.net core mvc 文件上传,下载,预览

//文件上传用到了IformFile接口 1.1文件上传视图 <form action"/stu/upload" method"post" enctype"multipart/form-data"><input type"file" name"img" /><input type"submit" value"上传&…

【通意千问】大模型GitHub开源工程学习笔记(2)--使用Qwen进行推理的示例代码解析,及transformers的库使用

使用Transformers来使用模型 如希望使用Qwen-chat进行推理,所需要写的只是如下所示的数行代码。请确保你使用的是最新代码,并指定正确的模型名称和路径,如Qwen/Qwen-7B-Chat和Qwen/Qwen-14B-Chat 这里给出了一段代码 from transformers import AutoModelForCausalLM, Aut…

多目标平衡优化器黏菌算法(MOEOSMA)求解CEC2020多模式多目标优化

多目标平衡优化器黏菌算法&#xff08;MOEOSMA&#xff09;比现有的多目标黏菌算法具有更好的优化性能。在MOEOSMA中&#xff0c;动态系数用于调整勘探和开采趋势。采用精英存档机制来促进算法的收敛性。使用拥挤距离法来保持Pareto前沿的分布。采用平衡池策略模拟黏菌的协同觅…

【深度学习实验】卷积神经网络(六):自定义卷积神经网络模型(VGG)实现图片多分类任务

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集&#xff08;CIFAR10Dataset&#xff09; a. read_csv_labels&#xff08;&#xff09; b. CIFAR10Dataset 2. 构建模型&#xff08;FeedForward&…

前端页面初步开发

<template><div><el-card class"box-card" style"height: 620px"><el-input v-model"query.name" style"width:200px" placeholder"请输入用户姓名"></el-input>&nbsp&nbsp&nbsp…

贪心找性质+dp表示+矩阵表示+线段树维护:CF573D

比较套路的题目 首先肯定贪心一波&#xff0c;两个都排序后尽量相连。我一开始猜最多跨1&#xff0c;但其实最多跨2&#xff0c;考虑3个人的情况&#xff1a; 我们发现第3个人没了&#xff0c;所以可以出现跨2的情况 然后直接上dp&#xff0c;由 i − 1 , i − 2 , i − 3 i…

input输入表头保存excel文件

input输入表头 input输入表头 &#xff08;input内除了/&#xff0c;空格 回车 标点符号等 全部作为单元格分隔符&#xff09;保存/storage/emulated/0/代码文件/ 没有就创建文件名命名方法&#xff1a;编号. 库 时间戳嗨&#xff01;听说你有个需求&#xff0c;想根据用户输入…

数码产品数码配件无线键盘等出口欧盟CE-RED认证测试办理

数码产品数码配件无线键盘CE-RED认证测试办理 无线产品CE-RED认证进入东欧市场规定&#xff1a; 在通信终端设备和无线产品在这些/地区合法销售之前&#xff0c;必须按照 RED 指令进行测试&#xff0c;并且还必须提供 CE 标志。无线远程控制产品必须符合 RED 指令的 REDEU 要…

2021-06-18 51蛋骗鸡实现流水灯累积点亮全亮后闪烁从头开始循环

缘由怎么在单片机上实现这个功能呢_有问必答-CSDN问答 #include "REG52.h" sbit K1 P1^5; sbit K2 P1^6; sbit K3 P1^7; sbit K4 P1^4; //sbit LED1P1^0; //sbit LED2P1^1; //sbit LED3P1^2; //sbit LED4P1^3; bit k1; unsigned char code SmZiFu[]{63,6,91,79,…

数字乡村包括哪些方面?数字乡村应用介绍

数字乡村是指利用物联网、数字化和智能化技术&#xff0c;借助现代数字智能产品、高效信息服务和物联网基础设施&#xff0c;以提高农村居民生活质量&#xff0c;助力拓展经济发展前景。 创建数字村庄有助于缩小城乡社区之间的差距&#xff0c;保障每个人都能平等地享受科技发展…

Observer

Observer 动机 在软件构建过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系”——一个对象&#xff08;目标对象&#xff09;的状态发生改变&#xff0c;所有的依赖对象&#xff08;观察者对象&#xff09;都将得到通知。如果这样的依赖关系过于紧密&#xff0c;…