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

news/2024/12/22 1:19:25/

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:breakinstruction = item.get('instruction', '')output = item.get('output', '')combined_text = instruction + " " + outputexamples.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-bitgroup_size=128,  # it is recommended to set the value to 128desc_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.ppmy.cn/news/1533802.html

相关文章

Spring之生成Bean

Bean的生命周期&#xff1a;实例化->属性填充->初始化->销毁 核心入口方法&#xff1a;finishBeanFactoryInitialization-->preInstantiateSingletons DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。 1.preInstantiateSinglet…

Apache POI 2024/10/2

导入Apache POI的maven坐标 通过POI向Excel文件写入文件内容 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File; import java.…

Vue和axios零基础学习

Vue的配置与项目创建 在这之前要先安装nodejs 安装脚手架 官网 Home | Vue CLI (vuejs.org) 先运行&#xff0c;切换成淘宝镜像源&#xff0c;安装速度更快 npm config set registry http://registry.npm.taobao.org 创建项目 用编译器打开一个空文件&#xff0c;在终端输入…

深度学习:cGAN和pix2pix图像转换

cGAN和pix2pix的基础概念 cGAN cGAN是条件生成对抗网络&#xff08;Conditional Generative Adversarial Networks&#xff09;的简称。 它是一种基于基础GAN&#xff08;Generative Adversarial Networks&#xff09;架构的变体&#xff0c;通过给GAN模型引入额外的信息或条…

mp4(H.265编码)转为本地RTSP流

目标&#xff1a;获得H265码流&#xff0c;要么通过在线网址&#xff0c;要么获得H265文件自己产生码流 在以下任意网址中下载得到H265编码的MP4文件 http://www.elecard.com/en/download/videos.html http://ultravideo.cs.tut.fi/#testsequences http://4k.cablelabs.com/](…

【零基础保姆级教程】MMDetection3训练输出Precision/Recall/F1-Score指标

最近为了跑对比试验&#xff0c;MMDetection这一框架整合的算法较多&#xff0c;故博主训练它并留下记录&#xff0c;若有疑问等欢迎评论、指正。 基本信息&#xff1a;博主在完成训练流程后&#xff0c;保留了整个过程的权重文件在worke_dirs/路径下&#xff0c;名称epoch_1.…

在使用 Docker 时,用户可能会遇到各种常见的错误和问题

在使用 Docker 时&#xff0c;用户可能会遇到各种常见的错误和问题。以下是一些需要注意的常见错误及其可能的解决方案&#xff1a; 1. 权限问题 在 Linux 系统上运行 Docker 命令时&#xff0c;可能会遇到权限不足的问题。解决这个问题通常有两种方法&#xff1a; 使用 sud…

CORE MVC 过滤器 (筛选器)

MVC FrameWork MVCFramework MVC Core 过滤器 分 同步、异步 1、 授权筛选器 IAuthorizationFilter&#xff0c;IAsyncAuthorizationFilter 管道中运行的第一类筛选器&#xff0c;用来确定发出请求的用户是否有权限发出当前请求 2、资源筛选器 IResourceFilter &#xff0c;…