Перейти к содержанию
Публикация AiManual

llama.cpp в macOS: почему menu bar app не видит GGUF-файлы и как это обойти

Пользователь llama.app обнаружил, что скачанные через UI модели лежат не как GGUF, а в виде хешированных блобов в стиле Ollama, и вручную добавленный файл интер

Коротко

Что будет в материале

  1. 01

    Что происходит: приложение сохраняет модели не как GGUF

  2. 02

    Как llama.app хранит модели: хешированные блобы в стиле Ollama

  3. 03

    Можно ли подсунуть приложению свой GGUF

  4. 04

    Альтернативы запуска llama.cpp на macOS

Что происходит: приложение сохраняет модели не как GGUF

Пользователь macOS menu bar приложения для llama.cpp, которое распространяется как llama.app, описал два связанных наблюдения. Первое: скачивание модели через UI заканчивается не появлением файла с расширением .gguf, а хешированием в стиле Ollama. Второе: если положить GGUF в папку моделей вручную, ни menu bar UI, ни веб-интерфейс его не распознают (обсуждение в r/LocalLLaMA).

Короткий ответ на главный вопрос: интерфейс показывает то, что приложение само занесло в свой внутренний каталог. Файловая система для него вторична, поэтому копирование файла в папку моделей ничего не меняет.

Дальше важная оговорка. Это единичный опыт одного пользователя, а не официальная документация llama.cpp или llama.app. В исходном сообщении нет ни версии приложения, ни списка скачанных моделей, ни точного расположения блобов. Все выводы ниже опираются на описанное поведение и общие свойства llama.cpp, а не на результаты замеров.

Почему ручной GGUF не появляется в списке моделей

Механика, которая лучше всего объясняет описанное поведение, выглядит так. При скачивании приложение считает хеш загруженных данных, раскладывает их по внутреннему хранилищу и создаёт запись в своём индексе или манифесте: имя модели, ссылки на фрагменты, возможно, метаданные кванта. Список моделей и в строке меню, и в веб-интерфейсе строится по этому индексу.

Ручное копирование GGUF в папку моделей не добавляет ничего в индекс. Получается ситуация, когда файл на диске есть, а записи о нём нет, и обе панели показывают прежний список. Ошибки в самом файле тут нет: тот же GGUF, переданный в llama.cpp напрямую, читается штатно.

Эту схему логично считать наиболее вероятным объяснением, а не подтверждённым фактом. Автор сообщения внутреннее устройство приложения не разбирал. Не исключены и другие причины, например сверка модели с контрольной суммой, которую ожидает увидеть приложение.

Как llama.app хранит модели: хешированные блобы в стиле Ollama

Ключ к описанному поведению во втором наблюдении пользователя:

When you use the UI to download a model, it seems to do an Ollama-esque hashing instead of just saving the GGUF (источник).

В Ollama модели действительно не лежат отдельными .gguf-файлами. Каждый слой сохраняется под именем из хеша (SHA256) в каталоге блобов, а манифест связывает набор слоёв с тегом модели. В стандартной установке это ~/.ollama/models с подпапками blobs и manifests. Переименование блоба в model.gguf ничего не даёт: манифест ссылается на конкретные хеши, и без пересчёта связей модель не соберётся.

По сообщению пользователя, llama.app повторяет этот принцип. Точное расположение скачанных блобов в исходном опыте не указано, формат не раскрыт. Конкретный путь приводить нельзя, его можно только искать самостоятельно: типичные места для macOS это ~/Library/Application Support или каталог, куда установлено приложение. Это догадка о распространённых местах хранения, а не подтверждённый адрес.

Чем это отличается от классического GGUF

Классический GGUF - один файл. Квантованная модель упакована в него целиком вместе с метаданными: архитектурой, числом слоёв, размером контекста, типом квантования. Такой файл можно скопировать на внешний диск, передать коллеге, положить в любую папку и указать путь в llama.cpp: ./llama-cli -m /path/model.gguf. Больше инструменту ничего знать не нужно.

Внутреннее хранилище llama.app устроено иначе. Фрагменты существуют для приложения и его индекса, а не как самостоятельные единицы. Хеш выступает именем файла, а человекочитаемое название модели живёт в манифесте. Отсюда следствие: разорвать связь между файлом и приложением простым копированием нельзя.

СвойствоКлассический GGUFХранилище llama.app по описанному опыту
Имя файлаПонятное, например qwen2.5-7b-q4_k_m.ggufХеш или набор фрагментов
Перенос на другой дискКопированием одного файлаБез индекса приложения смысла не имеет
Использование в других инструментахПуть через -m в llama.cppНе подтверждено
Удаление моделиУдалить файлНужно понимать, какие фрагменты относятся к модели
Проверка версии и квантаВидно в имени и метаданных файлаЗависит от интерфейса приложения

Какие неудобства это создаёт на практике

  • Модель сложно передать другому человеку: копирование файла не работает, нужна повторная загрузка на его стороне.
  • Освобождать место на диске неудобно: непонятно, какой объём занимает конкретная модель и какие фрагменты можно удалить безопасно.
  • Ту же модель в другом приложении придётся скачивать заново, потому что готового GGUF на диске нет.
  • Проверить, какой именно квант и какая ревизия модели лежат внутри, без интерфейса приложения трудно.
  • Скрипты и автоматизация, которые привыкли работать с путём к .gguf-файлу, с таким хранилищем не стыкуются.

Это не приговор подходу. Хеширование даёт дедупликацию фрагментов и предсказуемость загрузок. Цена такой предсказуемости - потеря прямого контроля над файлами.

Можно ли подсунуть приложению свой GGUF

Честный ответ: в описанном опыте ручное добавление GGUF в папку моделей не сработало. Ни menu bar UI, ни веб-интерфейс модель не увидели, и подтверждённого способа обойти это штатными средствами в исходном сообщении нет. Придумывать рабочий рецепт без проверки не стоит: слишком легко выдать желаемое за действительное.

Отдельно стоит сказать, что вопрос «можно ли подсунуть приложению собственный GGUF» в источнике не поднимался. Автор сообщения такого эксперимента не описывал, результат неизвестен.

Что можно попробовать, но без гарантий

Если хочется проверить самостоятельно, разумно начать с наименее рискованных шагов:

  1. Перезапустить приложение и посмотреть, не появится ли модель в списке после повторного сканирования папки.
  2. Поискать в настройках пункт ручного добавления или импорта модели, а также упоминание папки моделей, которую приложение отслеживает.
  3. Проверить, не создаёт ли приложение рядом с блобами манифест или индекс, который можно дополнить.
  4. Уточнить путь к хранилищу в документации проекта или в его репозитории, если она там описана.

Правка внутренних файлов приложения может привести к нестабильной работе или потере скачанных моделей. Копию данных перед такими опытами делать обязательно. Ни один из перечисленных шагов в описанном случае не подтверждён как рабочий.

Альтернативы запуска llama.cpp на macOS

Ограничения хранилища llama.app не мешают пользоваться самой библиотекой llama.cpp. Она работает с обычными GGUF-файлами и не требует ни хеширования, ни манифестов. Официальное приложение с иконкой в строке меню и командой llama serve описано в разборе релиза llama.app, и его стоит воспринимать как один из вариантов запуска, а не единственный.

Запуск llama.cpp напрямую из терминала

Самый прямой обход внутреннего хранилища: собрать или скачать llama.cpp и запускать модель из командной строки.

./llama-cli -m ~/models/qwen2.5-7b-q4_k_m.gguf -p "Кратко объясни, что такое квантование"

Путь указывает на ваш файл, и приложение про него знать ничего не должно. Для инференса на сервере подойдёт llama-server с OpenAI-совместимым API. На Apple Silicon важна сборка с поддержкой Metal, иначе вычисления пойдут на CPU и скорость упадёт. Как собрать llama-cli, как выбрать квант (Q4_0, Q4_K_M, Q5_K_M, Q8_0) под объём памяти и где CPU-инференс упирается в ограничения, подробно разобрано в материале про llama.cpp на обычном железе.

Плюс этого пути в полном контроле: файлы лежат там, где вы их положили, их можно копировать, версионировать и подключать к любому количеству инструментов. Минус в том, что интерфейса нет: управлять моделями придётся через терминал или свои скрипты.

Другие оболочки и инструменты

GUI-надстройки над llama.cpp существуют, и логику их работы полезно проверять до установки. Критерий простой: понимает ли инструмент прямой путь к .gguf-файлу и не требует ли обязательного импорта в собственное хранилище.

Показательный пример такого подхода - LLaMA.cpp Windows Manager, где профили запуска ссылаются на GGUF-файлы, а модели можно переключать из визуального интерфейса. Важная оговорка: это решение для Windows, на macOS оно не заменяет llama.app. Речь о принципе: визуальное управление и прямое хранение GGUF совместимы, если так задумано автором инструмента. Конкретные macOS-оболочки в исходном опыте не упоминались, поэтому называть работающие альтернативы по именам без проверки не стоит.

Ещё один способ не зависеть от чужой логики: держать модели в отдельной папке на внешнем SSD и подключать их к llama.cpp, а приложение использовать только как пульт для запуска сервера.

Стоит ли использовать llama.app, если вы привыкли к GGUF

Решение зависит от того, насколько для вас важен контроль над файлами.

Menu bar приложение подойдёт, если вы хотите минимум действий: скачал модель из встроенного списка, получил иконку в строке меню и работающий API без ручной настройки флагов. Тогда внутреннее хранилище и хеширование остаются деталью реализации, которая вас не касается.

Привычный к GGUF подход выигрывает, если модели нужно переносить между машинами, хранить на внешнем диске, подключать к нескольким инструментам сразу или отдавать коллегам. Здесь важны проверяемые имена файлов и путь, который вы задаёте сами. В описанном опыте llama.app такие сценарии не поддерживает: ручной GGUF в папке моделей остаётся невидимым для интерфейса.

Практичный компромисс выглядит так: скачивайте модели как обычные GGUF-файлы, храните их в отдельном каталоге со понятной структурой и указывайте путь через -m в llama.cpp, а menu bar приложение держите для быстрого доступа к серверу. Так вы не привязываетесь к внутреннему формату хранения и в любой момент можете сменить инструмент без повторной загрузки десятков гигабайт.

Подписаться на канал