📢 转载信息
原文链接:https://machinelearningmastery.com/quantizing-llms-step-by-step-converting-fp16-models-to-gguf/
原文作者:Kanwal Mehreen
在本文中,您将学习量化如何缩小大型语言模型(LLM)的体积,以及如何将一个 FP16 检查点(checkpoint)转换为高效的 GGUF 文件,以便您可以共享并在本地运行它。
我们将涵盖的主题包括:
- 精度类型(FP32、FP16、8位、4位)对模型大小和速度意味着什么
- 如何使用
huggingface_hub来获取模型并进行身份验证 - 如何使用
llama.cpp转换为 GGUF 并将结果上传到 Hugging Face
让我们开始吧。
分步量化LLM:将FP16模型转换为GGUF
图片来源:作者
引言
像 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。(如果需要,您也可以使用带有 torch.float16 的 AutoModel.from_pretrained 先加载它,但 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+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区