GGUF
GGUF file format[править | править код]
GGUF |
- Расширение:
.gguf
- Сигнатура:
0x47
0x47
0x55
0x46
- Опубликован:
- август 22, 2023[1]
- Тип формата:
- Machine-learning tensors
GGUF (GGML Universal File) — двоичный формат файла, предназначенный для хранения переносимых моделей машинного обучения, предназначенных для использования в библиотеке GGML и совместимых с ней. Является обобщением предшествующих форматов GGML, GGMF, GGJT, заменяя их.
В настоящее время существуют следующие форматы файлов GGML для LLM:
- GGML (без версионирования): базовый формат без версионирования и выравнивания.
- GGMF (с версионированием): то же, что и GGML, но с версионированием. Существует только одна версия.
- GGJT выравнивает тензоры для использования с mmap. Версии v1, v2 и v3 идентичны, но последние используют другую схему квантования, несовместимую с предыдущими версиями.
- GGUF - последняя версия формата.
GGML в основном используется в примерах в ggml, тогда как GGJT используется в моделях llama.cpp.
Формат фокусируется на квантовании — процессе снижения точности весовых коэффициентов модели. Квантование модели может привести к уменьшению использования памяти и повышению скорости за счёт снижения точности модели[3][4].
GGUF поддерживает квантованные целочисленные типы данных с разрядностью от 2 до 8 бит[5], распространённые форматы данных с плавающей точкой, такие как float32, float16 и bfloat16; и квантование с разрядностью 1,56 бит[6].
Этот формат файла содержит информацию, необходимую для запуска языковой модели, подобной GPT, такую как словарь токенизатора, длина контекста, информация о тензоре и другие атрибуты[7] .
Внутреннее устройство[править | править код]
GGUF — это формат, основанный на существующем GGJT, но вносящий несколько изменений для большей расширяемости и удобства использования.
Важные особенности реализации:
- Развертывание в виде одного файла: модели легко распространяются и загружаются, не требуя дополнительных внешних файлов.
- Расширяемость: новые функции могут быть добавлены к исполнителям на основе GGML/новая информация может быть добавлена в модели GGUF без нарушения совместимости с существующими моделями.
- Совместимость с mmap: модели можно загружать с помощью mmap, что радикально ускоряет их использования.
- Простота использования: модели можно легко загружать и сохранять, используя небольшой объём кода, без необходимости использования внешних библиотек, независимо от используемого языка.
- Полная информация: вся информация, необходимая для загрузки модели, содержится в файле модели, и пользователю не требуется предоставлять дополнительную информацию.
Ключевым отличием GGJT от GGUF является использование структуры «ключ-значение» для гиперпараметров (теперь называемой метаданными), а не списка нетипизированных значений. Это позволяет добавлять новые метаданные без нарушения совместимости с существующими моделями и аннотировать модель дополнительной информацией, которая может быть полезна для вывода или идентификации модели.
Соглашение об именовании моделей[править | править код]
GGUF следует соглашению об именовании `<BaseName><SizeLabel><FineTune><Version><Encoding><Type><Shard>.gguf`, где каждый компонент разделяется символом `-`, если он присутствует.
В конечном счёте, это сделано для того, чтобы упростить для пользователей быстрый доступ к наиболее важным деталям модели.
В связи с разнообразием имён существующих файлов gguf, он не предназначен для идеального анализа в полевых условиях.
Компоненты:
- BaseName: Описательное имя базового типа или архитектуры модели. Его можно получить из метаданных gguf general.basename, заменив тире пробелами.
- SizeLabel: Весовой класс параметра[8], представленный как <expertCount>x<count><scale-prefix>. Его можно получить из метаданных gguf general.size_label, если они доступны, или рассчитать, если они отсутствуют. Поддерживается округлённая десятичная точка в счётчике с однобуквенным префиксом масштаба для упрощения возведения в степень с плавающей запятой, как показано ниже: Q: Квадриллион параметров. T: Триллион параметров. B: Миллиард параметров. M: Миллион параметров. K: Тысяча параметров. При необходимости можно добавить дополнительные <attributes><count><scale-prefix> для указания других интересующих вас атрибутов.
- FineTune: Описательное имя для цели тонкой настройки модели (например, Chat, Instruct и т. д.). - Его можно получить из метаданных gguf general.finetune, заменив тире пробелами.
- Version: (Необязательно) Обозначает номер версии модели в формате v<Major>.<Minor> Если у модели отсутствует номер версии, предполагается v1.0 (первый публичный выпуск). Эту информацию можно получить из метаданных gguf general.version
- Encoding: Указывает схему кодирования весов, примененную к модели. Содержание, сочетание типов и расположение определяются пользовательским кодом и могут меняться в зависимости от потребностей проекта.
- Type: Указывает тип файла gguf и его назначение. Если параметр отсутствует, то по умолчанию это типичный файл тензорной модели gguf. LoRA`: Файл GGUF является адаптером LoRA. vocab: Файл GGUF, содержащий только данные словаря и метаданные.
- Shard: (Необязательно) Указывает и обозначает, что модель разделена на несколько шардов, в формате <ShardNum>-of-<ShardTotal>. ShardNum: Позиция шарда в этой модели. Должна состоять из 5 цифр, дополненных нулями. Номер шарда всегда начинается с 00001 (например, первый шард всегда начинается с 00001-of-XXXXX, а не с 00000-of-XXXXX). ShardTotal: Общее количество сегментов в этой модели. Должно состоять из 5 цифр, дополненных нулями.
Как минимум, все файлы моделей должны иметь параметры BaseName, SizeLabel и Version, чтобы их можно было легко проверить на соответствие соглашению об именовании GGUF. Примером этой проблемы является то, что Encoding легко ошибочно принимается за FineTune, если Version не указана. Для проверки можно использовать регулярное выражение `^(?<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$` который проверит, что вы получили, как минимум, BaseName, SizeLabel и Version, представленные в правильном порядке.
Структура файла[править | править код]
Файлы GGUF структурированы показанным на иллюстрации образом. Они используют глобальное выравнивание, заданное в поле метаданных general.alignment, которое далее обозначается как ALIGNMENT.
При необходимости файл дополняется байтами `0x00` до следующего значения, кратного general.alignment. Поля, включая массивы, записываются последовательно без выравнивания, если не указано иное. По умолчанию модели имеют little-endian порядок байтов. Они также могут иметь big-endian порядок байтов для использования на компьютерах с таким порядком байтов; в этом случае все значения (включая значения метаданных и тензоры) также будут иметь big-endian порядок байтов На момент написания статьи не существует способа определить, имеет ли модель порядок байтов от младшего к старшему; это может быть исправлено в будущих версиях. Если дополнительная информация не предоставлена, предполагается, что модель имеет порядок байтов little-endian.
После 4 байт сигнатуры файла - строки GGUF, далее идут 4 байта версии файла, затем 8 байт (uint64) определяющие размер области key-value пар, содержащих метаданные, затем 8 байт (uint64) определяющие размер области, в которой хранятся тензоры.
Следом за ними идут области хранения метаданных и тензоров как таковые, остаток файла после области, занятой тензорами может быть использован для хранения дополнительной информации.
Метаданные[править | править код]
Следующие пары «ключ-значение» стандартизированы. Этот список может расширяться в будущем по мере обнаружения новых вариантов использования. По возможности, имена совпадают с исходными определениями модели, чтобы упростить сопоставление между ними. Не все из них обязательны, но все рекомендуются.
В случае пропущенных пар читатель должен считать значение неизвестным и использовать либо значение по умолчанию, либо ошибку.
Сообщество может разрабатывать собственные пары «ключ-значение» для хранения дополнительных данных. Однако они должны быть помещены в пространство имён с соответствующим именем сообщества, чтобы избежать коллизий. Например, сообщество rustformers может использовать rustformers. в качестве префикса для всех своих ключей. Если какой-либо ключ сообщества широко используется, он может быть повышен до стандартизированного ключа.
По соглашению, большинство значений счётчика/длины и т. д. имеют тип uint64, если не указано иное.
Это необходимо для поддержки более крупных моделей в будущем. Некоторые модели могут использовать uint32 для своих значений; читателям рекомендуется поддерживать оба варианта.
Обязательные:[править | править код]
general.architecture: string - архитектура модели. Описывает архитектуру, реализуемую этой моделью. Все символы ASCII в нижнем регистре, разрешены только символы [a-z0-9]+. Поддерживаемые значения (список будет расширен в будущих версиях): llama, mpt, gptneox, gptj, gpt2, bloom, falcon, mamba, rwkv,
Сравнение с другими форматами файлов машинного обучения[править | править код]
Ссылки[править | править код]
- Файл документации формата GGUF на Github с подробным описанием структур данных.
Примечания[править | править код]
- ↑ GGUF by ggerganov · Pull Request #2398 · ggerganov/llama.cpp (англ.). GitHub.
- ↑ ggml/docs/gguf.md at master · ggerganov/ggml (англ.). GitHub.
- ↑ Labonne, Maxime. Quantize Llama models with GGUF and llama.cpp (англ.). Medium. Towards Data Science (29 ноября 2023). Дата обращения: 9 мая 2024.
- ↑ Mucci, Tim. GGUF versus GGML (амер. англ.). www.ibm.com (3 июля 2024). Дата обращения: 26 июля 2024.
- ↑ Cabezas, Darío. Integrating a LLaMa-based Chatbot with Augmented Retrieval Generation as a Complementary Educational Tool for High School and College Students // Proceedings of the 19th International Conference on Software Technologies / Darío Cabezas, Rigoberto Fonseca-Delgado, Iván Reyes-Chacón … [и др.]. — 2024. — P. 395–402. — ISBN 978-989-758-706-1. — doi:10.5220/0012763000003753.
- ↑ Mann, Tobias. Honey, I shrunk the LLM! A beginner's guide to quantization – and testing it . theregister (14 июля 2024).
- ↑ Dong, Bo; Lin, Jun; Yu, Zhentao; Xu, Zhenzhong; Luo, Yu; Chang, Hanwen; Shen, Haihao (July 2024). "Accelerating GGUF Models with Transformers". The Parallel Universe (англ.). No. 57. Intel. pp. 28–33.
- ↑ Полезно для понимания сравнительных таблиц с разными моделями.