源2.0-M32大模型适配AutoGPTQ工具及量化推理教程

news2024/9/30 17:17:40

AutoGTPQ简介

AutoGPTQ‌是一个开源工具包,专注于简化大规模语言模型(LLMs)的量化过程。它基于高效的GPTQ算法开发,主要使用Python编程语言,并依托PyTorch框架来实现量化功能。AutoGPTQ的设计目标是为开发者和研究人员提供一个易于使用的API接口,即使对量化技术不太了解的用户也能轻松进行模型量化。通过采用仅量化权重的方式,该工具包在尽量减少性能损耗的情况下,缩减了模型体积,提升了部署的效率。

AutoGPTQ的主要功能包括:

  • 模型量化:支持将大模型如BERT、OPT量化为4位版本,显著降低存储需求并加快推理速度。
  • 简洁API:提供易用的API,简化量化操作。
  • 性能优化:通过优化策略保持原模型的推理性能,适用于资源受限的场景。
  • 跨平台支持:兼容Linux、Windows及NVIDIA、AMD和Intel Gaudi等硬件平台。
  • Triton集成(可选):在Linux系统中,通过Triton进一步提升推理性能。

最近的更新加入了Marlin内核支持,并集成Transformer、Optimum和PeFT库,使量化模型的运行和训练更加高效便捷。

源2.0-M32大模型适配AutoGPTQ量化工具教程

  • AutoGPTQ量化过程

以下是官方提供的量化案例,详细的量化过程如下:

  1. 首先,通过自定义的类AutoGPTQForCausalLMfrom_pretrained方法来初始化模型。在这一过程中,需要传入两个核心参数:第一个参数是模型的存储路径,用于加载预训练模型;第二个参数是与量化相关的配置,该配置由 BaseQuantizeConfig 类来管理和维护。BaseQuantizeConfig 允许用户根据需求自定义量化的精度(例如4位或8位)以及其他关键的量化参数。这一步骤确保模型加载时为后续的量化步骤做好准备
  2. 接着,将预处理后的量化数据(例如量化样本 examples)传递给 AutoGPTQForCausalLMquantize 方法,用于实际执行模型量化。quantize 方法会根据传入的示例数据和量化配置,对模型的权重进行调整,将模型的参数从高精度(例如32位浮点数)转换为低比特位表示(如4位或8位)。这一过程中的量化策略基于 GPTQ 算法,旨在尽可能减少模型性能的损失,同时显著降低模型的计算和存储成本。量化后的模型在推理时占用更少的资源,但仍能保持接近原模型的准确性。
  3. 完成量化后,量化模型将通过 AutoGPTQForCausalLM 提供的保存机制进行保存。量化后的模型通常会存储为较小的文件,便于后续的加载和部署。保存后的模型可以直接用于推理,且无需再次进行量化处理,大大提升了使用的便捷性。

注:AutoGPTQForCausalLM是工具提供的专用加载类,通过GPTQ_CAUSAL_LM_MODEL_MAP (在auto_gptq/modeling/auto.py中定义的字典)来维护支持量化的模型类型;AutoGPTQForCausalLM类中的核心方法都继承自_base.py中的BaseGPTQForCausalLM类。

  • 源2.0-M32大模型适配AutoGPTQ过程

由于源2.0-M32大模型不在AutoGPTQ的模型库中,我们需要修改模型的加载过程;同时AutoGPTQ量化每一个模型时都需要重新定义一个GPTQForCausalLM类来维护需要被量化的网络层。具体的适配过程如下:

1)修改模型的初始化过程过程

源2.0-M32大模型并不在AutoGPTQ的预定义模型库(GPTQ_CAUSAL_LM_MODEL_MAP)中,因此我们无法直接通过 AutoGPTQForCausalLM.from_pretrained 方法进行加载。为此,我们需要自定义加载过程:

*在auto_gptq/modeling/_base.py 文件中,将源2.0-M32模型的transformers加载逻辑替换 AutoGPTQForCausalLM 中的 AutoModelForCausalLM 方法。相当于通过手动初始化源2.0-M32模型的方式来绕过AutoGPTQ原本的模型初始化逻辑。

2)自定义YuanGPTQForCausalLM

由于模型量化需要逐层执行,且针对不同模型结构需要自定义相应的网络层,所以我们需要定义一个新的 GPTQForCausalLM 类。具体步骤如下:

*在auto_gptq/modeling/ 路径下新建一个yuan.py文件,并在其中定义一个 YuanForCausalLM 类。该类将继承 BaseGPTQForCausalLM,并负责维护需要量化的网络层。

*在YuanGPTQForCausalLM 类中,列举出所有需要被量化的inside_layer_modules

*将YuanGPTQForCausalLM类添加到auto_gptq/modeling/auto.py中的GPTQ_CAUSAL_LM_MODEL_MAP中

3)数据准备和量化

*根据源2.0-M32模型上传指定的数据集并完成分词预处理

*参照上述量化过程编写量化脚本,逐步调试AutoGPTQ量化过程

注:数据集参考链接:https://huggingface.co/datasets/hakurei/open-instruct-v1

AutoGPTQ量化源2.0-M32大模型以及量化模型的推理教程

依据上述思路适配完成的AutoGTPQ代码已经上传至源2.0-M32项目,以下内容将介绍具体的hf模型量化教程和量化后的int4/int8模型推理教程,包括环境配置、量化步骤、推理和相关参数说明等等。

  • AutoGPTQ环境配置和安装
  • AutoGPTQ环境配置要求:CUDA版本高于11.8
  • 容器:使用vllm项目提供的镜像创建容器
# 进入容器
docker exec -it vllm_yuan bash

# 进入你的工作目录
cd /mnt

# 拉取我们的项目
git clone https://github.com/IEIT-Yuan/Yuan2.0-M32.git

# 进入autogptq项目
cd  Yuan2.0-M32/3rd_party/AutoGPTQ

# 安装autogptq
pip install auto-gptq --no-build-isolation
  • 量化源2.0-M32大模型

量化源2.0-M32模型主要分为三步:

1.下载Yuan2-M32 hugging face模型

首先,需要从 Hugging Face 下载 Yuan2-M32 模型并移动到指定的文件路径:

  • 模型下载地址:https://huggingface.co/IEIT-Yuan/Yuan2-M32-hf
  • 下载完成后,将模型文件放置到目标目录,如/mnt/beegfs2/Yuan2-M32-HF
  • 具体可以参考vllm中模型的下载方式

2. 数据集下载

接下来,需要准备适用于量化的训练或推理数据集:

  • 数据集下载:点击这里下载需要的数据集。
  • 下载完成后,将数据集移动到指定的文件路径,例如 /mnt/beegfs2/。

 3. 按照以下步骤调整量化参数进行量化操作

# 编辑Yuan2-M32-int4.py
cd /mnt/beegfs2/Yuan2.0-M32/3rd_party/AutoGPTQ
vim Yuan2-M32-int4.py

'''
pretrained_model_dir = "/mnt/beegfs2/Yuan2-M32-HF"
quantized_model_dir = "/mnt/beegfs2/Yuan2-M32-GPTQ-int4"

tokenizer = LlamaTokenizer.from_pretrained("/mnt/beegfs2/Yuan2-M32-HF", add_eos_token=False, add_bos_token=False, eos_token='<eod>', use_fast=True)
tokenizer.add_tokens(['<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>','<commit_before>','<commit_msg>','<commit_after>','<jupyter_start>','<jupyter_text>','<jupyter_code>','<jupyter_output>','<empty_output>'], special_tokens=True)

examples = []
with open("/mnt/beegfs2/instruct_data.json", 'r', encoding='utf-8') as file: # 数据集路径
    data = json.load(file)

for i, item in enumerate(data):
    if i >= 2000:
        break
    instruction = item.get('instruction', '')
    output = item.get('output', '')
    combined_text = instruction + " " + output
    examples.append(tokenizer(combined_text))

max_memory = {0: "80GIB", 1: "80GIB", 2: "80GIB", 3: "80GIB", 4: "80GIB", 5: "80GIB", 6: "80GIB", 7: "80GIB"}
quantize_config = BaseQuantizeConfig(
    bits=4,  # quantize model to 4-bit
    group_size=128,  # it is recommended to set the value to 128
    desc_act=False,  # set to False can significantly speed up inference but the perplexity may slightly bad
)
'''
# 1.修改pretrained_model_dir,指定量化后的quantized_model_dir
# 2.修改数据集路径
# 3.max_memory可以指定要使用的GPUs
# 4.修改量化参数,若要int4精度bits=4,若要int8精度bits=8,其他参数可以参考默认值

# 运行此脚本
python Yuan2-M32-int4.py

# 模型量化和packing过程耗时约8h,可以指定不同的GPU同时分别量化int4和int8
  • 源2.0-M32-int4/int8模型推理

量化完成后,目标路径文件夹中会生成.safetensors后缀的ckpt文件以及config.json、quantize_config.json文件,推理时需要先从Yuan2-M32-HF路径中拷贝tokenizer相关的文件,再通过用以下步骤完成推理。

# 进入Yuan2-M32-HF路径
cd /mnt/beegfs2/Yuan2-M32-HF

# 拷贝tokenizer相关文件至Yuan2-M32-GPTQ-int4
cp special_tokens_map.json tokenizer* /mnt/beegfs2/Yuan2-M32-GPTQ-int4

# 编辑inference.py
cd /mnt/beegfs2/Yuan2.0-M32/3rd_party/AutoGPTQ
vim inference.py

'''
quantized_model_dir = "/mnt/beegfs2/Yuan2-M32-GPTQ-int4"

tokenizer = LlamaTokenizer.from_pretrained('/mnt/beegfs2/Yuan2-M32-GPTQ-int4', add_eos_token=False, add_bos_token=False, eos_token='<eod>')
tokenizer.add_tokens(['<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>','<commit_before>','<commit_msg>','<commit_after>','<jupyter_start>','<jupyter_text>','<jupyter_code>','<jupyter_output>','<empty_output>'], special_tokens=True)

model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0", trust_remote_code=True)
'''
# 修改quantized_model_dir和tokenizer路径

# 运行inference.py
python inference.py

参考链接:

1.AutoGPTQ的Github项目地址:

https://github.com/AutoGPTQ/AutoGPTQ

2.源2.0-M32适配的AutoGPTQ项目地址:

https://github.com/IEIT-Yuan/Yuan2.0-M32/tree/main/3rd_party/AutoGPTQ

3.AutoGPTQ量化源2.0-M32模型以及量化模型的推理教程参考链接:

https://github.com/IEIT-Yuan/Yuan2.0-M32/blob/main/3rd_party/AutoGPTQ/README_GPTQ.md

4.vllm项目相关链接:

https://github.com/IEIT-Yuan/Yuan2.0-M32/blob/main/vllm/README_Yuan_vllm.md

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

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

相关文章

【Golang】关于Go语言数学计算、随机数生成模块--math

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

多功能声学气膜馆:承载梦想与希望的舞台—轻空间

在9月29日上午&#xff0c;苏州大学应用技术学院的2024级新生开学典礼暨开学第一课在轻空间建造的多功能声学气膜馆内盛大举行。这一盛典不仅见证了2849名新生的入学&#xff0c;也展示了气膜馆的独特魅力与优越功能。 卓越的声学表现 声学气膜馆采用高性能材料&#xff0c;确保…

Linux-基础实操篇-组管理和权限管理(上)

Linux 组基本介绍 在 linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外。在 linux 中每个文件 有所有者、所在组、其它组的概念。 用户和组的基本概念&#xff1a; 用户名&#xff1a;用来识别用户的名称&#xff0c;可以是字母、数字组成的字符串&#xff0…

解决DHCP服务异常导致设备无法获取IP地址的方法

DHCP在网络环境中会自动为网络中的设备分配IP地址和其他关键网络参数&#xff0c;可以简化网络配置过程。但是&#xff0c;如果DHCP服务出现异常时&#xff0c;设备可能无法正常获取IP地址&#xff0c;会影响到网络通信。 本文讲述一些办法可以有效解决DHCP服务异常导致设备无法…

YAML管理接口框架配置的最佳实践!!

YAML 文件在接口框架中作为配置管理的语言&#xff0c;以其简洁、直观的语法&#xff0c;迅速成为开发者的宠儿。然而&#xff0c;如何高效地管理和组织接口框架的配置&#xff0c;往往是一个容易被忽视的难题。你是否曾因为冗长的配置文件而感到头疼&#xff1f;今天&#xff…

干冰清洗机的工作原理

干冰清洗机的工作原理主要基于干冰的物理特性&#xff0c;特别是其升华过程。以下是干冰清洗机工作原理的详细解释&#xff1a; 一、干冰的制备 制冰系统&#xff1a;干冰清洗机内部配备有制冰系统&#xff0c;该系统将液态二氧化碳&#xff08;CO₂&#xff09;快速冷却并压…

HTTP协议讲解,请求报文与响应报文都是什么?网络控制台查看HTTP请求

目录 一. HTTP解析 二. 请求报文 2.1 请求行 2.1.1 请求类型 2.1.2 请求URL路径 2.1.3 发送的HTTP请求的版本 2.2 请求头 2.2.1 Host&#xff1a;主要用来实现虚拟主机技术 2.2.2 Cookie&#xff1a;一种让浏览器帮忙携带信息的手段 2.2.3 Content—type&#xff1a;…

揭秘分布式定时任务在人工智能RPA机器人中的应用|实在RPA研究

一、引言 在人工智能技术不断突破的今天&#xff0c;RPA智能机器人已经渗透到各行各业&#xff0c;成为企 业提升效率、降低成本的重要工具。而在机器人高效运作的背后&#xff0c;分布式定时任务发挥着 不可替代的作用。本文将深入探讨分布式定时任务在人工智能机器人中的应用…

leetcode-链表篇3

leetcode-61 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&#x…

opencv - Fourier Transform 傅里叶变换

目标 在本节中&#xff0c;我们将学习 使用 OpenCV 查找图像的傅里叶变换利用 Numpy 中可用的 FFT 函数傅里叶变换的一些应用我们将看到以下函数&#xff1a;cv.dft()、cv.idft() 等 理论 傅里叶变换用于分析各种滤波器的频率特性。对于图像&#xff0c;2D 离散傅里叶变换 …

优选驾考系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;驾校管理&#xff0c;驾考文章管理&#xff0c;驾照类型管理&#xff0c;报名入口管理&#xff0c;学员报名管理&#xff0c;练车预约管理&#xff0c;考试场地管理 微信端账号功能包括&#xff1a;系…

【羊毛资源】华为云开发者云主机免费申请使用指南

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

【GAN 图像生成】

理论知识学习&#xff1a; PART 1&#xff1a; 生成对抗网络GAN 深度学习模型&#xff0c;用于生成数据 对抗式训练&#xff0c;生成器v判别器 DCGAN>WGAN>StyleGAN技术不断进化 GAN在艺术创作。数据增强领域应用越来越广泛 应用&#xff1a; GAN在图像合成&#x…

生信初学者教程(十二):数据汇总

文章目录 介绍加载R包导入数据汇总表格输出结果总结介绍 在本教程中,汇总了三个肝细胞癌(HCC)的转录组数据集,分别是LIRI-JP,LIHC-US/TCGA-LIHC和GSE14520,以及一个HCC的单细胞数据集GSE149614的临床表型信息。这些数据集为科研人员提供了丰富的基因表达数据和相关的临床…

SqlAlchemy使用教程(七) 异步访问数据库

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用SqlAlchemy使用教程(五) ORM API 编程入门SqlAlchemy使用教程(六) – O…

Find My储物盒|苹果Find My技术与储物盒结合,智能防丢,全球定位

储物盒是用来存储&#xff0c;收藏东西的器具。储物盒可以帮助用户合理利用有限的空间&#xff0c;通过分类归置物品&#xff0c;避免浪费和混乱。储物盒能够有效地保护存放的物品&#xff0c;防止它们受到灰尘、污渍、损坏和潮湿的影响。储物盒还可以增加空间利用率、方便搬家…

Windows环境下使用Docker配置MySQL数据库

用Docker配置数据库&#xff0c;无论是做开发&#xff0c;还是做生产部署&#xff0c;都非常的方便 它不需要单独安装数据库&#xff0c;也不用担心出现各种环境的配置问题。 本文将分享用Docker配置数据库的步骤&#xff0c;这里用MySQL举例。 其他的数据库如MSSQL&#xf…

全球IP归属地查询-IP地址查询-IP城市查询-IP地址归属地-IP地址解析-IP位置查询-IP地址查询API接口

IP地址城市版查询接口 API是指能够根据IP地址查询其所在城市等地理位置信息的API接口。这类接口在网络安全、数据分析、广告投放等多个领域有广泛应用。以下是一些可用的IP地址城市版查询接口API及其简要介绍 1. 快证 IP归属地查询API 特点&#xff1a;支持IPv4 提供高精版、…

Scalefit:有效避免工作场所运动损伤的解决方案

在当今快节奏的工作环境中&#xff0c;运动损伤已成为一个不容忽视的问题。长时间的久坐、重复性动作以及缺乏适当的运动&#xff0c;都可能导致肌肉骨骼损伤、关节疼痛等问题。作为一款专注于运动健康管理的平台&#xff0c;Scalefit Industrial Athlete通过科学的方法和个性化…

天坑!Spark+Hive+Paimon+Dolphinscheduler

背景: 数据中台项目使用Spark+Hive+Paimon做湖仓底层,调度任务使用的是基于Dolphinscheduler进行二开。在做离线脚本任务开发时,在Paimon库下执行非查询类SQL报错。 INSERT报错 DELETE报错 现状: 原始逻辑为数据中台中选择的Paimon数据源,实际上在Dolphinscheduler中是…