This guide is the shortest path from fresh clone to a working local sprachwerker instance with automatic llama.cpp build and automatic Voxtral download.
Live-tested on a ROCm machine on March 26, 2026.
cp .env.example .envRecommended defaults:
- ROCm host:
LLAMA_BACKEND=rocmASR_BASE_IMAGE=rocm/dev-ubuntu-22.04:6.3.4-completeLLAMA_BUILDER_BASE_IMAGE=rocm/dev-ubuntu-22.04:6.3.4-complete
- CUDA host:
LLAMA_BACKEND=cudaASR_BASE_IMAGE=nvidia/cuda:12.4.1-runtime-ubuntu22.04LLAMA_BUILDER_BASE_IMAGE=nvidia/cuda:12.4.1-devel-ubuntu22.04
Optional:
- Set
HF_TOKENif you use a gated or private Hugging Face repo. - Leave
UI_DEFAULT_LANGempty if you wantAPP_REGION_GROUPto decide between German and English.
ROCm:
docker compose -f docker-compose.yml -f docker-compose.rocm.yml up --build -dCUDA:
docker compose -f docker-compose.yml -f docker-compose.cuda.yml up --build -dThe first start can take a while.
Important:
http://127.0.0.1:8095/stays offline until both bootstrap jobs are done.asr-apican sit inCreatedstate for a while. That is expected.- The main Voxtral GGUF is large and can take many minutes to download.
Order of work:
- Docker builds the runtime image and the
llama-builderimage. llama-builderclones and compilesllama.cpp.model-fetcherdownloads the required Voxtral files from Hugging Face.asr-apistarts only after both steps completed successfully.
Persistent Docker volumes:
sprachwerker_llama-binsprachwerker_llama-srcsprachwerker_voxtral-models
That means later restarts are much faster unless you force a rebuild or change model files.
Container state:
docker ps -a --format '{{.Names}}\t{{.Status}}' | grep sprachwerkerBuilder logs:
docker logs sprachwerker-llama-builderModel download logs:
docker logs sprachwerker-model-fetcherIf the Hugging Face download looks quiet, that does not automatically mean it is stuck. Check whether the incomplete file keeps growing:
docker exec sprachwerker-model-fetcher sh -lc 'stat -c "%n %s %y" /models/.cache/huggingface/download/*.incomplete 2>/dev/null || true'Check built llama.cpp binaries:
docker run --rm -v sprachwerker_llama-bin:/artifacts ubuntu:22.04 ls -lah /artifactsCheck downloaded Voxtral files:
docker run --rm -v sprachwerker_voxtral-models:/models ubuntu:22.04 ls -lah /modelsExpected files:
mistralai_Voxtral-Small-24B-2507-Q4_K_M.ggufmmproj-mistralai_Voxtral-Small-24B-2507-f16.gguf
Once sprachwerker is running:
curl -fsS http://127.0.0.1:8095/healthThen open:
- UI:
http://127.0.0.1:8095/ - Health:
http://127.0.0.1:8095/health
sprachwerker stays in Created:
- Usually
model-fetcheris still downloading orllama-builderhas not completed yet. - Check both containers first.
llama-builder exits with error:
- ROCm or CUDA container access is not configured correctly for the host.
- The selected base image does not match the backend.
- Upstream
llama.cppbuild flags changed.
model-fetcher fails:
- Wrong repo or file names in
.env - Gated model repo without
HF_TOKEN - Temporary network or Hugging Face rate limit issue
/health returns ok but model_exists=false:
- The model volume does not contain the expected file names.
VOXTRAL_MODEL_FILENAMEorVOXTRAL_MMPROJ_FILENAMEdo not match the real files.
Inference starts but crashes:
- Backend mismatch between built
llama.cppand the host GPU stack VOXTRAL_GPU_LAYERSis too aggressive for the available VRAM
To force a fresh llama.cpp build:
LLAMA_FORCE_REBUILD=1Then rerun:
docker compose -f docker-compose.yml -f docker-compose.rocm.yml up --build -dIf you want a fully clean bootstrap, also remove the named volumes first:
docker compose -f docker-compose.yml -f docker-compose.rocm.yml down
docker volume rm sprachwerker_llama-bin sprachwerker_llama-src sprachwerker_voxtral-models