Skip to content

All you need to know about gguf

MasakiMu319

WARNING

文中所列出的 GGUF 元数据部分内容截止到 24/11/06,如发现某些 model 有新增元数据信息,请以模型发布方说明为准,或者参考:gguf/constants.py, .

GGUF 是 Hugging Face Hub 内置特性支持,用于优化快速加载、保存模型的二进制文件格式,其在推理过程中具备更好的效率。

GGUF 被设计用于 GGML 和基于 GGML 的执行器进行推理。使用如 PyTorch 等框架开发的模型可以被转换为 GGUF 格式以在这些引擎上使用。

GGUF 基于 GGJT 格式,对其进行一些更改,使其更具可拓展性和更易于使用,期望具备的功能:

GGUF 命名原则

GGUF 格式的命名约定为:<BaseName><SizeLabel><FineTune><Version><Encoding><Type><Shard>.gguf。其中每个组件,如果存在,则使用 - 进行分隔,易于直接获取模型的最重要细节。由于现有 gguf 文件名的多样性,所以并不一定完全可解析。

组件包括:

  1. BaseName:模型基础类型或架构的描述性名称。可以从 gguf 元数据中的 general.basename 中推导出来;

  2. SizeLabel:模型大小标签,表示为 <experCount>x<count><scale-prefix> 的参数权重类别(对排行榜是有用的);

    可从 gguf 元数据中的 general.size_label 中推导出来,或者在缺失时进行计算;

    在计算带单个字母比例前缀的小数点时四舍五入,以帮助显示以下浮点数指数:

    • Q :千万亿参数。

    • T :万亿参数。

    • B :十亿参数。

    • M :百万参数。

    • K :千个参数。

  3. FineTune:模型微调目的的描述性名称,如 ChatInstruct 等。同样可以从 gguf 元数据中的 general.finetune 中推导出来;

  4. Version(可选):表示模型版本号,格式为 v<Major>.<Minor>;如果模型缺失版本号,假定为 v1.0 意味着首次公开发布;同样可以从 gguf 元数据中的 general.version 中派生处理。

  5. Encoding:表示用于模型的权重编码方案;

  6. Type:表示 gguf 文件的种类及其预期用途;如果缺失,表示文件默认是典型的 gguf 张量模型文件,同样可以从 gguf 元数据中

    • LoRA:GGUF 文件是一个 LoRA 适配器;
    • vocab:仅包含词汇数据和元数据的 GGUF 文件;
  7. Shard 可选:表示模型已经被拆分为多个分片,格式为 <ShardNum>-of-<ShardTotal>.

    • ShardNum:此模型中的分片位置。必须是用零填充的 5 位数字。

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

    • ShardTotal:此模型中的分片总数。必须是用零填充的 5 位数字。

所有的模型文件应至少具备 BaseName、SizeLabel、Version 以便轻松验证其是否符合 gguf 命名规范。

可以使用如下正则表达式验证是否按照正确的顺序从模型名称中获得了最基本的信息:^(?<BaseName>[A-Za-z0-9\s]*(?:(?:-(?:(?:[A-Za-z\s][A-Za-z0-9\s]*)|(?:[0-9\s]*)))*))-(?:(?<SizeLabel>(?:\d+x)?(?:\d+\.)?\d+[A-Za-z](?:-[A-Za-z]+(\d+\.)?\d+[A-Za-z]+)?)(?:-(?<FineTune>[A-Za-z0-9\s-]+))?)?-(?:(?<Version>v\d+(?:\.\d+)*))(?:-(?<Encoding>(?!LoRA|vocab)[\w_]+))?(?:-(?<Type>LoRA|vocab))?(?:-(?<Shard>\d{5}-of-\d{5}))?\.gguf$

举例说明:

GGUF 文件结构

GGUF (GGUF v3)文件结构如下。使用在 general.alignment 字段中指定的全局对齐方式(不过,大部分模型似乎都没这个东西)。

image-20241106114401225

这里可看出 GGUF 模型文件表示了 GGUF 格式、版本、tensor 数量、元数据长度、具体的元数据信息与张量信息。

元数据(标准化键值对)

以下键值对已标准化。随着更多用例的发现,此列表可能会在未来增加。在可能的情况下,名称与原始模型定义共享,以便更容易在两者之间进行映射。

并非所有这些都是必需的,但都建议使用。必需的键用粗体表示。对于省略的对,读者应假定该值未知,并根据需要默认为默认值或错误。

社区可以开发自己的键值对来携带额外的数据。但是,这些应该使用相关社区名称进行命名空间,以避免冲突。例如, rustformers 社区可能会使用 rustformers. 作为其所有键的前缀。

按照惯例,除非另有说明,大多数计数/长度/等都是 uint64 。这是为了将来能够支持更大的模型。一些模型可能会使用 uint32 作为其值;建议读者同时支持这两种情况。

General

Required

General metadata

Source metadata

关于此模型来源的信息。这对于跟踪模型的出处以及在模型被修改时找到原始来源很有用。例如,对于从 GGML 转换而来的模型,这些键将指向转换前的模型。

通常不用特别关注。

LLM

[llm] 用于填写特定 LLM 架构的名称。例如, llama 表示 LLaMA, bert 表示 Bert 等。如果在架构部分中提到,则该架构需要,但并非所有键都适用于所有架构,具体需要参考相关部分以获取更多信息。

Attention

其余键值通常不会关注/较少关注,不再一一列出。

GGUF 转换

  1. hugging face space:https://huggingface.co/spaces/ggml-org/gguf-my-repo;
Previous
Is careful thinking the most effective method for enhancing LLMs?
Next
Reader-LM Small Language Models for Cleaning and Converting HTML to Markdown