4 Commits

Author SHA1 Message Date
grayhook b01698e663 add docker 2026-08-12 20:02:49 +07:00
grayhook 7a3333b2f8 bump 2026-08-05 18:42:39 +07:00
grayhook a0713b260b bump port 2026-05-03 10:27:25 +07:00
grayhook 5b112ba5ec add podman 2026-05-03 10:14:10 +07:00
6 changed files with 334 additions and 13 deletions
+3 -3
View File
@@ -1,14 +1,14 @@
MODEL_FILE=Qwen3.6-35B-A3B-MXFP4_MOE.gguf MODEL_FILE=Qwen3.5-9B-MTP-UD-Q4_K_XL.gguf
# Для -1 в .env лучше кавычки — иначе часть парсеров .env ломается на ведущем минусе. # Для -1 в .env лучше кавычки — иначе часть парсеров .env ломается на ведущем минусе.
N_GPU_LAYERS="-1" N_GPU_LAYERS="-1"
# Доп. ключи docker-compose (опционально; дефолты заданы в compose) # Доп. ключи docker-compose (опционально; дефолты заданы в compose)
CTX_SIZE=65536 CTX_SIZE=65536
THREADS=8 THREADS=1
CACHE_TYPE_K=q8_0 CACHE_TYPE_K=q8_0
CACHE_TYPE_V=q8_0 CACHE_TYPE_V=q8_0
# MoE (Qwen3.5-35B-A3B-Q4_K_M / MXFP4_MOE и т.д.): при OOM на GPU — CPU_MOE=1 или частично N_CPU_MOE=8 # MoE (Qwen3.5-35B-A3B-Q4_K_M / MXFP4_MOE и т.д.): при OOM на GPU — CPU_MOE=1 или частично N_CPU_MOE=8
# Для dense (Qwopus 27B, Qwen 9B) держите оба 0. # Для dense (Qwopus 27B, Qwen 9B) держите оба 0.
CPU_MOE=0 CPU_MOE=0
N_CPU_MOE=29 N_CPU_MOE=0
+25 -10
View File
@@ -1,13 +1,22 @@
# llama.cpp + CUDA в Docker (Qwen3.x / крупные GGUF на 12 ГБ VRAM: гибрид GPU+CPU). # llama-cpp-turboquant + CUDA в Docker (Qwen3.x / крупные GGUF на 12 ГБ VRAM: гибрид GPU+CPU).
# Образ по умолчанию: server-cuda (CUDA 12 в контейнере) — совместим с большинством GPU и драйверов. # Образы собираются локально из клона TheTom/llama-cpp-turboquant (см. docker/).
# Альтернатива: server-cuda13 — только если GPU/драйвер тянут CUDA 13; иначе ggml_cuda_init:
# «forward compatibility was attempted on non supported HW» → оставьте server-cuda.
# Нужны: драйвер NVIDIA, NVIDIA Container Toolkit, runtime nvidia в Docker.
# #
# Модель: ./models/ + MODEL_FILE в .env. # CUDA 12 (дефолт) — RTX 30xx / драйвер CUDA 12.x
# Запуск: docker compose up -d или docker-compose up -d # CUDA 13 — Blackwell (RTX 50xx, sm_120), драйвер ≥ CUDA 13.1:
# LLAMA_IMAGE_TAG=server-cuda13 LLAMA_DOCKERFILE=../llama-space/docker/server-cuda13.Dockerfile \
# docker-compose build
#
# Источник: LLAMA_CPP_SRC (дефолт ../llama-cpp-turboquant).
# dockerfile — путь относительно context (так требует docker-compose 1.x).
#
# Сборка: docker-compose build
# Запуск: docker-compose up -d
# Podman: ./podman-llama.sh
# Проверка: curl http://localhost:8080/health # Проверка: curl http://localhost:8080/health
# #
# Нужны: драйвер NVIDIA, NVIDIA Container Toolkit, runtime nvidia в Docker.
# Модель: ./models/ + MODEL_FILE в .env.
#
# OOM: уменьшите CTX_SIZE (дефолт 50000), -ngl и/или cache types; при «каше» попробуйте bf16/f16 для KV (больше VRAM). # OOM: уменьшите CTX_SIZE (дефолт 50000), -ngl и/или cache types; при «каше» попробуйте bf16/f16 для KV (больше VRAM).
# MoE: в .env CPU_MOE=1 при необходимости; число слоёв MoE на CPU — N_CPU_MOE (дефолт 99 в command); для dense оставьте CPU_MOE=0. # MoE: в .env CPU_MOE=1 при необходимости; число слоёв MoE на CPU — N_CPU_MOE (дефолт 99 в command); для dense оставьте CPU_MOE=0.
# --mlock + Docker: поднимите memlock ниже; если предупреждение остаётся — проверьте default-ulimits в /etc/docker/daemon.json и лимиты пользователя на хосте. # --mlock + Docker: поднимите memlock ниже; если предупреждение остаётся — проверьте default-ulimits в /etc/docker/daemon.json и лимиты пользователя на хосте.
@@ -17,10 +26,16 @@ version: "3.8"
services: services:
llama-server: llama-server:
image: ghcr.io/ggml-org/llama.cpp:server-cuda # image: ghcr.io/ggml-org/llama.cpp:server-cuda13
image: llama-turboquant:${LLAMA_IMAGE_TAG:-server-cuda12}
build:
context: ${LLAMA_CPP_SRC:-../llama-cpp-turboquant}
# Relative to context (sibling of llama-space). Override for CUDA 13 — см. шапку.
dockerfile: ${LLAMA_DOCKERFILE:-../llama-space/docker/server-cuda12.Dockerfile}
container_name: llama-server container_name: llama-server
ports: ports:
- "${PORT:-8080}:8080" # Явный IPv4 на хосте (избегаем привязки только к [::] в части окружений).
- "0.0.0.0:${PORT:-8080}:8080"
volumes: volumes:
- ./models:/models:ro - ./models:/models:ro
# Старый docker-compose v1 не знает ключ `gpus:` — используем runtime nvidia (см. daemon.json от toolkit). # Старый docker-compose v1 не знает ключ `gpus:` — используем runtime nvidia (см. daemon.json от toolkit).
@@ -46,7 +61,7 @@ services:
- "-c" - "-c"
- "${CTX_SIZE:-50000}" - "${CTX_SIZE:-50000}"
- "-np" - "-np"
- "1" - "4"
- "-fa" - "-fa"
- "on" - "on"
- "--cache-type-k" - "--cache-type-k"
+53
View File
@@ -0,0 +1,53 @@
#!/usr/bin/env bash
# Сборка образов llama-cpp-turboquant (CUDA 12 / CUDA 13).
# Контекст — клон TheTom/llama-cpp-turboquant; Dockerfile'ы — в этом репозитории.
#
# ./docker/build.sh # CUDA 12 (RTX 30xx)
# ./docker/build.sh 13 # CUDA 13 / sm_120 (RTX 50xx)
# ./docker/build.sh 12 13 # оба
#
# Переменные: LLAMA_CPP_SRC, DOCKER (docker|podman)
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SRC="${LLAMA_CPP_SRC:-$(cd "$ROOT/../llama-cpp-turboquant" && pwd)}"
DOCKER="${DOCKER:-docker}"
if [[ ! -f "$SRC/CMakeLists.txt" ]]; then
echo "llama.cpp source not found at: $SRC" >&2
echo "Set LLAMA_CPP_SRC to the TheTom/llama-cpp-turboquant checkout." >&2
exit 1
fi
build_one() {
local ver="$1"
local df tag
case "$ver" in
12)
df="$ROOT/docker/server-cuda12.Dockerfile"
tag="llama-turboquant:server-cuda12"
;;
13)
df="$ROOT/docker/server-cuda13.Dockerfile"
tag="llama-turboquant:server-cuda13"
;;
*)
echo "Unknown CUDA major: $ver (use 12 or 13)" >&2
exit 1
;;
esac
echo "==> Building $tag"
echo " Dockerfile: $df"
echo " Context: $SRC"
"$DOCKER" build -f "$df" -t "$tag" "$SRC"
}
if [[ $# -eq 0 ]]; then
set -- 12
fi
for ver in "$@"; do
build_one "$ver"
done
+90
View File
@@ -0,0 +1,90 @@
# llama-cpp-turboquant → llama-server (CUDA 12).
# Build context: root of https://github.com/TheTom/llama-cpp-turboquant
# docker build -f docker/server-cuda12.Dockerfile -t llama-turboquant:server-cuda12 ../llama-cpp-turboquant
#
# Для RTX 30xx (sm_86) и типичных драйверов с CUDA 12.x.
# Архитектуры — дефолт CMake (включая 86-real); не трогаем, чтобы не ломать
# CMAKE_CUDA_ARCHITECTURES со списком через «;» в shell RUN.
ARG UBUNTU_VERSION=24.04
ARG CUDA_VERSION=12.8.1
ARG GCC_VERSION=14
ARG BASE_CUDA_DEV_CONTAINER=docker.io/nvidia/cuda:${CUDA_VERSION}-devel-ubuntu${UBUNTU_VERSION}
ARG BASE_CUDA_RUN_CONTAINER=docker.io/nvidia/cuda:${CUDA_VERSION}-runtime-ubuntu${UBUNTU_VERSION}
ARG BUILD_DATE=N/A
ARG APP_VERSION=N/A
ARG APP_REVISION=N/A
ARG NODE_VERSION=24
FROM docker.io/node:$NODE_VERSION AS web
ARG APP_VERSION
WORKDIR /app/tools/ui
COPY tools/ui/package.json tools/ui/package-lock.json ./
RUN npm ci
COPY tools/ui/ ./
RUN LLAMA_BUILD_NUMBER="$APP_VERSION" npm run build
FROM ${BASE_CUDA_DEV_CONTAINER} AS build
ARG GCC_VERSION
ARG CUDA_DOCKER_ARCH=default
RUN apt-get update && \
apt-get install -y gcc-${GCC_VERSION} g++-${GCC_VERSION} build-essential cmake python3 python3-pip git libssl-dev libgomp1
ENV CC=gcc-${GCC_VERSION} CXX=g++-${GCC_VERSION} CUDAHOSTCXX=g++-${GCC_VERSION}
WORKDIR /app
COPY . .
COPY --from=web /app/tools/ui/dist tools/ui/dist
RUN if [ "${CUDA_DOCKER_ARCH}" != "default" ]; then \
export CMAKE_ARGS="-DCMAKE_CUDA_ARCHITECTURES=${CUDA_DOCKER_ARCH}"; \
fi && \
cmake -B build -DGGML_NATIVE=OFF -DGGML_CUDA=ON -DGGML_BACKEND_DL=ON -DGGML_CPU_ALL_VARIANTS=ON -DLLAMA_BUILD_TESTS=OFF ${CMAKE_ARGS} -DCMAKE_EXE_LINKER_FLAGS=-Wl,--allow-shlib-undefined . && \
cmake --build build --config Release -j"$(nproc)" --target llama-server
RUN mkdir -p /app/lib && \
find build -name "*.so*" -exec cp -P {} /app/lib \;
RUN mkdir -p /app/full \
&& cp build/bin/llama-server /app/full/
FROM ${BASE_CUDA_RUN_CONTAINER} AS server
ARG BUILD_DATE=N/A
ARG APP_VERSION=N/A
ARG APP_REVISION=N/A
LABEL org.opencontainers.image.created=$BUILD_DATE \
org.opencontainers.image.version=$APP_VERSION \
org.opencontainers.image.revision=$APP_REVISION \
org.opencontainers.image.title="llama-cpp-turboquant" \
org.opencontainers.image.description="llama-server with TurboQuant KV (CUDA 12)" \
org.opencontainers.image.source="https://github.com/TheTom/llama-cpp-turboquant"
RUN apt-get update \
&& apt-get install -y libgomp1 curl \
&& apt autoremove -y \
&& apt clean -y \
&& rm -rf /tmp/* /var/tmp/* \
&& find /var/cache/apt/archives /var/lib/apt/lists -not -name lock -type f -delete \
&& find /var/cache -type f -delete
ENV LLAMA_ARG_HOST=0.0.0.0
COPY --from=build /app/lib/ /app
COPY --from=build /app/full/llama-server /app/
WORKDIR /app
HEALTHCHECK CMD [ "curl", "-f", "http://localhost:8080/health" ]
ENTRYPOINT [ "/app/llama-server" ]
+90
View File
@@ -0,0 +1,90 @@
# llama-cpp-turboquant → llama-server (CUDA 13).
# Build context: root of https://github.com/TheTom/llama-cpp-turboquant
# docker build -f docker/server-cuda13.Dockerfile -t llama-turboquant:server-cuda13 ../llama-cpp-turboquant
#
# Для Blackwell (RTX 50xx, sm_120). Toolkit 13.1.x — под драйвер с nvidia-smi CUDA 13.1.
# Только 120a-real: быстрее сборка, FP4 tensor cores; не для карт старше Blackwell.
ARG UBUNTU_VERSION=24.04
ARG CUDA_VERSION=13.1.2
ARG GCC_VERSION=14
ARG BASE_CUDA_DEV_CONTAINER=docker.io/nvidia/cuda:${CUDA_VERSION}-devel-ubuntu${UBUNTU_VERSION}
ARG BASE_CUDA_RUN_CONTAINER=docker.io/nvidia/cuda:${CUDA_VERSION}-runtime-ubuntu${UBUNTU_VERSION}
ARG BUILD_DATE=N/A
ARG APP_VERSION=N/A
ARG APP_REVISION=N/A
ARG NODE_VERSION=24
FROM docker.io/node:$NODE_VERSION AS web
ARG APP_VERSION
WORKDIR /app/tools/ui
COPY tools/ui/package.json tools/ui/package-lock.json ./
RUN npm ci
COPY tools/ui/ ./
RUN LLAMA_BUILD_NUMBER="$APP_VERSION" npm run build
FROM ${BASE_CUDA_DEV_CONTAINER} AS build
ARG GCC_VERSION
# 120 → CMake подменит на 120a; явно 120a-real под Blackwell (не forwards-compatible).
ARG CUDA_DOCKER_ARCH=120a-real
RUN apt-get update && \
apt-get install -y gcc-${GCC_VERSION} g++-${GCC_VERSION} build-essential cmake python3 python3-pip git libssl-dev libgomp1
ENV CC=gcc-${GCC_VERSION} CXX=g++-${GCC_VERSION} CUDAHOSTCXX=g++-${GCC_VERSION}
WORKDIR /app
COPY . .
COPY --from=web /app/tools/ui/dist tools/ui/dist
RUN if [ "${CUDA_DOCKER_ARCH}" != "default" ]; then \
export CMAKE_ARGS="-DCMAKE_CUDA_ARCHITECTURES=${CUDA_DOCKER_ARCH}"; \
fi && \
cmake -B build -DGGML_NATIVE=OFF -DGGML_CUDA=ON -DGGML_BACKEND_DL=ON -DGGML_CPU_ALL_VARIANTS=ON -DLLAMA_BUILD_TESTS=OFF ${CMAKE_ARGS} -DCMAKE_EXE_LINKER_FLAGS=-Wl,--allow-shlib-undefined . && \
cmake --build build --config Release -j"$(nproc)" --target llama-server
RUN mkdir -p /app/lib && \
find build -name "*.so*" -exec cp -P {} /app/lib \;
RUN mkdir -p /app/full \
&& cp build/bin/llama-server /app/full/
FROM ${BASE_CUDA_RUN_CONTAINER} AS server
ARG BUILD_DATE=N/A
ARG APP_VERSION=N/A
ARG APP_REVISION=N/A
LABEL org.opencontainers.image.created=$BUILD_DATE \
org.opencontainers.image.version=$APP_VERSION \
org.opencontainers.image.revision=$APP_REVISION \
org.opencontainers.image.title="llama-cpp-turboquant" \
org.opencontainers.image.description="llama-server with TurboQuant KV (CUDA 13 / sm_120)" \
org.opencontainers.image.source="https://github.com/TheTom/llama-cpp-turboquant"
RUN apt-get update \
&& apt-get install -y libgomp1 curl \
&& apt autoremove -y \
&& apt clean -y \
&& rm -rf /tmp/* /var/tmp/* \
&& find /var/cache/apt/archives /var/lib/apt/lists -not -name lock -type f -delete \
&& find /var/cache -type f -delete
ENV LLAMA_ARG_HOST=0.0.0.0
COPY --from=build /app/lib/ /app
COPY --from=build /app/full/llama-server /app/
WORKDIR /app
HEALTHCHECK CMD [ "curl", "-f", "http://localhost:8080/health" ]
ENTRYPOINT [ "/app/llama-server" ]
+73
View File
@@ -0,0 +1,73 @@
#!/usr/bin/env bash
# Эквивалент docker-compose.yml для Podman: один запуск — один контейнер llama-server.
# Требования: Podman, драйвер NVIDIA, NVIDIA Container Toolkit с CDI для Podman
# (обычно: nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml && перезапуск).
# GPU по умолчанию: --device nvidia.com/gpu=all
# Если не подходит: export PODMAN_GPU_FLAGS='--gpus all' (Podman 4.3+) или см. доку toolkit.
#
# Из каталога репозитория: ./podman-llama.sh
# Переменные — как в compose / .env: PORT, MODEL_FILE, CPU_MOE, N_CPU_MOE, CTX_SIZE,
# CACHE_TYPE_K, CACHE_TYPE_V, THREADS; образ: IMAGE (по умолчанию server-cuda).
# Порт на хосте: только IPv4 (BIND_HOST по умолчанию 0.0.0.0), иначе Podman часто вешает [::].
# Монтирование models: по умолчанию :ro,z (SELinux — иначе часто Permission denied в rootless).
# Свой суффикс: PODMAN_MODELS_OPTS=z или PODMAN_MODELS_OPTS=Z или пусто PODMAN_MODELS_OPTS=
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$ROOT"
if [[ -f .env ]]; then
set -a
# shellcheck disable=SC1091
source .env
set +a
fi
: "${PORT:=8080}"
: "${MODEL_FILE:=model.gguf}"
: "${CPU_MOE:=0}"
: "${N_CPU_MOE:=99}"
: "${CTX_SIZE:=50000}"
: "${CACHE_TYPE_K:=q8_0}"
: "${CACHE_TYPE_V:=turbo2}"
: "${THREADS:=8}"
: "${IMAGE:=ghcr.io/ggml-org/llama.cpp:server-cuda}"
: "${BIND_HOST:=0.0.0.0}"
: "${PODMAN_MODELS_OPTS:=z}"
# Разбить по пробелам для podman (пусто = только CDI-устройство).
# Пример: PODMAN_GPU_FLAGS='--gpus all'
read -r -a PODMAN_GPU_FLAGS_ARR <<<"${PODMAN_GPU_FLAGS:---device nvidia.com/gpu=all}"
podman run -d \
--name llama-server \
--replace \
--restart no \
--shm-size 1g \
--ulimit memlock=-1:-1 \
-p "${BIND_HOST}:${PORT}:8080" \
-v "${ROOT}/models:/models:ro${PODMAN_MODELS_OPTS:+,${PODMAN_MODELS_OPTS}}" \
-e NVIDIA_VISIBLE_DEVICES=all \
-e "LLAMA_ARG_CPU_MOE=${CPU_MOE}" \
"${PODMAN_GPU_FLAGS_ARR[@]}" \
"$IMAGE" \
-m "/models/${MODEL_FILE}" \
--host 0.0.0.0 \
--port 8080 \
--n-cpu-moe "${N_CPU_MOE}" \
-c "${CTX_SIZE}" \
-np 1 \
-fa on \
--cache-type-k "${CACHE_TYPE_K}" \
--cache-type-v "${CACHE_TYPE_V}" \
--no-mmap \
--mlock \
--ctx-checkpoints 1 \
--cache-ram 0 \
--jinja \
--reasoning on \
--reasoning-budget -1 \
-b 2048 \
-ub 2048 \
--threads "${THREADS}"