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