【模型量化】GPTQ 与 AutoGPTQ

GPTQ是一种用于类GPT线性最小二乘法的量化方法,它使用基于近似二阶信息的一次加权量化。

本文中也展示了如何使用量化模型以及如何量化自己的模型AutoGPTQ。

AutoGPTQ:一个易于使用的LLM量化包,带有用户友好的API,基于GPTQ算法(仅权重量化)。

目录

GPTQ与Hugging Face transformers的使用

结合vLLM使用GPTQ模型

用AutoGPTQ量化自己的模型



GPTQ与Hugging Face transformers的使用

注意

使用Qwen2.5 GPTQ官方型号transformers

请确保optimum>=1.20.0和兼容版本的transformersauto_gptq已安装。

pip install -U "optimum>=1.20.0"

现在,transformers已经正式支持AutoGPTQ,这意味着可以通过transformers使用量化模型。对于Qwen2.5的每个尺寸,提供Int4和Int8 GPTQ量化模型。下面是一个非常简单的代码片段,展示了如何运行Qwen2.5-7B-Instruct-GPTQ-Int4:

from transformers import AutoModelForCausalLM, AutoTokenizermodel_name = "Qwen/Qwen2.5-7B-Instruct-GPTQ-Int4"model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)prompt = "Give me a short introduction to large language model."
messages = [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": prompt},
]
text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True,
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)generated_ids = model.generate(**model_inputs,max_new_tokens=512,
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

结合vLLM使用GPTQ模型

vLLM支持GPTQ,这意味着可以直接使用提供的GPTQ模型或那些用VLLM训练的模型。如果可能,它会自动使用GPTQ Marlin内核,这样效率更高。

实际上,用法与vLLM的基本用法相同。提供了一个简单的例子说明如何用vLLM和Qwen2.5-7B-Instruct-GPTQ-Int4:

在shell中运行以下命令,启动与OpenAI兼容的API服务:

vllm serve Qwen2.5-7B-Instruct-GPTQ-Int4

然后,可以像这样调用API:

curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{"model": "Qwen2.5-7B-Instruct-GPTQ-Int4","messages": [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": "Tell me something about large language models."}],"temperature": 0.7,"top_p": 0.8,"repetition_penalty": 1.05,"max_tokens": 512
}'

或者可以使用API客户端,如下所示:

from openai import OpenAIopenai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"client = OpenAI(api_key=openai_api_key,base_url=openai_api_base,
)chat_response = client.chat.completions.create(model="Qwen2.5-7B-Instruct-GPTQ-Int4",messages=[{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": "Tell me something about large language models."},],temperature=0.7,top_p=0.8,max_tokens=512,extra_body={"repetition_penalty": 1.05,},
)
print("Chat response:", chat_response)

用AutoGPTQ量化自己的模型

如果需要把自己的模型量化成GPTQ量化模型,建议使用AutoGPTQ。建议通过从源代码安装来安装最新版本的软件包:

git clone https://github.com/AutoGPTQ/AutoGPTQ
cd AutoGPTQ
pip install -e .

假设已经使用自己的数据集对模型Qwen2.5-7B进行了微调,它被命名为Qwen2.5-7B-finetuned,要构建自己的GPTQ量化模型,需要使用训练数据进行校准。下面,提供一个简单的示例。

from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from transformers import AutoTokenizer# Specify paths and hyperparameters for quantization
model_path = "your_model_path"
quant_path = "your_quantized_model_path"
quantize_config = BaseQuantizeConfig(bits=8, # 4 or 8group_size=128,damp_percent=0.01,desc_act=False,  # set to False can significantly speed up inference but the perplexity may slightly badstatic_groups=False,sym=True,true_sequential=True,model_name_or_path=None,model_file_base_name="model"
)
max_len = 8192# Load your tokenizer and model with AutoGPTQ
# To learn about loading model to multiple GPUs,
# visit https://github.com/AutoGPTQ/AutoGPTQ/blob/main/docs/tutorial/02-Advanced-Model-Loading-and-Best-Practice.md
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoGPTQForCausalLM.from_pretrained(model_path, quantize_config)

但是,如果想在多个GPU上加载模型,需要使用max_memory代替device_map。这里有一个例子:

model = AutoGPTQForCausalLM.from_pretrained(model_path,quantize_config,max_memory={i: "20GB" for i in range(4)}
)

然后,需要为校准准备数据。需要做的只是把样本放到一个列表中,每个样本都是一个文本。由于直接使用微调数据进行校准,首先用ChatML模板对其进行格式化。举个例子:

import torchdata = []
for msg in dataset:text = tokenizer.apply_chat_template(msg, tokenize=False, add_generation_prompt=False)model_inputs = tokenizer([text])input_ids = torch.tensor(model_inputs.input_ids[:max_len], dtype=torch.int)data.append(dict(input_ids=input_ids, attention_mask=input_ids.ne(tokenizer.pad_token_id)))

其中每个msg是一条典型的聊天消息,如下所示:

[{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": "Tell me who you are."},{"role": "assistant", "content": "I am a large language model named Qwen..."}
]

然后通过一行代码运行校准过程:

import logginglogging.basicConfig(format="%(asctime)s %(levelname)s [%(name)s] %(message)s", level=logging.INFO, datefmt="%Y-%m-%d %H:%M:%S"
)
model.quantize(data, cache_examples_on_gpu=False)

最后,保存量化模型:

model.save_quantized(quant_path, use_safetensors=True)
tokenizer.save_pretrained(quant_path)

save_quantized方法不支持分片。对于分片,需要加载模型并使用save_pretrained来保存和分割模型。

至此,本文的内容结束啦。

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

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

相关文章

如何部署DeepSeek企业知识库:

一、核心部署流程 环境准备‌ 安装Ollama框架:官网下载安装包并完成基础配置,需确保安装路径不含中文‌; 硬件要求:根据企业规模选择设备,如小微团队建议i5十代+16GB内存,中大型企业需GPU集群(如NVIDIA A100/H100)‌。 模型选择与下载‌ 通过Ollama下载DeepSeek-R1…

FastAPI依赖注入:链式调用与多级参数传递

title: FastAPI依赖注入:链式调用与多级参数传递 date: 2025/04/05 18:43:12 updated: 2025/04/05 18:43:12 author: cmdragon excerpt: FastAPI的依赖注入系统通过链式调用和多级参数传递实现组件间的解耦和复用。核心特性包括解耦性、可复用性、可测试性和声明式依赖解析…

前沿计组知识入门(四)

Training Large Networks in Parallel 计算机集群上高效训练大型深度神经网络(DNN)的方法和技术。从神经网络的基本概念出发,逐步深入到并行训练的具体实现策略,包括数据并行、模型并行以及参数服务器的设计等。 研究背景与动机…

Transformer+BO-SVM多变量时间序列预测(Matlab)

TransformerBO-SVM多变量时间序列预测(Matlab) 目录 TransformerBO-SVM多变量时间序列预测(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 本期推出一期高创新模型,基于Transformer提取时序特征后输入S…

SQL BETWEEN 语句详解

SQL BETWEEN 语句详解 概述 SQL BETWEEN 语句是一个用于在 SQL 查询中指定查询条件的重要工具。它允许用户指定一个范围,用于筛选符合特定条件的记录。本文将详细介绍 BETWEEN 语句的用法、示例以及注意事项。 BETWEEN 语句的基本用法 BETWEEN 语句的基本格式如…

AI Agent设计模式三:Routing

概念 :动态路径选择器 ✅ 优点:灵活处理不同类型输入❌ 缺点:路由逻辑复杂度高 from typing import TypedDict from langchain_core.messages import SystemMessage, HumanMessage from langchain_openai import ChatOpenAI from langgraph.…

制造装备物联及生产管理ERP系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装制造装备物联及生产管理ERP系统软件来发挥其高效地信息处理…

`use_tempaddr` 和 `temp_valid_lft ` 和 `temp_prefered_lft ` 笔记250405

use_tempaddr 和 temp_valid_lft 和 temp_prefered_lft 笔记250405 以下是 Linux 系统中与 IPv6 临时隐私地址相关的三个关键参数 use_tempaddr、temp_valid_lft 和 temp_prefered_lft 的详细说明及协作关系: 📜 参数定义与功能 参数作用默认值依赖关…

基于Spark的哔哩哔哩舆情数据分析系统

【Spark】基于Spark的哔哩哔哩舆情数据分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python和Django框架进行开发,为了便于广大用户针对舆情进行个性化分析处…

南京大学与阿里云联合启动人工智能人才培养合作计划,已将通义灵码引入软件学院课程体系

近日,南京大学与阿里云宣布启动人工智能人才培养合作计划,共同培养适应未来技术变革、具备跨学科思维的AI创新人才。 基于阿里云在云计算和AI大模型领域的技术优势和南京大学在人工智能领域的学科优势,双方将共同设计兼具前瞻性和应用性的人…

用于解决个人使用的公网ip动态变化问题的解决方案

解决方案 静态ip(放弃) 申请一个静态ip价格较贵,只有公司可以申请 使用DDNS(放弃) 通过域名解析到公网ip通过域名访问设备官方光猫不支持DDNS 使用脚本(采用) 通过脚本获取公网ip通过脚本发送到…

Spring / Spring Boot 的@MapperScan 和 @Repository

MapperScan 和 Repository 是两个与数据访问层相关的注解,它们在功能上有一定的联系,但也有明显的区别。 一、相同点 1. 都与数据访问层相关 MapperScan:用于扫描 MyBatis 的 Mapper 接口。MyBatis 是一个流行的持久层框架,Mapp…

全星 研发项目管理APQP 软件:驱动汽车及制造业研发升级的数字化引擎

全星 APQP 软件:驱动汽车及制造业研发升级的数字化引擎 在汽车及制造业竞争白热化的当下,如何高效推进研发项目,同时确保严格合规,成为企业亟待解决的难题。 全星研发项目管理 APQP 软件系统,凭借卓越的功能与显著优势…

cadence17.4和16.6同时安装无法使用的问题

最近在搞这个两个版本的软件安装,针对网上的一些说法: 方法一:先装17.4再装16.6,文件放在一个文件夹,打不开,两个版本都无法使用 方法二:分别安装,文件路径放在不同的文件 方案三:修改环境变量,直接使用17.4的 License Manager 这个也无法解决问题。 经过对报错的问…

(三)链式工作流构建——打造智能对话的强大引擎

上一篇:(二)输入输出处理——打造智能对话的灵魂 在前两个阶段,我们已经搭建了一个基础的智能对话,并深入探讨了输入输出处理的细节。今天,我们将进入智能对话的高级阶段——链式工作流构建。这一阶段的目…

【MATLAB定位例程】TDOA(到达时间差)的chan-tylor,三维环境,附完整代码

该代码实现了基于三维空间的动态目标TDOA定位,结合了Chan算法(解析解)与Taylor级数展开法(迭代优化)的双重优势。 文章目录 运行结果MATLAB代码代码讲解代码功能概述核心算法原理代码结构解析可视化与结果分析运行结果 定位示意图: 三轴状态曲线: 三轴误差曲线: MA…

Golang的文件同步与备份

Golang的文件同步与备份 一、Golang介绍 也称为Go语言,是谷歌开发的一种编程语言,具有高效的并发编程能力和出色的内存管理。由于其快速的编译速度和强大的标准库,Golang在网络应用、云平台和大数据等领域得到了广泛应用。 二、文件同步与备份…

ARXML文件解析-2

目录 1 摘要2 常见ARXML文件注意事项以及常见问题2.1 注意事项2.2 常见问题2.3 答疑 3 ARXML解读/编辑指南3.1 解读ARXML文件的步骤3.2 编辑ARXML文件的方法3.3 验证与调试 4 总结 1 摘要 本文主要对ARXML文件的注意事项、常见问题以及解读与编辑进行详细介绍。 上文回顾&…

3535 数组分割

3535 数组分割 ⭐️难度:困难 🌟考点:2023、省赛、动态规划 📖 📚 import java.util.*;public class Main {static int MOD 1000000007;static int N 1005;public static void main(String[] args) {Scanner sc …