AI и DIY,  Статьи

Компиляция и работа с llama.cpp для GPU Nvidia в linux

Запуск серьезных AI-моделей на своем оборудовании требует большого количества быстродействующей памяти и высокой производительности большинства компонентов компьютера. Использование наиболее эффективных программ может значительно увеличить скорость вычислений при работе с искусственным интеллектом. Самостоятельная сборка пакета программ llama.cpp позволит получить максимальную отдачу от своего оборудования, используя новейшие программнные модули, библиотеки и флаги оптимизации. Для этого очень хорошо подходит операционная система gentoo, в которой все модули по умолчанию компилируются под конкретное железо.

Например, в lmstudio нет совместимой c cuda12 версии runtime для видеокарт старее compute capability 7.5, хотя адаптеры поколений Maxwell, Pascal и Volta могут полноценно работать с CUDA Runtime 12.x. По состоянию на середину апреля 2026 года со старыми графическими ускорителями Nvidia в lmstudio можно работать с помощью llama.cpp 2.12.0, либо Vulkan llam.cpp (медленее для nvidia):

С такими модулями в linux обеспечивается одновременная работа с видеокартами разных архитектур, например, Nvidia Tesla V100 16GB плюс две Nvidia Ge Force GTX 1070 8GB с Intel-встройкой для вывода изображения на монитор (о настройке linux для работы в такой конфигурации можно прочитать в статье «Настройка xorg.conf в linux для гибридной графики и headless-видеокарт»):

К сожалению, для старых видеокарт (таких, как Nvidia Tesla V100 и Nvidia GeForce 1070) в lmstudio невозможно активировать более производительную cuda12-engine.

Теоретически они могут полноценно работать с последней версией CUDA Toolkit двенадцатого поколения (релиз 12.91). Для этого нужно использовать программы с открытым исходным кодом, например, пакет программ llama.cpp. Это окружение можно скомпилировать, используя самый практически любой cuda runtime и оптимизации под свое железо.

llama.cpp — это LLM inference окружение с открытым исходным кодом (исходный код доступен на github в репозитории ggml-org/llama.cpp), написанное преимущественно на C/C++ , предназначенное для работы с gguf-моделями искусственного интеллекта.

Над развитием llama.cpp работает множество хорошо подготовленных программистов из сообщества ggml-org, поэтому новые, улучшенные версии этой программы появляются очень часто:

Благодаря llama.cpp можно добиться максимально возможной отдачи от своего оборудования, поэтому стоит уделить внимание этому продукту.

В ОС gentoo перед сборкой llama.cpp нужно соответствующим образом подготовить окружение — установить драйвера видеокарт и программный инструментарий. Для компьютера со старыми видеокартами nvidia плюс интегрированная intel в файле /etc/portage/make.conf нужно добавить строки

VIDEO_CARDS="intel nvidia"
NVCCFLAGS="-Wno-deprecated-gpu-targets" 

Для видеокарт Nvidia Pascal и Tesla должен быть установлен cuda toolkit версии 12.9.1-r1 (поддерживает архитектуры nvidia ):

  sudo emerge --ask dev-util/nvidia-cuda-toolkit

Установка cuda toolkit занимает довольно продолжительное время, так как только загрузка локального установщика nvidia cuda toolkit (несколько гигабайт) в каталог /var/cache/distfiles/ (для gentoo) занимает несколько минут:

При инсталляции пакета dev-util/nvidia-cuda-toolkit в gentoo автоматически подтянется совместимый с этой версией cuda runtime компилятор, для версии 12.9 — это gcc 14.

Проверить успешность установки cuda runtime можно командой

  nvcc --version

Пример вывода информации об установке пакета cuda_12.9.r12.9 (Nvidia CUDA Toolkit 12.9 Update 1):

nvcc: NVIDIA (R) Cuda compiler driver

Copyright (c) 2005-2025 NVIDIA Corporation

Built on Tue_May_27_02:21:03_PDT_2025

Cuda compilation tools, release 12.9, V12.9.86

Build cuda_12.9.r12.9/compiler.36037853_0

После этого можно собирать llama.cpp с поддержкой нужных Compute Capability.

Для этого можно использовать команды:

  git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp

  mkdir build && cd build

Для компиляции программы только для видеокарт Nvidia с архитектурой 61 (Pascal), 70 (Volta) используем команды:

  cmake .. -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="61;70"

  cmake --build . --config Release -j$(nproc)

В каталоге /llama.cpp/build/bin появится папка с бинарными файлами llama.cpp:

Ее можно переименовать и скопировать в другое место, а каталог с исходниками удалить.

Как работать с llama.cpp?

Для работы с llama.cpp можно использовать любой браузер, в котором нужно открыть страничку с адресом llama-server (например, 127.0.0.1:8080), либо запустить программу-оболочку с более удобным интерфейсом, например, KoboldCPP или Oobabooga.

Запуск AI-модели осуществляется из папки с бинарниками llama.cpp командой вида:

  ./llama-server -m /путь/модель.gguf --host 127.0.0.1 --port 8080 -c 2048 -ngl -1 -t 2

Эта команда запускает сервер llama.cpp, который позволяет общаться с AI GGUF-моделью через локальный API-сервер с настраиваемым адресом.

В усложненном варианте, для компьютера с несколькими видеокартами и дополнительными аргументами:

  ./llama-server -m /путь/модель.gguf --host 127.0.0.1 --port 8080 -c 11264 -ngl -1 -t 6 --flash-attn auto --tensor-split 3,1,1 --cache-type-k q4_0 --cache-type-v q4_0 -b 512 -ub 512 --temp 0.80

В команде запуска llama.cpp используются следующие аргументы:

  -m /путь/модель.gguf — путь к файлу модели искусственного интеллекта в формате GGUF. 
  --host 127.0.0.1 — сетевой адрес сервера llama. Если заменить значение аргумента host на 0.0.0.0, он станет доступным для всех устройств в локальной сети.
  --port 8080 — TCP-порт сервера llama.cpp.
  -c 11264 — глубина контекста (максимальное количество токенов (эквивалент слов/символов), которые модель может «удержать в памяти» одновременно). Здесь устанавливается максимальное количество токенов, которые модель может «удерживать в памяти» за один раз, включая запрос (prompt) и ответ. Если поставить слишком маленькое число, модель очень быстро «забудет» начало длинного разговора или не сможет обработать большой текст, неожиданно оборвав свой ответ. Чем больше значение аргумента -c, тем больше памяти (RAM+VRAM) потребуется для работы KV-кэша.
  -ngl -1 — количество слоев нейросети, которые переносятся на GPU. Значение -1 означает «перенести все возможные слои на GPU», что максимально ускоряет генерацию текста.
  -t 6 — количество потоков процессора, используемых для вычислений llama.
  --flash-attn auto — механизм автоматической оптимизации алгоритма внимания AI-модели, который значительно снижает загрузки памяти и ускоряет генерацию.
  --tensor-split 3,1,1 — распределение нагрузки между памятью нескольких видеокарт:

tensor-split нужно использовать, только если на компьютере используется несколько видеокарт.

   --cache-type-k q4_0 и --cache-type-v q4_0 — квантование кэша ключей (K-cache и V-cache) до 4 бит. Вместо стандартного типа данных используется сжатие для экономии VRAM, позволяя использовать больший контекст с минимальной потерей качества.
  -b 512 — параметр обработки батчей, определяющий, сколько токенов модель обрабатывает за один раз при чтении промпта.
  -ub 512 — физический размер порции данных, которая реально отправляется на вычисления за один такт.

--temp 0.80 — генератор степени случайности ответа AI-модели.

Для упрощения работы с llama можно создать свой скрипт запуска для каждой выбранной AI-модели, а также указать параметры разгона и скорости вращения вентиляторов видеокарт, например:

#!/bin/sh
export GPU_MAX_HEAP_SIZE=100 
export GPU_MAX_USE_SYNC_OBJECTS=1 
export GPU_SINGLE_ALLOC_PERCENT=100 
export GPU_MAX_ALLOC_PERCENT=100 
export GPU_MAX_SINGLE_ALLOC_PERCENT=100 
export GPU_ENABLE_LARGE_ALLOCATION=100 
sudo nvidia-smi -pm 1
sudo nvidia-smi -i 0 -pl 100 
sudo nvidia-smi -i 1 -pl 150 
sudo nvidia-settings -a '[gpu:0]/GPUFanControlState=1'; 
sudo nvidia-settings -a '[gpu:1]/GPUFanControlState=1'; 
sudo nvidia-settings -a '[fan:0]/GPUTargetFanSpeed=30'; 
sudo nvidia-settings -a '[fan:1]/GPUTargetFanSpeed=30'; 
sudo nvidia-settings -a '[gpu:0]/GPUMemoryTransferRateOffset[3]=580'; 
sudo nvidia-settings -a '[gpu:1]/GPUMemoryTransferRateOffset[3]=580'; 
sudo nvidia-settings -a '[gpu:1]/GPUGraphicsClockOffset[3]=120'; 
sudo nvidia-settings -a '[gpu:0]/GPUPowerMizerMode=1'; 
sudo nvidia-settings -a '[gpu:1]/GPUPowerMizerMode=1'; 
  ./llama-server -m /путь/модель.gguf --host 127.0.0.1 --port 8080 -c 11264 -ngl -1 -t 6 --flash-attn auto --tensor-split 3,1,1 --cache-type-k q4_0 --cache-type-v q4_0 -b 512 -ub 512

Для отслеживания загрузки GPU при работе с AI-моделями можно использовать программу nvtop (пакет sys-process/nvtop в gentoo):

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *