# Rollen "gpu-embed" und "gpu-small" (GPU-VMs mit Quadro P2000 + M4000): llama.cpp-Server (Task 6.1). # Maxwell (sm_52) und Pascal (sm_61) brauchen CUDA 12.x – daher eigener Build mit festen Architekturen, # derselbe Stand wie im Benchmark (ADR-0006): b6000 = Commit 4762ad7, CUDA 12.4.0, sm_52;61. # Profile: embed (Embedding + Rerank, gpu-pve44/46), chat (verifier-small/signature-extractor, gpu-pve48). # Ausgerollt von der Ansible-Rolle gpu-llamacpp (.env mit COMPOSE_PROFILES und Karten-UUIDs). # # Kartenwahl: je Dienst device_ids (UUID oder Index aus `nvidia-smi -L`). Ohne Angabe Index 1 = P2000 # (in gpu-pve44/46/48 ist Index 0 die M4000, sie bleibt frei). `count: 1` griffe die M4000. # Netz: Host-Netz wie nex-speech. Veröffentlichte Docker-Ports liefen über DNAT und umgingen ufw; # so gelten spätere ufw-Regeln der VM (Task 4.4). # Datenschutz: kein --verbose (der loggt Prompts), /slots aus (zeigt Prompt-Inhalte), keine Web-Oberfläche. name: knaster-gpu-llamacpp x-logging: &logging driver: local options: {max-size: "5m", max-file: "2"} x-llamacpp: &llamacpp build: context: https://github.com/ggml-org/llama.cpp.git#${LLAMACPP_COMMIT:-4762ad7316dcdec20016ab5985fb46a27902204d} dockerfile: .devops/cuda.Dockerfile target: server args: CUDA_VERSION: ${CUDA_VERSION:-12.4.0} CUDA_DOCKER_ARCH: ${CUDA_DOCKER_ARCH:-52;61} image: knaster/llamacpp-server:${LLAMACPP_REF:-b6000}-cu${CUDA_VERSION:-12.4.0} restart: unless-stopped network_mode: host read_only: true tmpfs: [/tmp:size=64m] labels: {autoheal: "true"} volumes: - ${MODELS_DIR:-/srv/models}:/models:ro logging: *logging services: llamacpp-embed: <<: *llamacpp container_name: llamacpp-embed profiles: ["embed"] command: ["-m", "/models/${EMBED_GGUF:-Qwen3-Embedding-0.6B-Q8_0.gguf}", "--embedding", "--pooling", "${EMBED_POOLING:-last}", "-c", "8192", "-b", "8192", "-ub", "8192", "-np", "1", "-ngl", "99", "--alias", "embed-default", "--metrics", "--no-slots", "--no-webui", "--host", "0.0.0.0", "--port", "8081"] deploy: resources: reservations: devices: [{driver: nvidia, device_ids: ["${EMBED_GPU:-1}"], capabilities: [gpu]}] healthcheck: &hc test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8081/health"] interval: 30s timeout: 5s retries: 3 start_period: 120s llamacpp-rerank: <<: *llamacpp container_name: llamacpp-rerank profiles: ["embed"] command: ["-m", "/models/${RERANK_GGUF:-bge-reranker-v2-m3-Q8_0.gguf}", "--reranking", "-c", "8192", "-b", "8192", "-ub", "8192", "-np", "1", "-ngl", "99", "--alias", "rerank-default", "--metrics", "--no-slots", "--no-webui", "--host", "0.0.0.0", "--port", "8082"] deploy: resources: reservations: devices: [{driver: nvidia, device_ids: ["${RERANK_GPU:-1}"], capabilities: [gpu]}] healthcheck: <<: *hc test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8082/health"] # Qwen3 ohne Denkphase (enable_thinking=false): Verifier und Signatur brauchen kurze, direkte Antworten, # und der Canary-Prober fragt mit max_tokens=5 nach "OK". llamacpp-chat: <<: *llamacpp container_name: llamacpp-chat profiles: ["chat"] command: ["-m", "/models/${CHAT_GGUF:-Qwen3-4B-Q4_K_M.gguf}", "-c", "8192", "-np", "1", "-ngl", "99", "--jinja", "--chat-template-kwargs", "{\"enable_thinking\": false}", "--alias", "verifier-small", "--metrics", "--no-slots", "--no-webui", "--host", "0.0.0.0", "--port", "8080"] deploy: resources: reservations: devices: [{driver: nvidia, device_ids: ["${CHAT_GPU:-1}"], capabilities: [gpu]}] healthcheck: <<: *hc test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8080/health"] # Startet Container mit Label autoheal=true neu, wenn ihr Healthcheck dauerhaft scheitert # (restart: unless-stopped greift nur beim Absturz). Läuft in jedem Profil mit. autoheal: image: willfarrell/autoheal:1.2.0 container_name: llamacpp-autoheal restart: unless-stopped environment: {AUTOHEAL_CONTAINER_LABEL: autoheal} volumes: ["/var/run/docker.sock:/var/run/docker.sock"] logging: *logging # Exporter (node_exporter 9100, nvidia_gpu_exporter 9835) laufen nativ in der VM (Rolle gpu-exporters).