AI и DIY,  Статьи

Запуск llama.cpp на Nvidia Tesla K40 на CUDA

Эта статья является продолжением руководства «Локальный ИИ на Nvidia Tesla K40: сборка и настройка компьютера», в котором описывается настройка операционной системы ubuntu-server 26.04 для работы с патченными драйверами Nvidia 470-й версии. В ней изложена последовательность действий, необходимых для:

  • установки gcc11 и модификации системных файлов для работы с Cuda 11-й версии;
  • принудительной установки Cuda Toolkit 11.8 и совместимых бинарников nccl;
  • модификации исходников и сборки llama.cpp для видеокарт с архитектурой Nvidia Kepler (SM35).

В конце статьи приведены примеры работы видеокарты Nvidia Tesla K40 с языковыми AI-моделями локально и в составе небольшого кластера с подключением по 2.5Gbit каналу.

Развертывание Cuda Toolkit 11.8 в ubuntu 26.04

Установка Cuda Toolkit 11.8 и необходимых для ее работы служебных файлов:

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run --extract=$HOME/cuda_extracted
sudo mkdir -p /usr/local/cuda-11.8/bin
sudo mkdir -p /usr/local/cuda-11.8/lib64
sudo mkdir -p /usr/local/cuda-11.8/include
cd $HOME/cuda_extracted

Запускаем скрипт, который находит исполняемые файлы инсталляторов внутри папок и распаковывает их в /usr/local/cuda-11.8:

       for dir in cuda_cudart cuda_cuobjdump cuda_nvcc cuda_nvdisasm cuda_nvprune cuda_nvrtc cuda_nvtx libcublas libcufft libcurand libcusolver libcusparse libnpp; do
if [ -f "$dir/install-linux.pl" ]; then
sudo perl "$dir/install-linux.pl" -prefix=/usr/local/cuda-11.8 -noprompt
fi
done
       sudo cp -r bin/* /usr/local/cuda-11.8/bin/ 2>/dev/null
sudo cp -r cuda_nvcc/bin/* /usr/local/cuda-11.8/bin/ 2>/dev/null
sudo cp -r cuda_cccl/include/* /usr/local/cuda-11.8/include/ 2>/dev/null
sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda


Ставим и линкуем libxml2-16 и libxml2-dev:

       sudo apt update && sudo apt install libxml2-16 libxml2-dev -y
sudo ln -s /usr/lib/x86_64-linux-gnu/libxml2.so.16 /usr/lib/x86_64-linux-gnu/libxml2.so.2

Установка gcc-11

Ставим компилятор gcc11, совместимый с CUDA 11.8:

  sudo apt update && sudo apt install gcc-11 g++-11 -y

Проверяем, что компилятор установлен и виден по нужному пути:

  /usr/bin/gcc-11 --version

Установка NVIDIA Collective Communications Library (NCCL)

Ставим бинарные файлы nccl, совместимые с cuda 11 для оптимизации работы в AI-кластере и в multi-GPU окружении:

cd ~ && wget https://developer.nvidia.com/w/compute/redist/nccl/v2.21.5/nccl_2.21.5-1+cuda11.0_x86_64.txz
tar -xvf nccl_2.21.5-1+cuda11.0_x86_64.txz && cd nccl_2.21.5-1+cuda11.0_x86_64
sudo cp -rv include/* /usr/local/include/
sudo cp -rv lib/* /usr/local/lib/
sudo ldconfig

Проверяем, что ядро Ubuntu успешно зафиксировало библиотеку в памяти:

ldconfig -p | grep nccl
ldconfig -p | grep nccl
libnccl.so.2 (libc6,x86-64) => /usr/local/lib/libnccl.so.2
libnccl.so (libc6,x86-64) => /usr/local/lib/libnccl.so

Модификация системных файлов Ubuntu 26.04 для работы с nvcc 11.8

Чтобы заставить nvcc 11.8 и glibc Ubuntu 26.04 не конфликтовать из-за математических функций (cospi/sinpi/rsqrt), модифицируем системный файл /usr/include/features.h:

Строку:

  #define __GLIBC_USE(F)  __GLIBC_USE_##F

нужно заменить на изолирующий блок:

#ifdef __CUDACC__
#define __GLIBC_USE(F) 0
#else
#define __GLIBC_USE(F) __GLIBC_USE_##F
#endif

Благодаря этому решается проблема несовместимости математических типов CMake и компилятора. Модификация системного файла /usr/include/features.h устраняет ошибку exception specification is incompatible на функциях cospi, sinpi, rsqrt, появляющуюся при валидации компилятора в Cmake во время сборки llama.cpp. Источником проблемы является библиотека glibc, которая использует стандарты C23/C26, не совместимые с заголовочными файлами CUDA 11.8 (последней версией, поддерживающей архитектуру Kepler), где они объявлены по стандартам C++11/14.

Перехват управления функцией препроцессора __GLIBC_USE, скрывающий блок C23-расширений тригонометрии от несовместимой версии CUDA 11.8 не затрагивает функционала операционной системы, для которой всё остается в штатном режиме.

Модификация исходного кода llama.cpp под sm3.5

Скачиваем исходники llama.cpp:

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

В них нужно модифицировать исходный код файлов ggml/src/ggml-cuda/norm.cu, а также, для эмуляции тензоров, ggml-cuda.cu и другие файлы, отвечающие за эти операции.

Из-за того, что пакет CUDA 11.8 скрывает хост-функцию rsqrtf, ядра видеокарты Kepler теряют этот аппаратный примитив. Чтобы подогнать код под sm35, в начало этого файла добавляется ассемблерный патч:

  nano ~/llama.cpp/ggml/src/ggml-cuda/norm.cu

#if defined(__CUDACC__)
// Ассемблер PTX для чипа GK110b: вычисление обратного корня напрямую в регистре
static __device__ __forceinline__ float legacy_rsqrtf(float val) {
float res;
asm("rsqrt.approx.f32 %0, %1;" : "=f"(res) : "f"(val));
return res;
}
#define rsqrtf(x) legacy_rsqrtf(x)
#endif
#include "norm.cuh"
#include <cstdint>
template <int block_size>

Для автоматического добавления кода патча выполняем команду:

sed -i '1s/^/#if defined(__CUDACC__)\nstatic __device__ __forceinline__ float legacy_rsqrtf(float val) {\n    float res;\n asm("rsqrt.approx.f32 %0, %1;" : "=f"(res) : "f"(val));\n return res;\n}\n#define rsqrtf(x) legacy_rsqrtf(x)\n#endif\n/' ggml/src/ggml-cuda/norm.cu

С этим патчем уже можно собирать llama.cpp для рабрты с простыми (немультимодальными) AI-моделями. Для работы с моделями, требующими использования тензоров, необходимо модифицировать файлggml/src/ggml-cuda/common.cuh (об этом ниже).

Сборка llama.cpp из исходного кода, модифифированного под Nvidia Compute Capability 3.5

Чтобы CMake при сборке исполняемых файлов llama.cpp не пытался использовать GCC 15. дефолтный для ubuntu 26.04, в команду для сборки нужно передавать точный путь к совместимому с CUDA-11 хост-компилятору gcc-11:

  -DCMAKE_CUDA_HOST_COMPILER=/usr/bin/gcc-11

Чтобы использовать RDMA (Remote Direct Memory Access) в Ubuntu для ускорения сетевого обмена, например, на сетевых картах 10G SFP+ Mellanox ConnectX-3:

  sudo apt update && sudo apt install -y rdma-core ibverbs-utils rdmacm-utils perftest libibverbs-dev

Команда для сборки бинарников llama.cpp для видеокарт Nvidia Kepler со сборкой rpc-сервера (файл ggml-rpc-server) и активацией NCCL:

  cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DGGML_RPC=ON -DGGML_CUDA_NCCL=ON -DCMAKE_CUDA_COMPILER=/usr/local/cuda-11.8/bin/nvcc -DCMAKE_CUDA_HOST_COMPILER=/usr/bin/gcc-11 -DCMAKE_CUDA_ARCHITECTURES="35" -DCMAKE_CUDA_FLAGS="-Wno-deprecated-gpu-targets" -DCMAKE_C_FLAGS="-O3 -march=native -pipe" -DCMAKE_CXX_FLAGS="-O3 -march=native -pipe" && cmake --build build -j$(nproc)

Фрагмент лога сборки llama.cpp для Nvidia Tesla K40 с включенной поддержкой RDMA, NCCL и принудительного перевода вычислений на cuBLAS:

-DCMAKE_CXX_FLAGS="-O3 -march=native -pipe" && cmake --build build -j$(nproc)

-- The C compiler identification is GNU 15.2.0

-- The CXX compiler identification is GNU 15.2.0

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Check for working C compiler: /usr/bin/cc - skipped

-- Detecting C compile features

-- Detecting C compile features - done

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Check for working CXX compiler: /usr/bin/c++ - skipped

-- Detecting CXX compile features

-- Detecting CXX compile features - done

-- llama.cpp version: 0.1.0-dev

CMAKE_BUILD_TYPE=Release

-- Found Git: /usr/bin/git (found version "2.53.0")

-- The ASM compiler identification is GNU

-- Found assembler: /usr/bin/cc

-- Performing Test CMAKE_HAVE_LIBC_PTHREAD

-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success

-- Found Threads: TRUE

-- Warning: ccache not found - consider installing it for faster compilation or disable this warning with GGML_CCACHE=OFF

-- CMAKE_SYSTEM_PROCESSOR: x86_64

-- GGML_SYSTEM_ARCH: x86

-- Found OpenMP_C: -fopenmp (found version "4.5")

-- Found OpenMP_CXX: -fopenmp (found version "4.5")

-- Found OpenMP: TRUE (found version "4.5")

-- Including CPU backend

-- x86 detected

-- Adding CPU backend variant ggml-cpu: -march=native

-- Found CUDAToolkit: /usr/local/cuda-11.8/targets/x86_64-linux/include (found version "11.8.89")

-- CUDA Toolkit found

-- The CUDA compiler identification is NVIDIA 11.8.89 with host compiler GNU 11.5.0

-- Detecting CUDA compiler ABI info

-- Detecting CUDA compiler ABI info - done

-- Check for working CUDA compiler: /usr/local/cuda-11.8/bin/nvcc - skipped

-- Detecting CUDA compile features

-- Detecting CUDA compile features - done

-- Using CMAKE_CUDA_ARCHITECTURES=35 CMAKE_CUDA_ARCHITECTURES_NATIVE=35-real

-- Found NCCL: /usr/local/lib/libnccl.so

-- CUDA host compiler is GNU 11.5.0

-- Including CUDA backend

-- Using RPC backend

-- RDMA transport enabled (auto-detected)

-- Including RPC backend

-- ggml version: 0.19.0

-- ggml commit: 4c1a0af40

-- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "3.5.5")

-- Performing Test OPENSSL_VERSION_SUPPORTED

-- Performing Test OPENSSL_VERSION_SUPPORTED - Success

-- OpenSSL found: 3.5.5

-- Generating embedded license file for target: llama-app

-- Configuring done (3.2s)

-- Generating done (0.3s)

-- Build files have been written to: /home/intel51/llama.cpp/build

...

Эта сборка работает с простыми моделями, например, Qwen3.8_4B_Distilled-v2. Для обеспечения совместимости с моделями, требующими использование тензоров, необходимо дополнительно модифицировать файлы, отвечающие за операции с ними.

Глубокая модифифкация кода llama.cpp

Для обеспечения работы с мультимодальными моделями и повышения быстродействия при AI-инференсе делались многочисленные попытки не только модифицировать код, но и оптимизировать получаемые исполняемые файлы, поочередно добавляя в команду сборки флаги:

  -DGGML_CUDA_FORCE_CUBLAS=1 — выполнение матричных операций через библиотеку NVIDIA cuBLAS;
  -DGGML_CUDA_FORCE_MMQ=ON — задействование механизма умножения матриц MMQ (Multi-Matrix-Quantization), работающего на CUDA в обход cuBLAS).

К сожалению, при добавлении флага -DGGML_CUDA_FORCE_CUBLAS=1, rpc-нода на Tesla K40 при запуске тензорных моделей падала с ошибкой:

ggml_cuda_graph_set_enabled: disabling CUDA graphs due to GPU architecture

CUDA error: CUBLAS_STATUS_ARCH_MISMATCH

current device: 0, in function ggml_cuda_mul_mat_cublas_impl at /home/intel51/llama.cpp/ggml/src/ggml-cuda/ggml-cuda.cu:1563

cublasGemmStridedBatchedEx(ctx.cublas_handle(), CUBLAS_OP_T, CUBLAS_OP_N, ne01, ne11, ne10, alpha, src0_ptr, cu_data_type_a, s01, sma, src1_ptr, cu_data_type_b, s11, smb, beta, dst_ptr, cu_data_type, ne0, ne1*ne0, ne12*ne13, cu_compute_type, CUBLAS_GEMM_DEFAULT_TENSOR_OP)

Вызов функции cublasGemmStridedBatchedEx, переключающий видеокарту в режим CUBLAS_GEMM_DEFAULT_TENSOR_OP требует наличия Tensor Cores, поэтому чип на архитектуре Kepler отказывался работать, выдавая ошибку несоответствия архитектуры (ARCH_MISMATCH).

При включенном FORCE_MMQ=ON llama.cpp происходило то же самое, Qwen3.6-27B-Fable-Fusion-711 приводил к падению llama.cpp из-за использования весов и служебных матриц, которые используют функцию cublasGemmStridedBatchedEx с флагом CUBLAS_GEMM_DEFAULT_TENSOR_OP, завязанную на тензоры:

ggml_cuda_graph_set_enabled: disabling CUDA graphs due to GPU architecture

CUDA error: CUBLAS_STATUS_ARCH_MISMATCH

current device: 0, in function ggml_cuda_mul_mat_cublas_impl at /home/intel51/llama.cpp/ggml/src/ggml-cuda/ggml-cuda.cu:1563

cublasGemmStridedBatchedEx(ctx.cublas_handle(), CUBLAS_OP_T, CUBLAS_OP_N, ne01, ne11, ne10, alpha, src0_ptr, cu_data_type_a, s01, sma, src1_ptr, cu_data_type_b, s11, smb, beta, dst_ptr, cu_data_type, ne0, ne1*ne0, ne12*ne13, cu_compute_type, CUBLAS_GEMM_DEFAULT_TENSOR_OP)

...Aborted llama_cpp/ggml-rpc-server -H 0.0.0.0 -p 50052

Для решения этой проблемы необходимо изменить сам алгоритм работы файлов ggml-cuda.cu и ggml/src/ggml-cuda/ssm-scan.cu. Для этого можно использовать перехват функций через файл заголовков ggml/src/ggml-cuda/common.cuh.

Его работу можно скорректировать таким образом, чтобы в ходе работы он конвертировал аргументы из void** в float**, используя cublasSgemmStridedBatched.

Если перед этим модифицировались файлы ggml-cuda.cu и ssm-scan.cu, их нужно привести к исходному виду:

  cd ~/llama.cpp
  git checkout ggml/src/ggml-cuda/ggml-cuda.cu
  git checkout ggml/src/ggml-cuda/ssm-scan.cu 

Затем в конец файла common.cuh добавляем блок «перехватчиков»:

  nano ggml/src/ggml-cuda/common.cuh

Вставляем в конец файла блок комнад:

#ifdef __CUDACC__

#include <cublas_v2.h>

// 1. Перехват кублас функции StridedBatchedEx

static inline cublasStatus_t kepler_cublasGemmStridedBatchedEx(

cublasHandle_t handle, cublasOperation_t transa, cublasOperation_t transb,

int m, int n, int k, const void *alpha, const void *A, cudaDataType_t Atype, int lda, long long int strideA,

const void *B, cudaDataType_t Btype, int ldb, long long int strideB, const void *beta, void *C,

cudaDataType_t Ctype, int ldc, long long int strideC, int batchCount, cublasComputeType_t computeType, cublasGemmAlgo_t algo) {

return cublasSgemmStridedBatched(

handle, transa, transb, m, n, k,

(const float *)alpha, (const float *)A, lda, strideA,

(const float *)B, ldb, strideB,

(const float *)beta, (float *)C, ldc, strideC, batchCount

);

}

#define cublasGemmStridedBatchedEx kepler_cublasGemmStridedBatchedEx

// 2. Перехват кублас функции BatchedEx

static inline cublasStatus_t kepler_cublasGemmBatchedEx(

cublasHandle_t handle, cublasOperation_t transa, cublasOperation_t transb,

int m, int n, int k, const void *alpha, const void *A[], cudaDataType_t Atype, int lda,

const void *B[], cudaDataType_t Btype, int ldb, const void *beta, void *C[], cudaDataType_t Ctype, int ldc,

int batchCount, cublasComputeType_t computeType, cublasGemmAlgo_t algo) {

return cublasSgemmBatched(

handle, transa, transb, m, n, k,

(const float *)alpha, (const float **)A, lda,

(const float **)B, ldb,

(const float *)beta, (float **)C, ldc, batchCount

);

}

#define cublasGemmBatchedEx kepler_cublasGemmBatchedEx

// 3. Глушим TENSOR_OP во всем проекте

#define CUBLAS_GEMM_DEFAULT_TENSOR_OP CUBLAS_GEMM_DEFAULT

#endif

После применения этого патча и пересборки llama.cpp Tesla K40 работает с включенным флагом -DGGML_CUDA_FORCE_MMQ=ON даже с мультимодальными моделями, используя команды CUDA 11.8.

Особенности корректировки исходников llama.cpp после обновления

Обновление исходников llama.cpp осуществляется командой git pull:

  cd ~/llama.cpp
  git pull

После этого системный файл /usr/include/features.h повторно корректировать не нужно, достаточно повторно пропатчить файл ggml/src/ggml-cuda/common.cuh. Затем можно собирать llama.cpp по стандартной процедуре, не забывая сделать полную очистку папки build в каталоге с исходниками llama.cpp:

  rm -rf build && cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DGGML_CUDA_FORCE_MMQ=ON -DGGML_RPC=ON -DGGML_CUDA_NCCL=ON -DCMAKE_CUDA_COMPILER=/usr/local/cuda-11.8/bin/nvcc -DCMAKE_CUDA_HOST_COMPILER=/usr/bin/gcc-11 -DCMAKE_CUDA_ARCHITECTURES="35" -DCMAKE_CUDA_FLAGS="-Wno-deprecated-gpu-targets" -DCMAKE_C_FLAGS="-O3 -march=native -pipe" -DCMAKE_CXX_FLAGS="-O3 -march=native -pipe" && cmake --build build -j$(nproc)

Для копирования готовых файлов в рабочую папку пользователя llama_cpp из каталога, где она была собрана (/llama.cpp/build/bin/), с автоматической очисткой последней, при работе в терминале удобно использовать команду:

  rsync -av --delete --exclude='*.sh' $HOME/llama.cpp/build/bin/ $HOME/llama_cpp/

Запуск llama.cpp на Nvidia tesla K40 локально

Локальный запуск llama-server на Tesla K40 ничем не отличается от стандартной процедуры и уже описан в нескольких статьях на сайте cryptoprofi.info.

Для оптимизации использования zRAM для вычислений при обработке больших контекстов можно подкорректировать агрессивность использования системой резервной памяти swap (swappiness) в sysctl.conf:

  sudo nano /etc/sysctl.conf

Добавить в него строки:


vm.swappiness=100
vm.page-cluster=0

Лог локального запуска llama.cpp с моделью Ma7ee7-Qwen3.8_4B_Distilled-v2 в квантовании Q8 (4.28GB) на видеокарте Nvidia Tesla K40, контекст 8000:

sh run_Ma7ee7-Qwen3.8_4B_Distilled-v2

0.00.037.237 I cmn common_param: common_params_print_info: verbosity = 3 (adjust with the `-lv N` CLI arg)

0.00.384.877 W srv llama_server: -----------------

0.00.384.882 W srv llama_server: CORS is set to allow all origins ('*') and no API key is set

0.00.384.882 W srv llama_server: this can be a security risk (cross-origin attacks)

0.00.384.882 W srv llama_server: more info: https://github.com/ggml-org/llama.cpp/pull/25655

0.00.384.883 W srv llama_server: -----------------

0.00.386.173 I srv load_model: loading model '/home/intel51/AI_Models/thebbg_Ma7ee7_Qwen3.8_4B_Distilled_1785857072.Q8_0.gguf'

0.00.910.301 W load: control-looking token: 128247 '</s>' was not control-type; this is probably a bug in the model. its type will be overridden

0.02.082.718 I srv load_model: initializing, n_slots = 4, n_ctx_slot = 8192, kv_unified = 'true'

0.02.092.795 I srv llama_server: model loaded

0.02.092.802 I srv llama_server: listening on http://0.0.0.0:8080

0.02.092.802 W srv llama_server: NOTICE: server default port will be changed to :9931 in a future release

0.02.092.803 W srv llama_server: ref: https://github.com/ggml-org/llama.cpp/pull/26508

1.08.754.001 I slot get_availabl: id 3 | task -1 | selected slot by LRU, t_last = -1

1.08.754.203 I slot launch_slot_: id 3 | task 0 | processing task, is_child = 0

1.17.565.412 I slot print_timing: id 3 | task 0 | prompt processing, n_tokens = 512, progress = 0.60, t = 8.81 s / 58.11 tokens per second

1.25.809.892 I slot print_timing: id 3 | task 0 | n_decoded = 100, tg = 19.47 t/s, tg_3s = 19.47 t/s

...

2.13.850.029 I slot print_timing: id 3 | task 0 | eval time = 53177.47 ms / 979 tokens ( 54.32 ms per token, 18.41 tokens per second)

2.13.850.030 I slot print_timing: id 3 | task 0 | total time = 65095.70 ms / 1828 tokens

2.13.850.044 I slot print_timing: id 3 | task 0 | graphs reused = 974

2.13.850.157 I slot release: id 3 | task 0 | stop processing: n_tokens = 1827, truncated = 0

По логам видно, что ИИ-нода на Tesla K40 выдает скорость генерации (Token Generation) порядка ~18.5 – 19.5 токенов в секунду (работа на полном PL). Первичная обработка контекста (Prompt Processing) — от 58 до 71 токенов в секунду.

После запуска скрипта термоконтроля (tesla-thermal.sh, подробно разобран в первой части статьи «Локальный ИИ на Nvidia Tesla K40: сборка и настройка компьютера») скорость генерации снизилась до примерно 14 токенов в секунду. Скрипт раз в 2 секунды опрашивает температуру чипа GK110b через nvidia-smi и при достижении 72°C принудительно сбрасывает частоты ядра и памяти до энергосберегающих 324/324 МГц, возвращая полный буст-режим 3004/1006 МГц только после охлаждения карты до 65°C:

Запуск llama.cpp на Nvidia tesla K40 в качестве rpc-ноды

Нода с Tesla K40 на простаивающем железе целенаправленно собиралась для использования в составе кластера, для увеличения размера общей VRAM. Подробнее запуск RPC-сервера на воркере AI-кластера в gentoo описан в статье «Запуск llama.cpp в распределенном режиме по локальной сети».

Простейший скрипт запуска ggml-rpc-server, который будет управляться по сети компьютером-мастером:

#!/bin/sh

export CUDA_MODULE_LOADING=LAZY

./ggml-rpc-server -H 0.0.0.0 -p 50052

Для автоматического запуска сервера llama.cpp с созданием systemd-сервиса, переменными окружения, перенаправлением логов в /dev/null в ubuntu нужнос создать файл службы systemd:

  sudo nano /etc/systemd/system/llama-rpc.service

Вставляем в него текст:

[Unit]

Description=Llama.cpp RPC Server for Tesla K40 (Root Mode)

After=network.target

[Service]

Type=simple

User=root

Group=root

Environment=GGML_CUDA_ENABLE_HUGEPAGES=1

ExecStart=/home/intel51/llama_cpp/ggml-rpc-server -H 0.0.0.0 -p 50052

Restart=always

# --- ОТКЛЮЧЕНИЕ ЛОГОВ ---

StandardOutput=null

StandardError=null

[Install]

WantedBy=multi-user.target

Запуск RPC сервера осуществляется от root чтобы получить доступ к большим страницам памяти (переменная GGML_CUDA_ENABLE_HUGEPAGES=1).

Для применения изменений, включения автозапуска и старта службы выполняем команды:

  sudo systemctl daemon-reload
  sudo systemctl enable llama-rpc

Перезапуск и остановка сервиса:

  sudo systemctl restart llama-rpc
  sudo systemctl stop llama-rpc

Проверка состояния процесса:

  sudo systemctl status llama-rpc

Для управления Llama.cpp RPC Server-Tesla K40 на компьютере-мастере запускаем скрипт с указанием локальных адресов rpc-нод с помощью флага —rpc, например:

"$LLAMA_SERVER" -m "$MODEL_PATH" \

--host "$HOST" \

--port "$PORT" \

--rpc 192.168.2.51:50052 \

-ngl auto \

-t -1 \

--prio -1 \

--load-mode mlock \

-sm layer \

--perf \

--jinja \

--temp 0.6 \

--repeat-penalty 1.15 \

--cache-type-k q4_0 \

--cache-type-v q4_0 \

-c 8196 \

--flash-attn on \

-lv 3

Модель Qwen3.6-27B-Fable-Fus-711-UnHeretic-NM-DAU-NEO-MAX-NEO-MTP-Q4_K_M.gguf (17.2GB) в кластере из двух компьютеров (мастер с Nvidia GTX1070 8GB + Nvidia GTX1060 6GB и второй комп с Tesla K40 12GB, всего 26GB VRAM) в 2.5G сети работает, выдавая 5.5 токенов/сек (используется патченая сборка llama.cpp, скорость ограничена сетью):

Загрузка Nvidia Tesla K40m 12GB VRAM при инференсе по данным nvtop:

Нода при работе выдает сообщение:

Accepted client connection

ggml_cuda_graph_set_enabled: disabling CUDA graphs due to GPU architecture

Несмотря на ggml_cuda_graph_set_enabled: disabling CUDA graphs due to GPU architecture, вычисления идут, инференс работает.

Заключение

Учитывая полученные результаты, можно сделать вывод, что при наличии желания и свободного времени можно настроить даже списанную 12-летнюю датацентровую карту за 30–40$ для работы в локальном AI-кластере, получая конфиденциальный инференс на приемлемой скорости. Специально покупать такое железо не имеет никакого смысла, но если оно уже имеется в наличии, возможно, стоит, его еще немного помучить, попутно набравшись опыта и знаний…

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

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