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

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 模型并移动到指定的文件路径:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值