📢 转载信息
原文链接:https://machinelearningmastery.com/quantizing-llms-step-by-step-converting-fp16-models-to-gguf/
原文作者:Kanwal Mehreen
在本文中,您将了解到量化如何缩小大型语言模型,以及如何将FP16检查点转换为高效的GGUF文件,以便您可以共享和在本地运行它。
我们将涵盖的主题包括:
- 精度类型(FP32、FP16、8位、4位)对模型大小和速度意味着什么
- 如何使用
huggingface_hub来获取模型和进行身份验证 - 如何使用
llama.cpp转换为GGUF并将结果上传到Hugging Face
我们开始吧。
量化LLM分步指南:将FP16模型转换为GGUF
图片作者:Author
引言
像LLaMA、Mistral和Qwen这样的大型语言模型拥有数十亿个参数,需要大量的内存和计算能力。例如,以全精度运行LLaMA 7B可能需要超过12 GB的VRAM,这使得许多用户无法实际使用。您可以在这个Hugging Face讨论中查看详细信息。目前不必担心“全精度”的含义;我们稍后会详细解释。关键在于:这些模型太大,无法在标准硬件上运行,除非获得帮助。而量化就是这种帮助。
量化使独立研究人员和业余爱好者能够在个人计算机上运行大型模型,方法是在不严重影响性能的情况下缩小模型尺寸。在本指南中,我们将探讨量化的工作原理,不同精度格式的含义,然后逐步完成将FP16模型量化为GGUF格式并将其上传到Hugging Face的过程。
什么是量化?
从最基本的层面讲,量化就是使模型更小而不破坏它。大型语言模型由数十亿个称为权重的数值组成。这些数字控制着网络的不同部分在产生输出时相互影响的强度。默认情况下,这些权重使用高精度格式(如FP32或FP16)存储,这意味着每个数字占用大量内存,当你有数十亿个这样的数字时,内存占用会迅速失控。以单个数字2.31384为例。在FP32中,这一个数字就占用32位内存。现在想象一下存储数十亿个这样的数字。这就是为什么一个7B模型在FP32中很容易占用大约28 GB,即使在FP16中也需要大约14 GB。对于大多数笔记本电脑和GPU来说,这已经太多了。
量化通过表明:我们实际上不需要那么高的精度来解决这个问题。与其精确存储2.31384,不如用更少的比特存储一个接近它的值。也许它会变成2.3,或者在底层变成一个接近的整数值。这个数字的精度略有降低,但模型在实践中仍然表现相同。神经网络可以容忍这些微小的误差,因为最终的输出取决于数十亿次的计算,而不是单个数字。微小的差异会相互抵消,就像图像压缩减小文件大小但不会破坏图像外观一样。但回报是巨大的。一个在FP16中需要14 GB的模型,通过8位量化后通常可以运行在大约7 GB,而使用4位量化甚至只需要大约4 GB。这使得我们能够在本地运行大型语言模型,而不是依赖昂贵的服务器。
量化后,我们通常将模型存储在统一的文件格式中。一种流行的格式是GGUF,由Georgi Gerganov(llama.cpp的作者)创建。GGUF是一种单文件格式,其中包含量化后的权重和有用的元数据。它针对CPU或其他轻量级运行时环境的快速加载和推理进行了优化。GGUF还支持多种量化类型(如Q4_0、Q8_0),并且在CPU和低端GPU上都能很好地工作。希望这能阐明量化的概念和动机。现在让我们开始编写一些代码。
分步操作:将模型量化为GGUF
1. 安装依赖项并登录Hugging Face
在下载或转换任何模型之前,我们需要安装所需的Python包并向Hugging Face进行身份验证。我们将使用huggingface_hub、Transformers和SentencePiece。这确保了我们可以在没有错误的情况下访问公共或受限的模型:
|
1
2
3
4
|
!pip install -U huggingface_hub transformers sentencepiece -q
from huggingface_hub import login
login()
|
2. 下载预训练模型
我们将从Hugging Face中选择一个小的FP16模型。这里我们使用TinyLlama 1.1B,它足够小,可以在Colab中运行,同时仍然提供了很好的演示。使用Python,我们可以使用huggingface_hub下载它:
|
1
2
3
4
5
6
7
8
|
from huggingface_hub import snapshot_download
model_id = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
snapshot_download(
repo_id=model_id,
local_dir="model_folder",
local_dir_use_symlinks=False
)
|
此命令将模型文件保存到model_folder目录中。您可以将model_id替换为您想要量化的任何Hugging Face模型ID。(如果需要,您也可以先使用AutoModel.from_pretrained并带上torch.float16来加载它,但snapshot_download对于获取文件来说更直接。)
3. 设置转换工具
接下来,我们克隆llama.cpp仓库,其中包含转换脚本。在Colab中:
|
1
2
|
!git clone https://github.com/ggml-org/llama.cpp
!pip install -r llama.cpp/requirements.txt -q
|
这使您可以访问convert_hf_to_gguf.py。Python要求确保您拥有运行该脚本所需的所有库。
4. 使用量化将模型转换为GGUF
现在,运行转换脚本,指定输入文件夹、输出文件名和量化类型。我们将使用q8_0(8位量化)。这将大致将模型的内存占用减半:
|
1
2
3
|
!python3 llama.cpp/convert_hf_to_gguf.py /content/model_folder \
--outfile /content/tinyllama-1.1b-chat.Q8_0.gguf \
--outtype q8_0
|
这里的/content/model_folder是我们下载模型的地方,/content/tinyllama-1.1b-chat.Q8_0.gguf是输出的GGUF文件,而--outtype q8_0标志表示“量化为8位”。脚本加载FP16权重,将它们转换为8位值,并写入一个GGUF文件。该文件现在小得多,可以与兼容GGUF的工具进行推理。
|
1
2
3
4
5
|
Output:
INFO:gguf.gguf_writer:Writing the following files:
INFO:gguf.gguf_writer:/content/tinyllama-1.1b-chat.Q8_0.gguf: n_tensors = 201, total_size = 1.2G
Writing: 100% 1.17G/1.17G [00:26<00:00, 44.5Mbyte/s]
INFO:hf-to-gguf:Model successfully exported to /content/tinyllama-1.1b-chat.Q8_0.gguf
|
您可以验证输出:
|
1
|
!ls -lh /content/tinyllama-1.1b-chat.Q8_0.gguf
|
您应该会看到一个几GB大小的文件,它比原始的FP16模型减小了。
|
1
|
-rw-r--r-- 1 root root 1.1G Dec 30 20:23 /content/tinyllama-1.1b-chat.Q8_0.gguf
|
5. 将量化后的模型上传到Hugging Face
最后,您可以使用huggingface_hub Python库发布GGUF模型,以便其他人可以轻松下载和使用它:
|
1
2
3
4
5
6
7
8
9
10
11
|
from huggingface_hub import HfApi
api = HfApi()
repo_id = "kanwal-mehreen18/tinyllama-1.1b-gguf"
api.create_repo(repo_id, exist_ok=True)
api.upload_file(
path_or_fileobj="/content/tinyllama-1.1b-chat.Q8_0.gguf",
path_in_repo="tinyllama-1.1b-chat.Q8_0.gguf",
repo_id=repo_id
)
|
这会创建一个新仓库(如果它不存在的话)并将您的量化GGUF文件上传上去。现在任何人都可以使用llama.cpp、llama-cpp-python或Ollama加载它。您可以此处访问我们创建的量化GGUF文件。
总结
通过遵循上述步骤,您可以获取任何受支持的Hugging Face模型,将其量化(例如,量化为4位或8位),并将其保存为GGUF。然后将其推送到Hugging Face以共享或部署。这使得在日常硬件上压缩和使用大型语言模型比以往任何时候都更容易。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区