В последнее время большие языковые модели (LLM) становятся все более популярными, но для их эффективного запуска требуется значительная вычислительная мощность. Один из способов запуска LLM локально - использование библиотеки Llama.cpp. В этой статье мы рассмотрим, как тестировать производительность видеокарт для LLM с использованием инструмента llama-bench
, входящего в состав Llama.cpp.
Дисклеймер: Почему Llama.cpp, а не Ollama?
Прежде чем мы приступим к тестированию, важно объяснить, почему мы используем Llama.cpp напрямую, а не Ollama. Ollama – это удобная надстройка, упрощающая установку и запуск LLM. Однако, она добавляет дополнительный слой абстракции, который приводит к снижению производительности и ограничивает контроль над настройками. Llama.cpp же напротив предоставляет прямой доступ к аппаратным ресурсам и позволяет максимально оптимизировать запуск LLM на вашей системе. Если ваша цель – получить максимальную производительность и точно настроить параметры, Llama.cpp – отличный выбор.
Подготовка к тестированию
Установка Llama.cpp: Скачайте и установите Llama.cpp. Инструкции доступны на GitHub-странице проекта. Убедитесь, что вы выбрали версию, соответствующую вашей операционной системе и архитектуре (например,
llama-b5535-bin-win-vulkan-x64
для Windows с Vulkan). Так же можно использовать пакетный менеджер Winget:winget install ggml.llamacpp
.Загрузка GGUF модели: Вам потребуется GGUF-модель. Вы можете скачать их с Hugging Face (например, TheBloke/Llama-2-7B-GGUF). Выбирайте модель, соответствующую вашим требованиям к размеру и качеству.
Подготовка скрипта: Создайте текстовый файл со скриптом для запуска
llama-bench
.
Запуск llama-bench
Вот пример скрипта, который можно использовать для тестирования:
llama-bench ^
--repetitions 25 ^
--delay 5 ^
--n-prompt 512 ^
--n-gen 512 ^
--ubatch-size 512 ^
--flash-attn 1 ^
--cache-type-k q8_0,f16 ^
--cache-type-v q8_0,f16 ^
--model C:\HuggingFace\TheBloke\Llama-2-7B-GGUF\llama-2-7b.Q4_0.gguf
Разъяснение параметров:
--repetitions
: Количество повторений теста.--delay
: Задержка между повторениями (в секундах).--n-prompt
: Длина входного запроса (в токенах).--n-gen
: Длина генерируемого текста (в токенах).--ubatch-size
: Размер пакета для обработки. Увеличение этого значения может повысить производительность, но требует больше видеопамяти.--flash-attn
: Включение Flash Attention для ускорения вычислений (если поддерживается вашей видеокартой).--cache-type-k q8_0,f16
: Тип кэша для ключей.--cache-type-v q8_0,f16
: Тип кэша для значений.--model
: Путь к GGUF-модели.
Запустите скрипт из командной строки. llama-bench
выведет результаты, включая время процессинга (pp512) и генерации (tg512) текста в токенах в секунду (tokens/s).
Анализ результатов и сравнение
Результаты, полученные с помощью llama-bench
, можно использовать для сравнения производительности разных видеокарт, моделей и настроек. Обратите внимание на генерацию токенов в секунду (tg) – чем выше это значение, тем быстрее работает LLM.
Полезный ресурс для сравнения производительности Llama.cpp с Vulkan: Performance of llama.cpp with Vulkan. Здесь другие пользователи делятся своими результатами, что позволяет получить представление о производительности различных конфигураций.
Запуск локального сервера с llama-server
Для более удобного взаимодействия с LLM можно запустить локальный сервер с использованием llama-server
. Это позволит обращаться к модели по API и использовать веб-интерфейс для тестирования и экспериментов.
Пример скрипта:
llama-server ^
--host 0.0.0.0 ^
--port <port> ^
--log-file %USERPROFILE%\.llama.cpp\llama-server.log ^
--threads 5 ^
--n-gpu-layers 99 ^
--ubatch-size 512 ^
--ctx-size 32768 ^
--flash-attn ^
--cache-type-k q8_0 ^
--cache-type-v q8_0 ^
--alias "gemma3:27b-it-qat" ^
--model C:\HuggingFace\unsloth\gemma-3-27b-it-qat-GGUF\gemma-3-27b-it-qat-UD-Q3_K_XL.gguf ^
--repeat-penalty 1.0 ^
--temp 1.0 ^
--min-p 0.05 ^
--top-k 64 ^
--top-p 0.95
Разъяснение параметров:
--host
: IP-адрес для сервера.--port
: Порт для сервера.--log-file
: Файл для записи логов.--threads
: Количество потоков CPU. Выставьте это значение по количеству ядер вашего CPU - 1.--n-gpu-layers
: Количество слоев модели, переносимых на GPU. Начинайте с максимального и уменьшайте это значение до тех пор, пока не поместите модель видеопамять.--ubatch-size
: Размер пакета для обработки.--ctx-size
: Размер контекста (в токенах). Этот параметр зависит от размера видеопамяти. Необходимо подбирать его так, чтобы общая память видеокарты не использовалась, так как это ведет к снижению производительности.--flash-attn
: Включение Flash Attention.--cache-type-k
: Тип кэша для ключей.--cache-type-v
: Тип кэша для значений.--alias
: Псевдоним для модели (личное предпочтение, я например использую как у Ollama).--model
: Путь к GGUF-модели.--repeat-penalty
,--temp
,--min-p
,--top-k
,--top-p
: Параметры генерации текста.
После запуска сервера вы сможете обращаться к модели по API или используя веб интерфейс http://localhost:<port>.
Моя конфигурация
Я использую видеокарту AMD RX 7800 XT 16GB и Llama.cpp с Vulkan. Vulkan был выбран вместо ROCm, поскольку производительность немного выше, и дросселя не так сильно шумят. Этот выбор позволил мне получить оптимальную производительность при работе с LLM.
Заключение
Тестирование производительности видеокарт для LLM с использованием llama-bench
– это важный шаг для выбора оптимальной конфигурации. Llama.cpp предоставляет широкий спектр настроек, позволяющих добиться максимальной производительности на вашей системе. Не забывайте экспериментировать с параметрами и сравнивать результаты, чтобы найти наилучший вариант для ваших задач.
Полезные ссылки
P.S. Если вы используете NVIDIA GPU, замените Vulkan на CUDA-сборки Llama.cpp для максимальной производительности.