大语言模型量化方法对比:GPTQ、GGUF、AWQ

原文:大语言模型量化方法对比:GPTQ、GGUF、AWQ - 知乎

在过去的一年里,大型语言模型(llm)有了飞速的发展,在本文中,我们将探讨几种(量化)的方式,除此以外,还会介绍分片及不同的保存和压缩策略。

说明:每次加载LLM示例后,建议清除缓存,以防止出现OutOfMemory错误。

del model, tokenizer, pipe 

import torch 
torch.cuda.empty_cache()

如果在jupyter中无法释放显存,请重启这个jupyter notebook。

模型加载

加载LLM的最直接、最普通的方式是通过 Transformers。HuggingFace已经创建了一个套件,我们能够直接使用

pip install git+https://github.com/huggingface/transformers.git 
pip install accelerate bitsandbytes xformers

安装完成后,我们可以使用以下管道轻松加载LLM:

from torch import bfloat16
from transformers import pipeline

# Load in your LLM without any compression tricks
pipe = pipeline(
    "text-generation", 
    model="HuggingFaceH4/zephyr-7b-beta", 
    torch_dtype=bfloat16, 
    device_map="auto"
)

我们这里使用zephyr-7b-beta作为示例

这种加载LLM的方法通常不会执行任何压缩技巧。我们来做个使用的示例

messages = [
    {
        "role": "system",
        "content": "You are a friendly chatbot.",
    },
    {
        "role": "user", 
        "content": "Tell me a funny joke about Large Language Models."
    },
]
prompt = pipe.tokenizer.apply_chat_template(
    messages, 
    tokenize=False, 
    add_generation_prompt=True
)

使用内部提示模板生成的提示是这样构造的:

然后,我们可将提示传递给LLM来生成答案:

outputs = pipe(
    prompt, 
    max_new_tokens=25
<think>嗯,用户现在问的是vLLM如何部署GGUF量化模型。首先,我需要确认vLLM是否支持GGUF格式。GGUF是llama.cpp使用的格式,而vLLM主要支持Hugging Face的模型,比如PyTorch的模型或者Safetensors格式。可能需要检查vLLM的官方文档或GitHub是否有相关说明。 用户可能之前已经了解过vLLM的多机部署情况,现在转向模型量化部署,特别是GGUFGGUF模型通常用于减少显存占用,提高推理速度,适合在资源有限的环境中使用。但vLLM本身是否支持呢?如果官方不支持,有没有其他方法可以间接实现? 首先,我应该回忆一下vLLM支持的模型格式。vLLM主要支持Hugging Face Transformers模型,以及AWQGPTQ量化格式。而GGUF是llama.cpp的格式,可能需要转换。所以可能需要将GGUF模型转换为vLLM支持的格式,或者通过其他工具桥接。 用户可能的需求是在vLLM中使用已经量化好的GGUF模型,以节省资源。但vLLM可能不直接支持,这时候需要提供替代方案。比如,是否可以使用llama.cpp和vLLM结合,或者是否有其他方法转换GGUF到Hugging Face格式? 另外,用户可能对步骤感兴趣,比如具体的操作流程,转换模型、修改配置、部署等。需要详细说明步骤,并指出可能的注意事项,比如兼容性问题,性能差异等。 还要考虑用户的背景,可能是开发者或者运维人员,希望在生产环境中部署量化模型,所以需要稳定和高效的解决方案。如果vLLM不支持GGUF,可能需要建议替代方案,比如使用llama.cpp单独部署,或者转换模型格式。 此外,可能存在的误区是认为vLLM支持所有量化格式,但实际上每种框架支持的量化方法不同。需要明确指出vLLM当前支持的量化方法,如AWQGPTQ,并说明GGUF的局限性。 总结回答的结构应该是:先说明vLLM目前不支持GGUF,然后给出替代方法,如转换模型格式、使用llama.cpp或其他工具,以及可能的集成方法,并比较不同方法的优缺点,最后给出建议。</think>截至2024年7月,**vLLM 暂未原生支持 GGUF 格式的量化模型部署**。GGUF 是 `llama.cpp` 生态的专用量化格式,而 vLLM 主要面向 PyTorch/Hugging Face 格式的模型(支持 AWQGPTQ量化方案)。不过可通过以下方法间接实现部署: --- ### **1. 核心限制与兼容性** - **vLLM 官方支持**: vLLM 原生支持 **Hugging Face 模型库格式**(如 PyTorch `.bin` 或 `safetensors`),以及 **AWQ/GPTQ 量化模型**,但 **不支持直接加载 GGUF 文件**。 - **GGUF 特点**: GGUF 是 `llama.cpp` 的量化格式,需通过 `llama.cpp` 库加载,与 vLLM 的架构不兼容。 --- ### **2. 替代部署方案** 若需在 vLLM 生态中使用 GGUF 模型,需通过格式转换或工具桥接: #### **方案 1:将 GGUF 转换为 Hugging Face 格式** - **原理**: 将 GGUF 模型反量化为原始浮点模型,再转换为 Hugging Face 格式供 vLLM 加载。 - **步骤**: 1. **反量化 GGUF**: 使用 `llama.cpp` 工具将 GGUF 模型转换为 FP16 或 FP32 格式: ```bash ./llama.cpp/convert-llama-gguf-to-ggml.py --input model.gguf --output model_fp16.bin --outtype f16 ``` 2. **转换为 Hugging Face 格式**: 使用 `transformers` 库的转换脚本生成 `config.json` 和模型文件: ```bash python -m transformers.models.llama.convert_llama_weights_to_hf \ --input_dir ./converted_model \ --model_size 7B \ --output_dir ./hf_model ``` 3. **vLLM 部署**: 加载转换后的模型: ```python from vllm import LLM llm = LLM(model="./hf_model") ``` - **缺点**: 反量化后失去压缩优势,显存占用与原始模型相同,仅适用于临时测试。 #### **方案 2:通过 `llama.cpp` 与 vLLM 协同部署** - **原理**: 将 `llama.cpp` 作为独立服务运行 GGUF 模型,通过 API 与 vLLM 协同工作(如路由特定请求)。 - **架构示例**: ```plaintext 客户端 → vLLM 服务(处理非量化模型请求) → llama.cpp 服务(处理 GGUF 模型请求) ``` - **实现步骤**: 1. 部署 `llama.cpp` 服务: ```bash ./llama.cpp/server -m model.gguf --port 8001 ``` 2. 部署 vLLM 服务: ```bash python -m vllm.entrypoints.api_server --model meta-llama/Llama-3-70b --port 8000 ``` 3. 使用网关(如 FastAPI)路由请求: ```python from fastapi import FastAPI import requests app = FastAPI() @app.post("/generate") async def generate(prompt: str, use_gguf: bool = False): if use_gguf: response = requests.post("http://localhost:8001/completion", json={"prompt": prompt}) else: response = requests.post("http://localhost:8000/generate", json={"prompt": prompt}) return response.json() ``` #### **方案 3:等待 vLLM 官方支持** - 跟踪 vLLM GitHub 的 [Feature Request](https://github.com/vllm-project/vllm/issues/2638),社区已提议支持 GGUF,但尚未实现。 --- ### **3. 直接使用 `llama.cpp` 的优化方案** 若必须使用 GGUF 且追求极简部署,建议直接依赖 `llama.cpp` 生态: - **优点**: 完整的 GGUF 支持,显存优化更彻底。 - **部署命令**: ```bash # 启动 API 服务 ./llama.cpp/server -m model.gguf --port 8000 --n-gpu-layers 40 # 启用 GPU 加速 ``` - **性能调优**: 通过 `--threads`, `--batch-size` 等参数优化吞吐量。 --- ### **4. 对比总结** | **方案** | 兼容性 | 显存优势 | 复杂度 | 适用场景 | |------------------------|--------|----------|--------|------------------------| | GGUF 转 Hugging Face | 低 | ❌ | 高 | 临时测试 | | `llama.cpp` + vLLM 协同 | 中 | ✅ | 中 | 混合负载场景 | | 纯 `llama.cpp` 部署 | 高 | ✅ | 低 | 生产级 GGUF 专用环境 | --- ### **建议** - **优先使用 vLLM 原生量化**:若显存允许,直接使用 vLLM 支持的 **AWQ/GPTQ 量化模型**(如 `TheBloke/Llama-3-70B-AWQ`),性能更优。 - **严格依赖 GGUF 时**:选择 `llama.cpp` 部署,或等待 vLLM 官方支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值