基于Python的自然语言处理系列(46):4-bit LLM 量化与 GPTQ

        

        在本篇文章中,我们将深入探讨如何使用 GPTQ (Generative Pre-trained Quantization) 进行4-bit大语言模型(LLM)的量化。在大规模语言模型训练和推理的背景下,模型的量化不仅能够大大降低计算成本,还能够提高推理速度,因此对构建高效的NLP模型有着极其重要的意义。

1. Optimal Brain Quantization

        在量化的过程中,我们首先面临的是层级压缩问题,可以通过以下优化目标进行描述:

2. 剪枝技术 (Pruning Technique)

        在剪枝过程中,我们希望通过以下公式来找到合适的权重剪枝:

        这种剪枝技术能够有效地减少模型的计算量,同时保持模型的性能。

3. GPTQ 算法步骤

        GPTQ 算法的核心思想是逐层应用量化操作,确保尽量减少量化误差。具体包括以下几步:

  1. Step 1: Arbitrary Order Insight

    在每个步骤中,选择能带来最少额外误差的列进行处理。
  2. Step 2: Lazy Batch-Updates

    GPTQ 能够以批处理的方式应用算法,提高计算效率。
  3. Step 3: Cholesky Reformulation

    利用 Cholesky 分解方法处理数值误差。

4. 实现步骤

        接下来,我们通过代码实现 GPTQ 的4-bit量化。首先安装相关的库并定义模型、量化配置等。然后加载数据集并进行量化训练,最后保存和测试量化后的模型。

# 安装依赖库
# !BUILD_CUDA_EXT=0 pip install -q auto-gptq transformersimport random
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from datasets import load_dataset
import torch
from transformers import AutoTokenizer# 定义模型与输出路径
model_id = "gpt2"
out_dir = model_id + "-GPTQ"# 加载量化配置、模型和分词器
quantize_config = BaseQuantizeConfig(bits=4,group_size=128,damp_percent=0.01,desc_act=False,
)
model = AutoGPTQForCausalLM.from_pretrained(model_id, quantize_config)
tokenizer = AutoTokenizer.from_pretrained(model_id)

5. 数据处理

        我们将加载 AllenAI C4 数据集,并对数据进行分词和格式化处理,生成用于量化的样本数据。

# 加载数据集并进行分词
n_samples = 1024
data = load_dataset("allenai/c4", data_files="en/c4-train.00001-of-01024.json.gz", split=f"train[:{n_samples*5}]")
tokenized_data = tokenizer("\n\n".join(data['text']), return_tensors='pt')# 格式化分词后的示例
examples_ids = []
for _ in range(n_samples):i = random.randint(0, tokenized_data.input_ids.shape[1] - tokenizer.model_max_length - 1)j = i + tokenizer.model_max_lengthinput_ids = tokenized_data.input_ids[:, i:j]attention_mask = torch.ones_like(input_ids)examples_ids.append({'input_ids': input_ids, 'attention_mask': attention_mask})

6. 模型量化

        在这个阶段,我们将使用 GPTQ 对模型进行量化,并保存量化后的模型和分词器。

%%time# 使用 GPTQ 进行量化
model.quantize(examples_ids,batch_size=1,use_triton=True,
)# 保存量化后的模型和分词器
model.save_quantized(out_dir, use_safetensors=True)
tokenizer.save_pretrained(out_dir)

7. 测试生成文本

        最后,我们加载量化后的模型并通过生成器进行推理,测试量化后的模型是否能够正确生成文本。

from transformers import pipelinegenerator = pipeline('text-generation', model=model, tokenizer=tokenizer)
result = generator("I have a dream", do_sample=True, max_length=50)[0]['generated_text']
print(result)

结语

        通过本文的学习,我们了解了如何使用 GPTQ(Generative Pre-trained Quantization)进行 4-bit 大语言模型(LLM)的量化。从基本的理论介绍到实际代码的实现,我们完整地介绍了量化过程中的各个关键步骤。GPTQ 提供了一种高效的量化方法,不仅能够显著减少模型的存储空间和计算开销,还能在保持模型精度的同时提升推理速度。这对于在资源受限的硬件设备上部署强大的 NLP 模型具有重要意义。

        通过实际操作 GPTQ 量化,我们体会到这一技术在模型压缩和加速推理方面的潜力。未来,随着硬件资源需求的不断增长,像 GPTQ 这样的量化技术将会越来越重要,它可以让大模型更容易地在低功耗设备上运行,从而为移动端应用和边缘计算提供可能。

        如果你对量化技术和 NLP 模型有更多的兴趣,不妨尝试深入探讨 GPTQ 的更多应用和优化,探索量化模型的更多可能性。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

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

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

相关文章

查找与排序-插入排序

1.直接插入排序的基本思想 假设n个数据元素关键字存储在静态数组a中,则直接插入排序的基本思想可做如下描述: (1)初始有序子序列由一个元素a[0] 组成; (2)从a[1]开始,对于序列中每…

leetcode 75-13 k和数对的最大数目

我的思路 sort函数排序 然后双指针判断 这样时间复杂度nlgn 题解给出了一种空间换时间方法 用哈希表 注意一下写法 现在完全不会这样写 还有就是注意sort函数的代码 怎么写排序也给忘了 sort用的是什么排序方法

自由职业者的一天:作为小游戏开发者的真实工作日记

大家好,我是小蜗牛。 在这个快节奏的数字时代,自由职业者的生活往往充满了挑战与机遇。作为一名微信小游戏开发者,我的日常工作并不像人们想象中的那样充满光鲜亮丽的画面,而是由无数的编码、调试和创意碰撞组成的。今天&#xf…

MySQL 回收表碎片实践教程

前言: 在 MySQL 数据库中,随着数据的增删改操作,表空间可能会出现碎片化,这不仅会占用额外的存储空间,还可能降低表的扫描效率,特别是一些大表,在进行数据清理后会产生大量的碎片。本篇文章我们…

Lesson11---stack

Lesson11—stack cstack的介绍使用以及模拟实现 文章目录 Lesson11---stack前言一、stack成员函数1.stack2.empty3.size4. top5.push6.pop 二、stack相关题目1. 最小栈2.栈的压入、弹出序列 三、模拟实现总结 前言 stack的介绍和使用stack是一种容器适配器,专门用…

B+树(B树的改进)

目录 一、什么是B树? 二、B树的性质 1.B树被广泛作为数据库索引的索引结构 2.m个分支的结点有m个元素 3.每个元素对应子结点最大值 4.多级索引结构 5.叶子结点层包含所有元素 三、B树和B树的区别 四、B树的查找 1.顺序查找 2.随机查找 3.范围查找 一、什…

vue3完整Demo(数据绑定,数据显示,数据修改,数据提交)

需要引入的的依赖:jquery(用于异步请求) 一、数据显示的前端页面 条件查询数据并显示,下拉框使用的model双向绑定 二、js代码(list页面的数据请求) 后端传来的时间数据需要转换可以使用new Intl.DateTim…

Vue3 学习笔记(七)Vue3 语法-计算属性 computed详解

#1024程序员节|征文# 1、计算属性 computed 在 Vue.js 中,计算属性(computed properties)是一种特殊的响应式属性,它们根据依赖的响应式数据自动更新。计算属性非常适合用于当你需要根据现有数据派生出一些状态时。 (1)、基本用法…

LLM | 论文精读 | NeurIPS 2023 | SWIFTSAGE: 结合快思考与慢思考的生成智能体

论文标题:SWIFTSAGE: A Generative Agent with Fast and Slow Thinking for Complex Interactive Tasks 作者:Bill Yuchen Lin, Yicheng Fu, Karina Yang, Faeze Brahman, Shiyu Huang, Chandra Bhagavatula, Prithviraj Ammanabrolu, Yejin Choi, Xian…

【Vue3】第二篇

Vue3学习第二篇 01. 事件处理02. 事件传参03. 事件修饰符04. 数组变化侦测05. 计算属性06. class绑定07. style绑定08. 侦听器09. 表单输入绑定10. 模板引用 01. 事件处理 在vue当中的事件处理和html、css中的不一样,它单独做了处理。 注意:用法中只是用…

【Android】浅析OkHttp(1)

【Android】浅析OkHttp(1) OkHttp 是一个高效、轻量级的 HTTP 客户端库,主要用于 Android 和 Java 应用开发。它不仅支持同步和异步的 HTTP 请求,还支持许多高级功能,如连接池、透明的 GZIP 压缩、响应缓存、WebSocke…

JUC并发编程面试题总结

文章目录 1、创建线程的三种方式2、线程的状态3、线程的上下文切换4、run和start的区别5、sleep和wait区别6、虚假唤醒,精确唤醒7、两阶段终止模式8、多线程下的线程安全问题9、如何解决线程安全问题10、synchornized的原理11、锁升级的机制12、锁消除13、批量重偏向…

Unity编辑器制作多级下拉菜单

Unity编辑器下拉菜单 大家好,我是阿赵。   在Unity引擎里面编写工具插件,有时候会用到一些特殊的菜单形式,比如下拉选项。 通过下拉菜单,给用户选择不同的选项。   如果只是一层的下拉列表,可以用EditorGUILayout.…

Nginx upstream

什么是Nginx upstream? Nginx 模块一般分为三大类:handler、filter和upstream。 利用 handler、filter 这两个模块,可以使 Nginx 轻松完成任何单机工作。 upstream 模块将使 Nginx 跨越单机的限制,完成网络数据的接收、处理和转…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23目录1. Advancements in Visual Language Models for Remote Sensing: Datasets, Capabilities, and Enhancement Techniques摘…

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二 Zig 语言是一种新的系统编程语言,其生态位类同与 C,是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust,尤其是在开发过程中无穷无尽抛错的过程&#x…

高等数学-宋浩版2.0-映射

映射:X,Y为非空集合,存在法则F,对X(原像)中每个元素X,按法则F,在Y中有唯一元素与之对应,F为x到Y(镜像)的映射。f:X->Y X原像,Y像,x定义域,Df,Rf &#x…

python之多任务爬虫——线程、进程、协程的介绍与使用(16)

文章目录 1、什么是多任务?1.1 进程和线程的概念1.2 多线程与多进程的区别1.3 并发和并行2、python中的全局解释器锁3、多线程执行机制4、python中实现多线程(threading模块)4.1 模块介绍4.2 模块的使用5、python实现多进行程(Multiprocessing模块)5.1 导入模块5.2 模块的…

Caffeine本地缓存框架

Caffeine本地缓存框架 hi,我是阿昌,今天记录一下Java最强本地缓存Caffeine 1、缓存介绍 缓存(Cache),在软件无处不在。从底层CPU多级缓存,再到客户页面缓存,和服务器数据缓存,导出都存在着缓存的身影&am…

HBuilder X 中Vue.js基础使用2(三)

一、条件渲染 1、条件判断 v-if : 表达式返回真值时才被渲染 v-else :表达式返回为假时不被渲染 2、 分支条件判断 v-else-if :使用v-if , v-else-if 和 v-else 来表示其他的条件分支 3、显示隐藏 v-show v-show true 把节点显示 …