使用GPTQ量化Llama-3-8B大模型

ops/2025/3/18 14:15:04/

使用GPTQ量化8B生成式语言模型

服务器配置:4*3090
在这里插入图片描述
描述:使用四张3090,分别进行单卡量化,多卡量化。并使用SGLang部署量化后的模型,使用GPTQ量化
原来的模型精度为FP16,量化为4bit

首先下载gptqmodel量化工具

因为要离线量化,所以需要提前下载好模型权重文件,校准数据集使用allenai/c4,需要使用HF的镜像来下载:参考我的这篇文章

huggingface-cli download --repo-type dataset --resume-download allenai/c4 --local-dir ./calibration

单卡量化

初始量化代码:

from datasets import load_dataset
from gptqmodel import GPTQModel, QuantizeConfigmodel_id = "/home/zgq/Meta-Llama-3-8B-Instruct"
quant_path = "/home/zgq/sglang/Meta-Llama-3-8B-Instruct-gptqmodel-4bit"# 直接加载本地数据集,不再从 Hugging Face 下载
calibration_dataset = load_dataset("json",  # 指定数据格式data_files="calibration_data/en.noblocklist/c4-train.00001-of-01024.json.gz",  # 指定本地路径split="train"
).select(range(1024))["text"]  # 选择前 1024 条数据quant_config = QuantizeConfig(bits=4,# 量化为 4 位group_size=128  # 分组大小为 128) # quantization config
model = GPTQModel.load(model_id, quant_config) # load modelmodel.quantize(calibration_dataset, batch_size=2) # quantize
model.save(quant_path) # save model

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
量化过程出现了OOM
解决方案:
首先尝试将batch_size降为1
优化显存管理:export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
插入梯度检查点:model.gradient_checkpointing_enable()

调整参数后第二次尝试量化:

from datasets import load_dataset
from gptqmodel import GPTQModel, QuantizeConfig
import torch# torch.cuda.empty_cache()
# torch.cuda.set_per_process_memory_fraction(0.9)  # 保留 80% 显存model_id = "/home/zgq/Meta-Llama-3-8B-Instruct"
quant_path = "/home/zgq/sglang/Meta-Llama-3-8B-Instruct-gptqmodel-4bit"# 直接加载本地数据集,不再从 Hugging Face 下载
calibration_dataset = load_dataset("json",  # 指定数据格式data_files="calibration_data/en.noblocklist/c4-train.00001-of-01024.json.gz",  # 指定本地路径split="train"
).select(range(1024))["text"]  # 选择前 1024 条数据quant_config = QuantizeConfig(bits=4,# 量化为 4 位group_size=128  # 分组大小为 128) # quantization config
model = GPTQModel.load(model_id, quant_config) # load modelmodel.gradient_checkpointing_enable()
model.quantize(calibration_dataset, batch_size=1) # quantize
model.save(quant_path) # save model

在这里插入图片描述
在这里插入图片描述
使用SGLang部署后发现:
在这里插入图片描述
这里KV 缓存的大小明显增大了数倍,这能极大的提高并发数量
调整之后量化成功(可见降低了64.30%的显存空间),但是总共耗时了将近一小时的时间,因此我想使用四卡并行量化

四卡量化

在这里插入图片描述
可以看到内存在急速分配,说明模型权重需要先搬运到内存,再传递到显存中。
然后报了OOM的错误!于是更改了代码:

import os
import torch
import torch.distributed as dist
from datasets import load_dataset
from gptqmodel import GPTQModel, QuantizeConfig# 初始化分布式环境
def init_distributed():dist.init_process_group(backend="nccl")print(f"Rank {dist.get_rank()}: Distributed environment initialized.")local_rank = int(os.environ["LOCAL_RANK"])torch.cuda.set_device(local_rank)return local_rankdef main():local_rank = init_distributed()# 模型路径和量化保存路径model_id = "/home/zgq/Meta-Llama-3-8B-Instruct"quant_path = "/home/zgq/Meta-Llama-3-8B-Instruct-gptqmodel-4bit"# 加载本地校准数据集(每个进程加载自己的分片)calibration_dataset = load_dataset("json",data_files="calibration_data/en.noblocklist/c4-train.00001-of-01024.json.gz",split=f"train[{local_rank * 256}:{(local_rank + 1) * 256}]")["text"]print(f"Rank {dist.get_rank()}: Loaded {len(calibration_dataset)} samples.")# 量化配置quant_config = QuantizeConfig(bits=4,group_size=128)# 分布式加载模型model = GPTQModel.load(model_id,quant_config,device_map={"": local_rank},torch_dtype=torch.float16,low_cpu_mem_usage=True)print(f"Rank {dist.get_rank()}: Model loaded on GPU {local_rank}.")# 启用梯度检查点model.gradient_checkpointing_enable()# 分布式量化(每个进程处理自己的数据分片)model.quantize(calibration_dataset, batch_size=1)print(f"Rank {dist.get_rank()}: Quantization completed.")# 主进程保存量化模型if local_rank == 0:model.save(quant_path)print(f"Rank {dist.get_rank()}: Model saved to {quant_path}.")dist.barrier()  # 等待所有进程完成if __name__ == "__main__":main()

程序启动命令为:torchrun --nproc_per_node=4 torch-dist-gptq.py (指定每个节点使用 4 个 GPU,根据你的环境来修改)

在这里插入图片描述
可见四卡并行的方式要快很多!
在这里插入图片描述
以上图片是运行时硬件状态。
在这里插入图片描述
量化完成,和单卡量化效果一致,但是缩短了量化时间,效率约提升了4.5倍!


http://www.ppmy.cn/ops/166779.html

相关文章

零拷贝分析

kafka 零拷贝 请求 - 网口 - socket - 用户态 - 内核缓存区 - 内核态(磁盘信息) 磁盘 - 内核缓存区 - 用户缓存区 - 网络缓存区 零拷贝(Zero-Copy) 是一种高效的数据传输技术,旨在减少数据在内存中的拷贝次数&#x…

vue echarts封装使用

echarts 尺寸自动调节 resize.js 柱状图 components/dashboard/lineChart.vue <template><div :class"className" :style"{height:height,width:width}" /> </template><script> import echarts from echarts require(echarts/…

冯 • 诺依曼体系结构

冯 • 诺依曼体系结构 一、冯 • 诺依曼体系结构推导阶段 1&#xff1a;初始计算机体系结构&#xff08;仅输入、运算、输出&#xff09;阶段 2&#xff1a;加入控制功能&#xff0c;初步形成 CPU 概念阶段 3&#xff1a;性能瓶颈与引入内存阶段 4&#xff1a;最终冯诺依曼体系…

[特殊字符] 深度实战:Android 13 系统定制之 Recovery 模式瘦身指南

&#x1f31f; 核心需求 在 Android 13 商显设备开发中&#xff0c;需精简 Recovery 模式的菜单选项&#xff08;如Reboot to bootloader/Enter rescue&#xff09;&#xff0c;但直接修改g_menu_actions后在User 版本出现黑屏卡死问题&#xff0c;需综合方案解决。 &#x1f5…

SvelteKit 最新中文文档教程(4)—— 表单 actions

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

利用github部署项目

挂载GitHub Pages的方法 基本步骤 创建仓库&#xff1a; 在GitHub上创建一个新的仓库。如果使用自定义域名&#xff0c;则仓库名应为<username>.github.io&#xff1b;否则可以是任意名称。 启用GitHub Pages&#xff1a; 进入仓库的设置页面&#xff0c;在“Pages”部…

【从零开始学习计算机科学】信息安全(八)防火墙

【从零开始学习计算机科学】信息安全(八)防火墙 防火墙防火墙概述防火墙设计原则防火墙的优点防火墙的不足防火墙类别防火墙技术包过滤技术代理技术应用层网关电路级网关状态检查技术地址翻译技术NAT防火墙体系结构包过滤路由器双宿主机网关屏蔽主机体系结构屏蔽子网体系结构…

Chat2DB:让数据库管理像聊天一样简单

数据库工具的痛点与破局 在数据爆炸的时代&#xff0c;数据库管理工具已成为企业高效运营的刚需。然而&#xff0c;传统工具如Navicat、DBeaver虽功能强大&#xff0c;却让非技术人员和SQL新手望而却步。复杂的界面、繁琐的手动操作、晦涩的语法规则&#xff0c;成为横亘在数据…