Скрипт автоустановки llama.cpp на ubuntu
<code>
!/usr/bin/env bash
set -euo pipefail
Настройки по умолчанию
INSTALL_DIR=»$HOME/llama.cpp» # Куда клонировать репозиторий
BRANCH=»master» # Ветка репозитория
BACKEND=»cpu» # cpu | cuda
Небольшая модель для теста (быстро докачать и запустить)
HF_MODEL_DEFAULT=»ggml-org/gemma-3-270m-it-GGUF»
HF_MODEL=»$HF_MODEL_DEFAULT»
RUN_TEST=1 # 1 = запускать тест, 0 = нет
TEST_PROMPT=»Ты локальная LLM. Одним коротким предложением расскажи, что ты умеешь.»
#
usage() {
cat <<EOF
Автоустановка llama.cpp на Ubuntu + тестовый запуск модели.
Использование:
$0 [опции]
Опции:
—dir PATH Путь установки (по умолчанию: $HOME/llama.cpp)
—branch BRANCH Ветка git (по умолчанию: master)
—cpu Сборка только для CPU (по умолчанию)
—cuda Сборка с поддержкой CUDA (нужен установленный CUDA Toolkit)
—model REPO Hugging Face repo-id GGUF модели для теста
(по умолчанию: $HF_MODEL_DEFAULT)
пример: ggml-org/gemma-3-1b-it-GGUF
—no-test Не запускать тестовый прогон модели
-h, —help Показать эту справку
Примеры:
$0
$0 —cuda
$0 —model ggml-org/gemma-3-1b-it-GGUF
$0 —dir /opt/llama.cpp —cuda —no-test
EOF
exit 1
}
Парсинг аргументов
while [[ $# -gt 0 ]]; do
case «$1» in
—dir)
INSTALL_DIR=»$2″
shift 2
;;
—branch)
BRANCH=»$2″
shift 2
;;
—cpu)
BACKEND=»cpu»
shift
;;
—cuda)
BACKEND=»cuda»
shift
;;
—model)
HF_MODEL=»$2″
shift 2
;;
—no-test)
RUN_TEST=0
shift
;;
-h|—help)
usage
;;
*)
echo «Неизвестный аргумент: $1»
usage
;;
esac
done
Проверки окружения
if [[ ! -f /etc/os-release ]]; then
echo «Не могу определить дистрибутив (нет /etc/os-release). Продолжаю на свой страх и риск…»
else
. /etc/os-release
if [[ «${ID:-}» != «ubuntu» ]]; then
echo «Внимание: скрипт рассчитан на Ubuntu, а у тебя: ${PRETTY_NAME:-unknown}»
echo «Продолжаю, но что-то может пойти не так.»
fi
fi
if [[ «$EUID» -ne 0 ]] && ! command -v sudo >/dev/null 2>&1; then
echo «Нужен sudo или запуск от root для установки пакетов.»
exit 1
fi
Установка зависимостей
echo «==> Установка зависимостей через apt…»
if [[ «$EUID» -eq 0 ]]; then
APT=»apt-get»
else
APT=»sudo apt-get»
fi
$APT update -y
$APT install -y \
build-essential \
cmake \
git \
python3 \
python3-venv \
python3-pip \
libcurl4-openssl-dev
Обработка бэкенда CUDA
if [[ «$BACKEND» == «cuda» ]]; then
if ! command -v nvcc >/dev/null 2>&1; then
echo «ВНИМАНИЕ: запрошена сборка с CUDA (—cuda), но nvcc не найден.»
echo «Убедись, что установлен CUDA Toolkit и nvcc в PATH.»
echo «Падаю обратно на CPU-only сборку.»
BACKEND=»cpu»
else
echo «==> Найден nvcc, собираем с поддержкой CUDA.»
fi
fi
Клонирование / обновление репозитория
echo «==> Директория установки: $INSTALL_DIR»
if [[ -d «$INSTALL_DIR/.git» ]]; then
echo «==> Репозиторий уже существует, обновляю…»
cd «$INSTALL_DIR»
git fetch —all —prune
git checkout «$BRANCH»
git pull —ff-only origin «$BRANCH»
else
echo «==> Клонирую репозиторий ggml-org/llama.cpp…»
git clone —branch «$BRANCH» https://github.com/ggml-org/llama.cpp.git «$INSTALL_DIR»
cd «$INSTALL_DIR»
fi
Сборка через CMake
echo «==> Конфигурирование сборки…»
CMAKE_ARGS=»-DCMAKE_BUILD_TYPE=Release \
-DLLAMA_BUILD_TESTS=OFF \
-DLLAMA_BUILD_EXAMPLES=ON \
-DLLAMA_BUILD_SERVER=ON»
if [[ «$BACKEND» == «cuda» ]]; then
CMAKE_ARGS=»$CMAKE_ARGS -DGGML_CUDA=ON»
fi
cmake -S . -B build $CMAKE_ARGS
echo «==> Сборка (cmake —build)…»
cmake —build build -j»$(nproc)»
Создание симлинков в ~/.local/bin
echo «==> Создаю симлинки в \$HOME/.local/bin…»
BIN_DIR=»$HOME/.local/bin»
mkdir -p «$BIN_DIR»
for bin in llama-cli llama-server; do
if [[ -f «$INSTALL_DIR/build/bin/$bin» ]]; then
ln -sf «$INSTALL_DIR/build/bin/$bin» «$BIN_DIR/$bin»
echo » -> $BIN_DIR/$bin -> $INSTALL_DIR/build/bin/$bin»
else
echo » [!] Не найден $INSTALL_DIR/build/bin/$bin (возможно, изменилась структура проекта).»
fi
done
Тестовый прогон модели
if [[ «$RUN_TEST» -eq 1 ]]; then
echo
echo «===================================================================»
echo «==> Тестовый запуск модели: $HF_MODEL»
echo «===================================================================»
LLAMA_CLI="$INSTALL_DIR/build/bin/llama-cli"
if [[ ! -x "$LLAMA_CLI" ]] && [[ -x "$HOME/.local/bin/llama-cli" ]]; then
LLAMA_CLI="$HOME/.local/bin/llama-cli"
fi
if [[ ! -x "$LLAMA_CLI" ]]; then
echo "[!] Не найден исполняемый файл llama-cli. Пропускаю тестовый запуск."
else
echo "Команда:"
echo " $LLAMA_CLI -hf \"$HF_MODEL\" -p \"$TEST_PROMPT\" -n 64 --temp 0.7"
echo
echo "Сейчас будет скачана модель (если её ещё нет) и выполнен короткий прогон."
echo
set +e
"$LLAMA_CLI" -hf "$HF_MODEL" -p "$TEST_PROMPT" -n 64 --temp 0.7
TEST_EXIT=$?
set -e
echo
echo "-------------------------------------------------------------------"
if [[ $TEST_EXIT -ne 0 ]]; then
echo "[!] Тестовый запуск завершился с ошибкой (код $TEST_EXIT)."
echo " Проверь сообщение об ошибке выше (часто это сеть или Hugging Face)."
else
echo "Тестовый запуск прошёл успешно. Ответ модели показан выше."
fi
echo "-------------------------------------------------------------------"
fi
fi
Итоговая информация
echo
echo «===================================================================»
echo «Установка llama.cpp завершена.»
echo
echo «Директория исходников: $INSTALL_DIR»
echo «Бинарники: $INSTALL_DIR/build/bin»
echo «Симлинки: $HOME/.local/bin/llama-cli, llama-server»
echo
echo «Если \$HOME/.local/bin ещё не в PATH, добавь, например, в ~/.bashrc:»
echo ‘ export PATH=»$HOME/.local/bin:$PATH»‘
echo
echo «Примеры запуска:»
echo » llama-cli -h»
echo » llama-server -h»
echo
echo «Для запуска своей модели с Hugging Face:»
echo » llama-cli -hf -p \»Привет\» -n 64″
echo «например:»
echo » llama-cli -hf ggml-org/gemma-3-1b-it-GGUF -p \»Привет\» -n 64″
echo «===================================================================»</code>