文章目录
探索预量化的大型语言模型
文章翻译:Maarten Grootendorst Which Quantization Method is Right for You? (GPTQ vs. GGUF vs. AWQ)
在过去的一年中,我们见证了大型语言模型(LLM)的狂野西部。发布新技术和模型的速度令人惊叹!因此,我们有许多不同的标准和处理LLM的方式。
在本文中,我们将探讨一个话题,即通过几种(量化)标准加载本地LLM。通过分片、量化和不同的保存和压缩策略,很难知道哪种方法适合您。
在示例中,我们将使用Zephyr 7B,这是一个经过Direct Preference Optimization(DPO)训练的Mistral 7B的精调变体。
🔥 提示:在加载LLM的每个示例之后,建议重新启动您的笔记本以防止内存不足错误。加载多个LLM需要大量的RAM/VRAM。您可以通过删除模型并重置缓存来重置内存,如下所示:
# 删除之前创建的任何模型
del model, tokenizer, pipe
# 清空VRAM缓存
import torch
torch.cuda.empty_cache()
您还可以使用Google Colab Notebook跟随操作,以确保一切正常。 https://colab.research.google.com/drive/1rt318Ew-5dDw21YZx2zK2vnxbsuDAchH?usp=sharing
1. HuggingFace
加载LLM的最简单、最基本的方法是通过🤗 Transformers。HuggingFace创建了一套大型的软件包,使我们能够在LLM上做出惊人的事情!
我们将从其主分支安装HuggingFace,以支持更新的模型:
# 用于类似Mistral的最新HF transformers版本
pip install git+https://github.com/huggingface/transformers.git
pip install accelerate bitsandbytes xformers
安装完成后,我们可以使用以下流水线轻松加载LLM:
from torch import bfloat16
from transformers import pipeline
# 加载未经任何压缩技巧的LLM
pipe = pipeline(
"text-generation",
model="HuggingFaceH4/zephyr-7b-beta",
torch_dtype=bfloat16,
device_map="auto"
)
这种加载LLM的方法通常不会执行任何压缩技巧,以节省VRAM或提高效率。
为了生成我们的提示,我们首先需要创建必要的模板。幸运的是,如果聊天模板保存在底层的分词器中,这可以自动完成:
# 我们使用分词器的聊天模板来格式化每条消息
# 请参阅https://huggingface.co/docs/transformers/main/en/chat_templating
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