Большинство бэкендов LocalAI оборачивают чужие движки — и это правильный дефолт. llama.cpp, vLLM, whisper.cpp, stable-diffusion, MLX поддерживают люди, которые разбираются в моделях лучше нас; обёртка стоит Dockerfile и gRPC-шима. Но восемнадцать бэкендов не оборачивают ничего: это порты на C и C++, написанные с нуля. Каждый появился потому, что обёртка над upstream-движком означала бы много гигабайт Python-установки, не переносимый стек только под CUDA или модель без C++-реализации.
Что дают порты? Один файл и предсказуемую память. Развернуть ggml-порт — скопировать shared library и GGUF. Самый наглядный пример — vllm.cpp, C++20-порт архитектуры V1 из vLLM: virtualenv у vLLM занимает 9.1 GiB, а бинарник vllm.cpp — 66 MiB. Движок делает то же самое: paged KV cache, continuous batching, prefix caching, scheduler и sampler, без Python, PyTorch и ggml. На NVIDIA GB10 с Qwen3.6-27B в NVFP4 vllm.cpp опережает vLLM на всех шести уровнях конкурентности, но по-честному это ничья: разница 0.7–1.7%, только single-stream (4.5%) вне шума. Токены совпадают один в один. Пиковая память — 24.88 GiB против 28.18 GiB. Против llama.cpp на CPU prefill быстрее в 1.18 раза, decode — паритет. Против MLX-LM на Apple M4 prefill на 1.5% быстрее, общая пропускная способность — 97.6%.
Иногда порт просто быстрее. depth-anything.cpp — порт Depth Anything 3 от ByteDance. На CPU он быстрее PyTorch: 1.31x скорости, 27% памяти, загрузка 40 мс вместо 749 мс. Причина не в matmul-ядрах, а в кэшировании позиционных эмбеддингов: они пересчитывались каждый forward скалярными циклами, кэш убрал ~95 мс. PyTorch строит их векторизованно и эту цену не платит. На GPU — паритет с cuDNN.
Паритет — ворота, скорость — следствие. face-detect.cpp и voice-detect.cpp заменили Python-бэкенды insightface и speaker-recognition. face-detect.cpp выполняет всю цепочку insightface buffalo (SCRFD, выравнивание, ArcFace) из одного GGUF: детекция совпадает до пикселя, косинус эмбеддинга — 1.000000. На CPU он медленнее onnxruntime, на GPU через cuDNN выходит на паритет. voice-detect.cpp — та же история: WeSpeaker-верификация пиково занимает 62 MB против 334 MB у Python-пути, в 5.4 раза меньше, вердикт и эмбеддинг идентичны. Для биометрии парность важнее скорости: эмбеддинг, отличающийся в четвёртом знаке, меняет решения на пороге.
Метод одинаковый: веса в GGUF, порт графа с поэтапной сверкой с эталоном (у depth-anything.cpp 37 ctest-кейсов, parakeet.cpp сверяет транскрипт с NeMo при WER 0), оптимизация с профайлером, затем плоский C ABI. LocalAI открывает shared library через purego и вызывает ABI напрямую — без subprocess и gRPC.
Плата — обслуживание. Каждый движок живёт в своём репозитории с CI, бенчмарками и конвертерами. GPU-ядра — слабое место: ggml отстаёт от cuDNN на свёрточных моделях. Портирование масштабируется не на всё: llama.cpp, vLLM, whisper.cpp, MLX, diffusers остаются обёртками — они большие, быстро двигаются и уже отличные. Свой движок пишут, когда нет C++-реализации, когда Python-зависимость тяжелее модели или когда нужного не существует. Бенчмарки и методология лежат в репозиториях, полный список — в таблице "Backends built by us" в README LocalAI.