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

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

服务器配置:4*3090

描述:使用四张3090,分别进行单卡量化,多卡量化。并使用SGLang部署量化后的模型,使用GPTQ量化

原来的模型精度为FP16,量化为4bit

首先下载gptqmodel量化工具

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

shell 复制代码
huggingface-cli download --repo-type dataset --resume-download allenai/c4 --local-dir ./calibration

单卡量化

初始量化代码:

python 复制代码
from datasets import load_dataset
from gptqmodel import GPTQModel, QuantizeConfig

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 model

model.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()

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

python 复制代码
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 model

model.gradient_checkpointing_enable()
model.quantize(calibration_dataset, batch_size=1) # quantize
model.save(quant_path) # save model


使用SGLang部署后发现:

这里KV 缓存的大小明显增大了数倍,这能极大的提高并发数量

调整之后量化成功(可见降低了64.30%的显存空间),但是总共耗时了将近一小时的时间,因此我想使用四卡并行量化

四卡量化

可以看到内存在急速分配,说明模型权重需要先搬运到内存,再传递到显存中。

然后报了OOM的错误!于是更改了代码:

python 复制代码
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_rank

def 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倍!

相关推荐
zhangfeng113310 小时前
大语言模型 Greedy Decoding,贪心解码 / 贪心搜索
人工智能·语言模型·自然语言处理
郝学胜-神的一滴13 小时前
AI 编程智能体 16:从零基础搭建到精细化优化
人工智能·python·算法·语言模型·langchain·pip
iiiiii1113 小时前
大模型批量生成中的左填充 (left padding)与右填充 (right padding):从生成正确性到 GRPO 的混合策略
人工智能·机器学习·语言模型·大模型·llm·attention·注意力
凯凯姜14 小时前
Ollama 本地部署大语言模型笔记
人工智能·笔记·语言模型
Dawson Zhu16 小时前
【AI编译器入门②】TVM架构拆解:Relay、Relax、TIR与Runtime四层结构
人工智能·语言模型·架构·aigc·agi
mjhcsp16 小时前
DeepSeek V4.1 Flash 快速上手与实战指南
ai·语言模型·ai编程
Dawson Zhu17 小时前
【AI编译器入门③】编译前端:ONNX、TorchScript与动态shape处理
人工智能·语言模型·架构·aigc·agi
街头便衣17 小时前
OpenRouter周榜复算:164万亿token,输出2.55%,DeepSeek账单占1.4%
android·java·开发语言·人工智能·语言模型·开源
长不大的杨瑞杰1 天前
OpenCode v2 MCP 与插件体系实战:把数据库、工单和内部 API 安全接入 Agent
人工智能·安全·语言模型·软件工程·1024程序员节
还卿一钵无情泪2 天前
PEFT-Transformers、Unsloth、LLaMA-Factory 微调框架 横向对比
深度学习·大模型·llama·ollama