Многие пользуются YouTube, Netflix, но не подозревают о ключевых опенсорсных программах типа ffmpeg, которые работают на бэкенде этих сервисов. Похожая ситуация с нейронками, где многие знают программу Ollama для локального запуска моделей на CPU. Но мало кто понимает, что это всего лишь простенькая оболочка вокруг опенсорсной библиотеки llama.cpp на С, которая и делает инференс. Автор этой библиотеки, талантливый разработчик Георгий Герганов, мало известен широкой публике.

Энтузиасты LLM в курсе, что происходит. Судя по всему, разработчикам Ollama выгодно нравится, что все лавры достаются им. Однако возникают странные ситуации, когда после выхода новой модели Ollama твитит «Работаем над поддержкой», хотя они просто ждут обновления llama.cpp.

Наверное, Георгия Герганова забавит такое поведение «бизнесменов от опенсорса». Хотя он скромный болгарский хакер и ни с кем особо не конфликтует.

В чём претензии к Ollama

Недавно Meta объявила о поддержке мультимодальности в LLama, поблагодарив в официальном блоге своих «партнёров в сообществе ИИ», в том числе Ollama, даже не упомянув llama.cpp.

Или вот недавно VSCode добавил поддержку локальных моделей в чате GitHub Copilot, упомянув оболочку Ollama, а не движок llama.cpp, который реально выполняет работу:

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

Сама Ollama тоже не упоминает авторов программного кода llama.cpp, а вот это уже является нарушением лицензии MIT.

Помимо этого, в сообществе LLM-энтузиастов в принципе недовольны политикой Ollama, которая ради хайпа делает некорректные рекламные заявления, создавая у широкой публики завышенные ожидания, что «каждый может запустить полноценную модель ChatGPT на своём телефоне», хотя на самом деле локально на ПК и смартфонах запускаются только совсем маленькие модели — и инференс очень медленный.

В результате пользователи недовольны, а крайними остаются разработчики моделей и llama.cpp.

Ещё Ollama в некоторых случаях некорректно именует модели, так что неполноценный дистиллят LLaMA с менее 10 млрд весов именуется как «просто» LLaMA. Это основная часть претензий к Ollama, которая гонится за хайпом, хотя бэкенд пишут другие.

Есть и другие проблемы:

  • Ollama не вносит значительных улучшений обратно в родительский проект. Да, они не обязаны это делать, но в качестве благодарности было бы нормально, если б они помогли llama.cpp с поддержкой мультимодальных моделей и внедрением инструментов вроде SWA (Sliding-Window Attention), это метод оптимизации внимания в LLM, позволяющий эффективно обрабатывать длинные последовательности без чрезмерных затрат на вычисления. Но Ollama предпочитает оставлять эти достижения при себе. Выходит новая модель — они твитят «Работаем над этим» и ждут, когда Георгий Герганов внедрит поддержку этой модели. По крайней мере, раньше такое было неоднократно.

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

Достаточно вспомнить размер контекста по умолчанию 2048 токенов, что было абсолютно неприемлемо для большинства задач. Сейчас его увеличили до 4096 токенов.

Для сравнения, конкуренты из LM Studio предлагают более продуманные настройки для продвинутых пользователей. И вообще, при наличии прокси типа LiteLLM для доступа к облачным моделям и llama.cpp для локальных — необходимость в Ollama вообще отпадает. Непонятно, зачем вообще использовать Ollama, если с оригинальной библиотекой идёт приятный локальный сервер llamacpp-server.

В целом, Ollama форкает различные опенсорсные проекты и пытается закрывать эти форки в своей экосистеме. Например, транспортный протокол Ollama — это форк открытого контейнерного протокола OCI (Open Container Initiative), но изменённый для несовместимости с DockerHub и др.

Собственно, и llama.cpp они просто форкнули и используют в своих целях, без обратной связи.

llama.cpp

Изначально llama.cpp создавалась как библиотека для инференса модели LLaMA от Meta на чистом C/C++. Работу над ней Герганов начал в сентябре 2022 года, после создания похожей библиотеки whisper.cpp для инференса модели распознавания речи ASR Whisper от OpenAI.

Разработка велась параллельно проекту GGML — универсальной библиотеки тензорной алгебры на C. Георгий говорит, что создание GGML было вдохновлено библиотекой LibNC от Фабриса Беллара.

Цель проекта — запуск моделей на компьютерах без GPU или других специализированных карт. С помощью llama.cpp современные LLM запускаются на обычных ПК и смартфонах Android. Хотя изначально библиотека писалась для CPU, позже была добавлена поддержка GPU.

В марте 2024 года другая известная хакерша Джастин Танни выпустила новые оптимизированные ядра для умножения матриц для x86 и ARM CPU, улучшив производительность FP16 и 8-битных квантизированных типов данных.

В нейросетях с пониженной точностью значения параметров (весов, смещений, активаций) кодируются 8-битными целыми числами (или ниже). Это позволяет значительно сократить объём памяти и ускорить вычисления, особенно на устройствах с ограниченными ресурсами.

Иллюстрация концепции квантизации нейросетей на примере изменения глубины цвета в изображении
Иллюстрация концепции квантизации нейросетей на примере изменения глубины цвета в изображении

Эти улучшения были внесены в llama.cpp. Танни также написала инструмент llamafile, который объединяет модели и llama.cpp в один файл, работающий на любых ОС.

На уровне библиотеки тензоров GGML в llama.cpp поддерживаются несколько платформ, включая x86, ARM, CUDA, Metal, Vulkan (версии 1.2 или выше) и SYCL. Вместо квантизации на лету llama.cpp выполняет предварительную квантизацию моделей. Для оптимизации используются несколько расширенных наборов инструкций: AVX, AVX2 и AVX-512 для x86-64, а также Neon на ARM.

Бинарные файлы GGUF (GGML Universal File) хранят и тензоры, и метаданные. Формат спроектирован для быстрого сохранения и загрузки данных модели, он был представлен в августе 2023 года для лучшей обратной совместимости, когда реализовали поддержку новых моделей.

GGUF поддерживает квантизированные целочисленные типы от 2 до 8 бит, распространённые форматы данных с плавающей запятой, такие как float32, float16 и bfloat16, квантизацию на 1,56 бита.

Другие проекты Герганова

GGMorse
GGMorse
Waver
Waver

Это удобный способ передать файлы с одного мобильного устройства на другое, если они не могут установить цифровое соединение.

asciicast
asciicast

(https://asciinema.org/a/310405)

  • hnterm: просмотр Hacker News в консоли | исходники.

  • ImTui: библиотека непосредственного режима (immediate mode) в текстовом UI | исходники на C++. Она используется в текстовых клиентах для Slack, WTF и HN, которые указаны выше в этом списке проектов.

  • lottery-check: показывает, как часто выигрывали произвольные комбинации чисел в болгарской лотерее 6/49 | исходники.

  • Diff Challenge: игра Diff Challenge в виде баш-скрипта, смысл игры заключается в поиске программы y, которая изменяет программу x, а выдача y соответствует разнице между x и y:

$ ./y > diff
$ patch y < diff
$ cmp x y
$
  • typing-battles: многопользовательская игра, кто быстрее набирает на клавиатуре (сервер: C++/WebSockets, клиент: JS) | исходники.

  • keytap-challenge: угадай, какой текст набирается.

  • keytap: акустическая прослушка клавиатуры с предварительным обучением.

  • wave-gui: ещё один инструмент передачи данных с помощью звука | исходники.

  • wave-share: передача файлов с помощью звука через браузер | исходники.

© 2025 ООО «МТ ФИНАНС»

Комментарии (30)


  1. dpbm
    07.07.2025 12:52

    Интересно было примерить этот dot-to-ascii для наших схем, спасибо!
    https://habr.com/ru/companies/yoomoney/articles/830538/


  1. programania
    07.07.2025 12:52

    Исходный текст llama.cpp - 25 мб.
    И похоже Releases обновляется несколько раз каждый день уже года 2.
    За 11 минут компилируются в llama-server.exe+dll - 76 мб.
    Для python torch и пр. нужно около 5 гб. т.е. в 50 раз больше!
    При этом llama.cpp содержит web интерфейс и ещё кучу полезных программ.
    Почему такая разница?

    Для себя сделал интерфейс на Delphi к llama-server и whisper.cpp.
    При этом контроль намного больше, чем у прочих оболочек
    и можно сделать всё как мне нужно.

    А gguf - уже стал стандартом для локальных LLM и любая программа, которая его загружает, использует llama.cpp.


    1. Kromster80
      07.07.2025 12:52

      "Интерфейс на Delphi к llama-server и whisper.cpp." - можете рассказать поподробнее с какими целями и что получается?


      1. programania
        07.07.2025 12:52

        Для контроля вывода - IdHTTP с IdHTTP1ChunkReceived и "stream":true позволяет
        получать ответ по токенам и останавливать при повторах, числу предложений,
        максимальному размеру списка и т.п и говорить голосом по предложениям.

        Для автоматизации запросов: можно получить несколько ответов и выбрать лучший
        или автоматически формировать новые запросы из ответов или просто
        запрашивать "Продолжай мыслить и саморазвиваться." и сделать
        мышление LLM бесконечным.
        Для оценки моделей: выдать несколько запросов из списка и оценить ответы
        по наличию полезных для меня слов.

        Для контроля запроса: системный промпт + указанное число вопрос-ответ диалога + промпт + теги
        по шаблону. Причем диалог можно редактировать, отменять, повторять, запоминать, т.к. он в RichEdit и его можно подчищать, форматировать, раскрашивать.

        whisper.cpp реализовал, работает, но не использую - надо микрофон, наушники, клавишами удобнее.

        И ещё много идей пробовал и буду пробовать.
        Со своей программой этому ничто не мешает.


    1. 413x
      07.07.2025 12:52

      В опенсорс не выкладывали свой интерфейс?


      1. programania
        07.07.2025 12:52

        В опенсорс не выкладывал.
        Когда-нибудь выложу, но для этого нужно подчищать, писать справку.
        Там многие настройки прямо в программе - мне просто, а люди не поймут
        и много остатков реализаций моих идей, что усложнит понимание.
        Может просто как пример работы с llama-server из Delphi.


      1. alan008
        07.07.2025 12:52

        Есть уже мини-GUI на Delphi к LLM:

        https://github.com/gabr42/Chatterbox


  1. Gordon01
    07.07.2025 12:52

    В этом нет ничего удивительного. Людям нужен продукт.

    Что мешает автору llama.cpp упаковать свою библиотеку в красивую коробку, которая легко устанавливается и имеет удобный UI?

    Вопрос риторический, но ответ скорее всего: он этого сделать не может. Потому что не имеет продуктового мышления.

    А продуктовом мышление, способность не только прекратить свои идеи в рабочий код, а ещё и сделать так, чтобы код решал нужную людям проблему - искусство.

    Людям не нужна библиотека для инференса на ЦПУ или ГПУ, людям нужна программа чтобы запускать локально ЛЛМки. Ollama и LM toolbox решают эту проблему. llama.cpp - нет


    1. checkpoint
      07.07.2025 12:52

      Похоже что автор статьи "слышал звон". llama.cpp это давно уже не просто библиотека, а целая система с кучей плагинов и собственным Web сервером с поддерждкой различных API. Установка llama.cpp выглядить до боли тривиальна: cmake . && make install. Установка моделей полность автоматизирована, просто указываете название модели и он выкачивает её с Huggingface и запускает. Какое еще нужно продуктовое мышление ?

      $ git clone https://github.com/ggml-org/llama.cpp.git
      $ cmake .
      $ make && make install
      
      # далее
      
      $ llama-cli --help
      
      # Web сервер с чатом можно запустить вот так:
      
      $ llama-server -m $MODEL --host 1.2.3.4 --port 8080
      
      # далее подключаетесь Web браузером на 1.2.3.4:8080 и получаете
      # полноценный интерфейс к ИИ чат-боту

      И да, llama.cpp поддерживает FIM API позволяя подключать vim, vscode и прочие IDE.

      Мы держим свой локальный сервер на базе llama.cpp с моделями DeepSeek для чата и для FIM. Спасибо Георгию за то, что сделал инферренс моделей простым и доступным для старпёров умеющих в make.

      Что такое Ollama - понятия не имею. Очень похоже, что это еще одни паразиты из лагеря питонистов. В который раз убеждаюсь, что питонисты без поддержки сишников и плюсоводов ничего толком сделать не могут, только обертку красивую нарисовать и вперед - клянчить деньги инвесторов. На Hacker News таких добрая половина, а в составе YC - все 100% стартапов.


      1. iroln
        07.07.2025 12:52

        Установка llama.cpp выглядить до боли тривиальна: cmake . && make install

        Ага, тривиальна, если не лезть в CMakeLists и не смотреть какие опции там используются, что включено по умолчанию и какие там зависимости, какие оптимизации и т. д. Пакетные менеджеры существуют уже несколько десятков лет, а кто-то до сих пор считает, что cmake . && make install - это нормальный способ установки пользовательского ПО в операционной системе. Может хватит уже? Шутка надоела.

        А с pre-built у них так себе, не каждый захочет пользоваться nix.


        1. p07a1330
          07.07.2025 12:52

          , если не лезть в CMakeLists и не смотреть какие опции там используются

          А зачем?
          Или вы когда условный npm i запускаете - тоже все дерево зависимостей отсматриваете?


          1. iroln
            07.07.2025 12:52

            Ну хотя бы затем, чтобы понимать, что там вообще происходит, потому что в cmake конфиг можно напихать всё что угодно и install-цели можно тоже определить как угодно.

            npm не запускаю, но дерево зависимостей пакетов смотрю. Хорошая привычка, я считаю. Это вообще давно проблема - распухающие зависимости.


          1. Uporoty
            07.07.2025 12:52

            А зачем?Или вы когда условный npm i запускаете - тоже все дерево зависимостей отсматриваете?

            npm (без опции -g) ставит все пакеты в локальную папку, а make install без должного контроля легко устраивает срач в системе, который потом еще и не вычистить так просто.


        1. hogstaberg
          07.07.2025 12:52

          это нормальный способ установки пользовательского ПО в операционной системе

          В случае комплексного, не всем нужного ПО, которое нередко требуется собрать под свои личные нужды - да, cmake + make + закатать в свой собственный пакет - это абсолютно нормальный способ.


          1. iroln
            07.07.2025 12:52

            `make install` ненормальный способ, потому что пока ты не залезешь в конфигурацию cmake или в сгенерированный makefile и не посмотришь как прописаны install-цели, ты вообще не знаешь, что он сделает и куда распихает весь хлам.

            Сборка под свои личные нужды - это вообще отдельный случай, и там как раз придется лезть в cmake конфиг и разбираться с опциями сборки. Это вообще не способ установки ПО в систему.


          1. Uporoty
            07.07.2025 12:52

            закатать в свой собственный пакет

            так выше речь идет как раз не про закатывание в пакет, а про тупо install скриптом глобально в систему.


      1. turbotankist
        07.07.2025 12:52

        Go-шники.

        Ну нормальная тулза - запустить ллм, если ты не хочешь вообще ничем заморачиваться. Как продукт они, конечно, обычному пользователю тоже не упали.


  1. EugeneH
    07.07.2025 12:52

    Никогда не пользовался Ollama. Это такой же полуфабрикат как и llama.cpp, только еще и скачает непонятно что непонятно откуда за тебя.

    Долгое время хватало llama.cpp-python и своих надстроек для RAG и других вещей. Потом стало интересно экспериментировать с activation steering, выбором из словаря, и прочим, что не было на тот момент реализовано в llama.cpp. В итоге перекатился на hugging face transformers, хоть она и не позволяет разбивать веса между GPU и СPU (по крайней мере я не знаю как).


  1. checkpoint
    07.07.2025 12:52

    Я думал, что Георгий Герганов наш соотечественник, оказывается - потомственный болгагин. :-)


    1. Wesha
      07.07.2025 12:52

      Хотите сказать, что Киркоров Вас ничему не научил?


      1. checkpoint
        07.07.2025 12:52

        А это, постите, кто ?


        1. Wesha
          07.07.2025 12:52

          А это, постите, кто ?

          Филипп Бедросович!


      1. BadNickname
        07.07.2025 12:52

        Но ведь он не болгарин, а армянин.


        1. nerfur
          07.07.2025 12:52

          румын же!


  1. andreishe
    07.07.2025 12:52

    библиотеки llama.cpp на С

    Чувствую нестыковку я.


    1. venanen
      07.07.2025 12:52

      Си-просто-просто. Одним словом, дважды простой Си, получается /s


  1. maxcat
    07.07.2025 12:52

    >в llama.cpp поддерживаются несколько платформ, включая x86, ARM, CUDA, Metal, Vulkan (версии 1.2 или выше) и SYCL

    Даже какие-то ограниченные вендором metal и cuda есть, а единственно верного Dx нет что-ли?


  1. Shushpancheak
    07.07.2025 12:52

    iSWA (Integrated Service Workload Analyzer), который представляет аналитику о рабочей нагрузке

    Нет, это Interleaved Sliding Window Attention, он уменьшает размер kv-кэшей для длинных контекстов


  1. Wesha
    07.07.2025 12:52

    Попробовал этот "звуковой кейлоггер" — полная буйня на постном масле. Не говоря уж о том, что прямо в документации сказано, что рассчитан только на английский язык — так ещё и, судя по всему, на тех, кто сидит в звукоизолированной комнате, никогда при печати не затыкается и не делает опечаток.


    1. BadNickname
      07.07.2025 12:52

      Вы всегда можете помочь и собрать больше данных для датасета для дообучения.