Hugging Face Transformers добавила поддержку GGUF-квантов llama.cpp

Hugging Face Transformers добавила поддержку GGUF-квантов llama.cpp

Hugging Face добавила в свою библиотеку transformers прямую поддержку формата GGUF, того самого, в котором llama.cpp раздаёт квантованные модели для локального запуска. Раньше формат был вотчиной отдельных инструментов вроде Ollama, LM Studio и Jan, построенных поверх движка llama.cpp; теперь GGUF-чекпоинт можно загрузить обычным from_pretrained прямо в transformers, без конвертации. GGUF-чекпоинты на Hugging Face Hub суммарно скачивали миллионы раз, их публикуют как сама команда llama.cpp (аккаунт ggml-org), так и сторонние издатели, Unsloth, LM Studio Community, bartowski.

Файл GGUF хранит веса модели и метаданные, токенизатор, при необходимости шаблон чата, в одном файле и поддерживает разные уровни квантования. Например, вариант Q4_K_M смешивает точность тензоров: большинство весов хранится в 4 битах, а чувствительные тензоры, точнее. В Hugging Face советуют начинать с Q4_K_M, а если памяти хватает, пробовать Q5_K_M или Q6_K; чем агрессивнее квантование, тем компактнее модель, но потеря качества зависит от конкретной модели и задачи, и её стоит проверять на своих сценариях.

Чтобы запуск через transformers был не просто совместимым, но и быстрым, команда переиспользует ggml-ядра самого llama.cpp через библиотеку kernels: они собраны под Metal и распространяются через Hub. Если совместимое ядро удаётся получить, transformers автоматически использует ggml/Metal-ядра и реализацию внимания ggml-org/ggml-attn; если нет, откатывается на более медленную реализацию "sdpa" с предупреждением (это же можно задать явно). Если не подходит и ядро квантования, загрузчик деквантует модель целиком, что требует больше памяти. Пока фокус, локальный инференс на Apple Silicon, и первой поддержанной архитектурой стала Qwen3.5.

Запуск занимает несколько строк: устанавливается transformers из главной ветки на GitHub (в стабильный релиз изменения ещё не попали) вместе с библиотекой kernels, а затем в AutoModelForCausalLM.from_pretrained передаются id репозитория на Hub и имя GGUF-файла, дальше используется стандартный API transformers. Тот же чекпоинт можно раздать через transformers serve, который поднимает OpenAI-совместимый API; в аргументе указываются репозиторий и файл через двоеточие, например unsloth/Qwen3.5-4B-GGUF:Qwen3.5-4B-Q4_K_M.gguf. К такому серверу можно подключить клиенты вроде Jan или Pi как обычного OpenAI-совместимого провайдера, сам transformers исполняет модель на Mac, а клиент отвечает только за интерфейс диалога.

В Hugging Face сравнили производительность на трёх чекпоинтах, небольшой плотной модели, более крупной плотной модели и модели типа mixture-of-experts, на MacBook Pro M2 Max с 32 ГБ памяти (macOS 26.6, PyTorch 2.12.1, kernels 0.17.0). Показатели llama.cpp сняты утилитой llama-bench (сборка 5f55650a7, релиз b10200, Metal-бэкенд ggml 0.18.0), это скорость генерации 128 токенов без учёта обработки промпта, усреднённая по трём повторам. Для transformers измеряли, за сколько generate выдаёт те же 128 токенов из 12-токенного промпта, включая обработку промпта, лучший результат из трёх прогретых запусков. В компании прямо оговаривают, что условия не идентичны: их замер учитывает обработку промпта, а llama-bench, нет. По итогам transformers показывает результаты, близкие к llama.cpp на всех трёх чекпоинтах, но точную величину отставания в процентах или разах в материале не приводят.

В Hugging Face подчёркивают, что llama.cpp остаётся их рекомендованным движком там, где важна именно эффективность локального инференса, у него для этого выделенный рантайм, управление памятью и широкая поддержка железа. Смысл интеграции, дать разработчикам возможность работать с теми же GGUF-чекпоинтами внутри привычного Python и PyTorch: инспектировать промежуточные активации через хуки, менять forward-проход модели, прогонять уже существующие в transformers процедуры оценки качества на квантованных чекпоинтах, сверять GGUF-конвертацию с оригинальными весами, пробовать собственные схемы декодирования или писать свой цикл генерации, а также дообучать модель, предварительно деквантовав веса через GgufConfig(dequantize=True).

Задача шире одного формата: в Hugging Face хотят перенести ggml-ядра и на архитектуры, которые llama.cpp не поддерживает, ядро работает с тензорами и не требует полной реализации модели в llama.cpp. По их словам, это особенно полезно для новых и исследовательских архитектур, а также открывает путь к другим модальностям, моделям компьютерного зрения, аудио и мультимодальным моделям, которые могли бы переиспользовать те же ядра внимания, нормализации и матричного умножения. Пока, впрочем, готовые примеры касаются только генерации текста, под каждую новую архитектуру и модальность интеграцию и проверку придётся делать отдельно.

Ключевые факты

  • Transformers от Hugging Face теперь загружает GGUF-чекпоинты llama.cpp напрямую через from_pretrained, без конвертации; GGUF-модели на Hub скачивали в сумме миллионы раз
  • Для скорости используются те же Metal-ядра ggml, что в llama.cpp, через библиотеку kernels; фокус пока только на Apple Silicon и архитектуре Qwen3.5
  • Поддерживаются уровни квантования вроде Q4_K_M (в основном 4 бита с более точными чувствительными тензорами); рекомендуют стартовать с Q4_K_M и пробовать Q5_K_M/Q6_K при запасе памяти
  • GGUF-модель можно также раздать через transformers serve с OpenAI-совместимым API и подключить клиентов вроде Jan или Pi
  • На трёх тестовых чекпоинтах на MacBook Pro M2 Max transformers показал результаты, близкие к llama.cpp, но точную разницу в процентах компания не приводит

Почему это важно

Локальный запуск моделей на своём железе давно завязан на llama.cpp, на нём построены Ollama, LM Studio, Jan и сам формат GGUF, который на Hugging Face Hub скачивали миллионы раз. Но это отдельный рантайм со своим API, а не привычная Python-экосистема PyTorch. Новая интеграция закрывает этот разрыв: тот же GGUF-чекпоинт теперь загружается прямо в transformers через from_pretrained, а по производительности, как утверждают в Hugging Face, приближается к специализированному движку llama.cpp благодаря переиспользованию его же ggml-ядер.

Кому это важно

В первую очередь, разработчикам и исследователям, которые хотят работать с уже готовыми GGUF-квантами внутри Python и PyTorch: инспектировать активации через хуки, менять forward-проход, гонять существующие в transformers процедуры оценки качества на квантованных весах, сверять корректность GGUF-конвертации с оригинальной моделью или дообучать модель, предварительно её деквантовав. Также это полезно тем, кто просто хочет запускать модели локально на Mac с Apple Silicon и раздавать их через OpenAI-совместимый API transformers serve, не разворачивая отдельно llama.cpp.

Как это применить

Нужен Mac на Apple Silicon и transformers из главной ветки на GitHub (pip install -U "git+https://github.com/huggingface/transformers.git" kernels), в стабильный релиз изменения пока не попали. Модель загружается вызовом AutoModelForCausalLM.from_pretrained с id репозитория на Hub и именем GGUF-файла в параметре gguf_file, дальше используется обычный API transformers. Для раздачи через сеть служит команда transformers serve с аргументом вида <репозиторий>:<файл>.gguf, она поднимает OpenAI-совместимый сервер, к которому можно подключить клиент вроде Jan или Pi. Квантование стоит выбирать по памяти: начинать с Q4_K_M, при наличии ресурса пробовать Q5_K_M или Q6_K, качество на своей задаче проверять самостоятельно.

Можно ли доверять

Методика сравнения описана подробно, конкретная модель Mac и объём памяти, версии macOS, PyTorch и библиотеки kernels, точная сборка утилиты llama-bench и версия backend-а ggml, число повторов и длина промпта. В компании честно оговаривают ограничение сравнения: их замер для transformers включает обработку промпта, а llama-bench, которым мерили llama.cpp, нет, то есть условия не полностью идентичны. По итогу заявлено лишь, что результаты transformers «близки» к llama.cpp на всех трёх протестированных чекпоинтах, точной цифры отставания в процентах или разах Hugging Face не приводит, и додумывать её не стоит.

Риски и подводные камни

Поддержка пока ограничена Apple Silicon, про Windows, Linux или GPU других производителей в материале ничего не сказано. Нужна свежая сборка transformers из главной ветки на GitHub и совместимая версия PyTorch (обычно два последних релиза), релизная версия или дата появления этой возможности в обычном pip-пакете не названы. Если подходящее ggml/Metal-ядро не удаётся получить, модель откатывается на более медленную реализацию внимания "sdpa"; а если недоступно и ядро квантования, загрузчик полностью деквантует модель, что требует заметно больше памяти.

«Вот где мы сейчас находимся. И, если честно, ощущается это почти волшебно»

— Жюльен Шомон (@julien_c), из поста в X о запуске модели через Llama.cpp на MacBook Pro