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

news2024/12/23 13:03:15

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/exllamav2
 cd exllamav2
 pip 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/p
     bpw = 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.coloradmin.cn/o/1054643.html

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

相关文章

[管理与领导-108]:IT人看清职场中的隐性规则 - 5 - 你会在不经意间被归属在不同的分类中,一旦分类定型,你就会被打上了某种标签(职场分类方法大全)

目录 前言: 一、关于分类 1.1 什么是分类 1.2 分类是人们理解复杂问题的一种常见方式 1.3 分类的优点与缺点 1.4 职场中的分类方法 二、职场对人的分类方法1:组织架构 2.1 职位和职级分类 2.2 按照部门、岗位进行分类 三、职场对人的分类方法2…

java Spring Boot按日期 限制大小分文件记录日志

上文 java Spring Boot 将日志写入文件中记录 中 我们实现另一个将控制台日志写入到 项目本地文件的效果 但是 这里有个问题 比如 我项目是个大体量的企业项目 每天会有一百万用户访问 那我每天的日志都记载同一个文件上 那不跟没记没什么区别吗? 东西怎么找&#x…

C++11之可变参数模板

可变参数模板 可变参数模板概念可变参数模板定义参数包展开方式递归展开参数包逗号表达式展开参数包 STL容器中的emplace相关接口函数 可变参数模板概念 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C98/03,类模版和函…

Java进阶02 Array、内存分析、this、面向对象、继承、override、super、实例化、多态、向下转型、Object

文章目录 一、数组(Array)二、数组的内存分析三、Array工具类四、面向对象的一些小知识五、进阶知识补充1. this关键字2.继承3.方法重写4.super关键字的使用5.子类对象实例化6.多态性的体现7.向下转型8.Object类 一、数组(Array) 数组:多个相同类型数据按照一定顺序…

基于 SpringBoot 2.7.x 使用最新的 Elasticsearch Java API Client 之 ElasticsearchClient

1. 从 RestHighLevelClient 到 ElasticsearchClient 从 Java Rest Client 7.15.0 版本开始,Elasticsearch 官方决定将 RestHighLevelClient 标记为废弃的,并推荐使用新的 Java API Client,即 ElasticsearchClient. 为什么要将 RestHighLevelC…

大喜国庆,聊聊我正式进入职场的这三个月...

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

Thymeleaf 内联语法使用教程

1 表达式内联 Thrmeleaf标准方言允许使用标签属性(th:)来实现很多的功能,但在有些场景之下,需要将表达式直接写入我们HTML 代码中和CSS代码中及JavaScript代码中【代码和html文件在一起,分能不开,待验证】,称为内联…

[Unity][VR]Oculus透视开发图文教程1-Passthrough应用XR项目设置

Oculus现在已向开发者公布了如何使用自己的设备Camera,本系列课程就来手把手地告诉你如何在Unity中使用这个特性。 第一步,既然用的是Quest的特性,那就需要先引入Quest的Unity开发SDK。并且完成基本的VR开发项目设置。 新建Unity项目后,在编辑器界面先点击Window,打开资…

【实验记录】一些小疑问

1.为什么要选择基于“外观”这一特性来作为回环检测的方案? 朴素思路复杂度高,不利于实时性;基于“里程计”的方案需要知道相机处于何位置下才能发生检测,这与我们需要知道的准确位置相矛盾 基于“外观”的方案与前端和后端均无关…

计算机图形学、贝塞尔曲线及绘制方法、反走样问题的解决(附完整代码)

贝塞尔曲线 1. 本次作业实现的函数及简单描述(详细代码见后)2. 与本次作业有关的基础知识整理3. 代码描述(详细)4. 完整代码5. 参考文献 (本篇为作者学习计算机图形学时根据作业所撰写的笔记, 如有同课程请…

进程的状态与转换以及组织方式

1.进程的状态 三种基本状态:运行态,就绪态,阻塞态。 1.运行状态 如果一个进程此时在CPU上运行,那么这个进程处于“运行态”。 CPU会执行该进程对应的程序(执行指令序列) 2.就绪状态 当进程创建完成后,…

【论文阅读】(CVPR2023)用于半监督医学图像分割的双向复制粘贴

目录 前言方法BCPMean-teacher and Traning StrategyPre-Training via Copy-PasteBidirectional Copy-Paste ImagesBidirectional Copy-Paste Supervisory Signals Loss FunctionTesting Phase 结论 先看这个图,感觉比较清晰。它整个的思路就是把有标签的图片和无标…

动态规划算法(1)--矩阵连乘

目录 一、动态数组 1、创建动态数组 2、添加元素 3、删除修改元素 4、访问元素 5、返回数组长度 6、for each遍历数组 二、输入多个数字 1、正则表达式 2、has.next()方法 三、矩阵连乘 1、什么是矩阵连乘? 2、动态规划思路 3、手推m和s矩阵 4、完…

AI伦理与机器道德:人工智能的道德挑战

文章目录 什么是AI伦理和机器道德?1. 隐私保护2. 歧视和不平等3. 透明度和解释性4. 安全性5. 社会影响 AI伦理和机器道德的重要性1. 保护个人权利2. 避免不平等和歧视3. 保持透明和责任4. 促进创新 AI伦理挑战和解决方案1. 隐私保护2. 歧视和不平等3. 透明度和解释性…

P1541 [NOIP2010 提高组] 乌龟棋(4维背包问题)

[NOIP2010 提高组] 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 题目描述 乌龟棋的棋盘是一行 N N N 个格子,每个格子上一个分数(非负整数)。棋盘第 1 1 1 格是唯一的起点,第 N N N 格是…

Nginx简介与Docker Compose部署指南

Nginx是一款高性能的开源Web服务器和反向代理服务器,以其卓越的性能、可伸缩性和灵活性而闻名。它在全球范围内广泛用于托管Web应用程序、负载均衡、反向代理和更多场景中。在本文中,我们将首先介绍Nginx的基本概念,然后演示如何使用Docker C…

Apollo自动驾驶系统概述(文末参与活动赠送百度周边)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

数据结构之美:如何优化搜索和排序算法

文章目录 搜索算法的优化1. 二分搜索2. 哈希表 排序算法的优化1. 快速排序2. 归并排序 总结 🎉欢迎来到数据结构学习专栏~数据结构之美:如何优化搜索和排序算法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客&#x…

阿里云ECS服务器无法发送邮件问题解决方案

这篇文章分享一下自己把项目部署在阿里云ECS上之后,登录邮件提醒时的邮件发送失败问题,无法连接发送邮箱的服务器。 博主使用的springboot提供的发送邮件服务,如下所示,为了实现异步的效果,新开了一个线程来发送邮件。…

【Vim 插件管理器】Vim-plug和Vim-vbundle的区别

- vundle是一款老款的插件管理工具 - vim-plug相对较新,特点是支持异步加载,相比vundle而言 Vim-plug 是一个自由、开源、速度非常快的、极简的 vim 插件管理器。它可以并行地安装或更新插件。你还可以回滚更新。它创建浅层克隆shallow clone最小化磁盘…