篮之新喜 发表于 2025-4-4 12:03:28

llama.cpp框架下GGUF格式及量化参数全剖析

前言:

在人工智能领域,语言模型的高效部署和推理不停是研究热门。随着模型规模的不断扩大,如安在有限的硬件资源上实现快速、高效的推理,成为了一个关键问题。`llama.cpp`框架以其出色的性能和机动性,为这一问题提供了有效的解决方案。其中,GGUF格式和模型量化参数是实现高效推理的紧张技术本领。本文将对`llama.cpp`框架下的GGUF格式及量化参数进行具体剖析,帮助读者更好地明白和应用这些技术,提升模型的部署效率和推理性能。
1:GGUF格式是什么?

GGUF(「GPT-Generated Unified Format」)是推理框架llama.cpp 中使用的一种专为大语言模型计划的二进制文件格式,旨在实现模型的快速加载和保存,同时易于读取。GGUF格式的特点:


[*] 「单文件部署」:模型可以轻松分发和加载,不需要任何外部文件来提供额外信息。
[*] 「可扩展性」:可以在不粉碎与现有模型的兼容性的情况下,向基于GGML的执行器添加新功能或向GGUF模型添加新信息。
[*] 「mmap兼容性」:可以使用mmap加载模型,以实现快速加载和保存。
[*] 「易于使用」:可以使用少量代码轻松加载和保存模型,无论使用何种语言,无需外部库。
[*] 「完整信息」:加载模型所需的全部信息都包罗在模型文件中,用户无需提供任何额外信息。
GGUF文件的结构如下图所示: 
 https://i-blog.csdnimg.cn/direct/86d9c6f6dc7849b3b2f08b719e7cede2.png
以下是对文件结构的重新形貌:
1. 文件头部(Header):
包罗文件类型标识(GGUF)、版本信息以及张量的数目。
2. 元数据区(Metadata):
接纳类似JSON的格式存储模型干系的信息,以键值对的情势构造。
3. 张量数据区(Tensors):
根据量化方式存储模型的权重数据。
文件整体依照在`general.alignment`元数据字段中界说的全局对齐规则,必要时,文件会通过添加0x00字节来填充至`general.alignment`指定的对齐边界。除非特别指明,全部字段(包罗数组)都将按顺序连续写入文件,且不进行额外的对齐操作。模型数据默认接纳小端字节序,但为了兼容大端字节序的计算机体系,它们也可以以大端字节序的情势存储,在这种情况下,包罗元数据和张量在内的全部数据都将接纳大端字节序。

2:GGUF命名约定

GGUF依照<BaseName><SizeLabel><FineTune><Version><Encoding><Type><Shard>.gguf的命名约定,其中每个组件由-分隔(假如存在),这种命名方式的最终目标是为了让人们能够快速了解模型的关键信息。
每个组件的寄义如下:

[*] 「BaseName」:模型基础类型或架构的形貌性名称。

[*] 1可以从gguf元数据general.basename派生,将空格替换为连字符。

[*] 「SizeLabel」:参数权重类别(在排行榜中有用),表现为<专家数目>x<数目><量级前缀>。

[*] Q:千万亿参数。
[*] T:万亿参数。
[*] B:十亿参数。
[*] M:百万参数。
[*] K:千参数。
   

[*] 假如可用,可以从gguf元数据general.size_label派生,假如缺失则进行计算。
[*] 支持带有单个字母量级前缀的十进制点的四舍五入,以帮助显示浮点指数,如下所示:
[*] 可以根据需要附加额外的-<属性><数目><量级前缀>以指示其他感爱好的属性。

[*] 「FineTune」:模型微调目标的形貌性名称(例如Chat、Instruct等)。

[*] 可以从gguf元数据general.finetune派生,将空格替换为连字符。

[*] 「Version」:表现模型版本号,格式为v<主版本>.<次版本>。

[*] 假如模型缺少版本号,则假设为v1.0(首次公开发布)。
[*] 可以从gguf元数据general.version派生。

[*] 「Encoding」:指示应用于模型的权重编码方案。内容、类型混合和排列由用户代码决定,可以根据项目需求而有所不同。
[*] 「Type」:指示gguf文件的类型及其预期用途。

[*] 假如缺失,则文件默认为典范的gguf张量模型文件。
[*] LoRA:GGUF文件是LoRA适配器。
[*] vocab:仅包罗词汇数据和元数据的GGUF文件。

[*] 「Shard」:(可选)指示模型已被拆分为多个分片,格式为<分片编号>-of-<总分片数>。

[*] 分片编号始终从00001开始(例如,第一个分片总是从00001-of-XXXXX开始,而不是00000-of-XXXXX)。
   

[*] 「分片编号」:此模型中的分片位置。必须用零填充为5位数字。
[*] 「总分片数」:此模型中的总分片数。必须用零填充为5位数字。


下面是对几个GGUF模型文件名的注解:


[*] Mixtral-8x7B-v0.1-KQ2.gguf:

[*] 模型名称:Mixtral
[*] 专家数目:8
[*] 参数数目:7B
[*] 版本号:v0.1
[*] 权重编码方案:KQ2

[*] Hermes-2-Pro-Llama-3-8B-F16.gguf:

[*] 模型名称:Hermes 2 Pro Llama 3
[*] 专家数目:0
[*] 参数数目:8B
[*] 版本号:v1.0
[*] 权重编码方案:F16
[*] 分片:不实用

[*] Grok-100B-v1.0-Q4_0-00003-of-00009.gguf:

[*] 模型名称:Grok
[*] 专家数目:0
[*] 参数数目:100B
[*] 版本号:v1.0
[*] 权重编码方案:Q4_0
[*] 分片:3 out of 9 total shards

 GGUF命名规则约定全部模型文件都应该有根本名称、大小标签和版本,以便能够轻松验证其是否符合GGUF命名约定。例如,假如省略版本号,那么编码很容易被误认为是微调。
3:GGUF格式转换

GGUF格式是推理框架llama.cpp使用的格式,但是通常模型是使用PyTorch之类的练习框架练习的,保存的格式一样平常使用HuggingFace的safetensors格式,因此使用llama.cpp进行推理之前需要把其他格式的模型转换为GGUF格式。
起首从魔搭社区(或HuggingFace)下载模型:
pip install modelscope
modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local_dir DeepSeek-R1-Distill-Qwen-7B下载好的模型是以safetensors格式存放的,可以调用llama.cpp的转换脚本把模型转换为GGUF格式:
# 安装python依赖库
pip install -r requirements.txt
# 转换模型
python convert_hf_to_gguf.py DeepSeek-R1-Distill-Qwen-7B/
转换成功后,在该目录下会生成一个FP16精度、GGUF格式的模型文件DeepSeek-R1-Distill-Qwen-7B-F16.gguf。






免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: llama.cpp框架下GGUF格式及量化参数全剖析