Lokale LLMs mit llama.cpp und Open WebUI

Share
Lokale LLMs mit llama.cpp und Open WebUI
Photo by Paz Arando on Unsplash

Nachdem ich diesen Artikel über die vielfältige Kritik an Ollama gelesen habe, hab' ich mir überlegt, stattdessen mal llama.cpp auszuprobieren. Weil ich schon vorher das Open WebUI genutzt habe, möchte ich das auch für llama.cpp nutzen. Und weil ich Dienste gerne in Docker laufen lasse, weil das auf allen Betriebssystemen (relativ) gleich funktioniert, mache ich das auch in dieser Anleitung.

Diese Anleitung ist primär für Linux gedacht und auch mit Linux getestet. Zu Windows kann ich keine Aussage treffen, aber Docker sollte auf Windows eigentlich genauso funktionieren.
Auf MacOS funktioniert das beschriebene Setup zwar, aber Docker kann auf aktuellen Apple-Geräten nicht die GPU nutzen und ist daher deutlich langsamer. Empfehlenswert sind hier die llama.cpp Desktop-App oder oMLX, was das Apple-eigene MLX-Framework nutzt.

Ich gehe davon aus, dass ihr Docker und Docker Compose auf eurem System installiert habt. Wenn nicht, macht das jetzt z. B. mit dieser Anleitung. Und ich nutze lieber Compose-Dateien statt docker run, um meine Dienste zu managen, weil ich damit auf einen Blick sehe, wie etwas konfiguriert ist und die Konfiguration sehr einfach anpassen kann.

Ich habe llama.cpp und Open WebUI in getrennte Compose-Dateien geschrieben, aber man kann auch beide in eine schreiben. Dazu unten mehr.
Außerdem nutze ich eine AMD-Grafikkarte, die ich in meinem Beispiel für llama.cpp nutze. Wenn ihr keine oder eine andere Grafikkarte nutzt, müsst ihr die Konfiguration entsprechend anpassen.

llama.cpp

Hier eine einfache compose.yml für llama.cpp:

services:
  llama.cpp:
    image: ghcr.io/ggml-org/llama.cpp:server-vulkan
    container_name: Llama-Server
    ports:
      - 4567:8080
    volumes:
      - ./models:/models
    restart: unless-stopped
    command: [
      "--host", "0.0.0.0",
      "--port", "8080",
      "--models-dir", "/models",
      "--n-gpu-layers", "all"
    ]
    devices:
      - /dev/dri:/dev/dri

Kurze Erläuterung:
image - Das Image findet man hier, wichtig ist eigentlich nur, dass man das llama-server-Image nimmt. In meinem Fall habe ich davon die Vulkan-Version genommen, um meine AMD-Grafikkarte nutzen zu können.
ports - links steht der Port, über den man llama.cpp später erreicht. Der default ist 8080, aber ihr könnt jeden freien Port nehmen.
volumes - Hier mountet ihr das Verzeichnis in euren Container, in den ihr später die Modelle als GGUF-Dateien ablegt.
command - Der Befehl startet den llama-server auf Interface 0.0.0.0 und Port 8080 (das ist der Port im Container), um ihn von außerhalb des Containers erreichbar zu machen. Außerdem wird auf das Verzeichnis verwiesen, in dem unsere Modelle liegen und es sollen alle Modell-Layer in den VRAM der GPU geladen werden. Der letzte Punkt ist optional. Alle Parameter möglichen findet man hier.
devices - Hiermit gebe ich dem Container Zugriff auf meine Grafikkarte (/dev/dri = Direct Rendering Interface). Das ist ebenfalls optional.

Dann einfach den Container mit docker compose up -d starten.

Open WebUI

Und hier eine compose.yml für Open WebUI:
Ein Beispiel findet man auch hier, wenn man über der Überschrift "Quick Start with Docker" auf "Docker Compose" klickt.

services:
  openwebui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: Open-WebUI
    ports:
      - 3000:8080
    volumes:
      - open-webui:/app/backend/data
    restart: unless-stopped
volumes:
  open-webui:

Die Konfiguration ist ziemlich selbsterklärend. Statt eines Verzeichnisses, was in den Container gemountet wird, wird hier ein default Docker Volume genutzt, das ist aber ebenfalls eine Geschmacksfrage.

Den Container ebenfalls mit docker compose up -d starten.

Jetzt solltet ihr in eurem Browser auf http://localhost:3000 gehen können und euch einen Account beim Open WebUI erstellen können. Der Account ist nur lokal.

Registrierung beim Open WebUI

Open WebUI mit llama.cpp verbinden

Um jetzt llama.cp in Open WebUI nutzen zu können, muss man die beiden Dienste miteinander verbinden. Das ist hier sehr anschaulich erläutert. Also im Open WebUI die Einstellungen öffnen, auf Connections klicken und eine Verbindung hinzufügen. Wichtig: weil beide Dienste in getrennten Compose-Dateien laufen, muss man dort die lokale IP-Adresse eures Geräts eingeben, nicht localhost oder 127.0.0.1. Also z. B. 192.168.178.123.
Ihr könnt die Verbindung testen, in dem ihr auf das kleine Symbol mit den kreisenden Pfeilen drückt. Wenn dann "Server connection verified" angezeigt wird, ist alles korrekt konfiguriert.

Modell herunterladen

Jetzt muss man noch ein Modell herunterladen, was man mit llama.cpp nutzen will. Dazu kann man z. B. hier nach Modellen suchen, Qwen 3.6 oder Ministral 3 sind empfehlenswerte Modelle, aber insgesamt hängt die Auswahl des Modells stark von euren Präferenzen und vor allem der genutzten Hardware ab. Generell können alle Modelle, die als GGUF-Dateien zur Verfügung stehen genutzt werden.

Ich wähle beispielhaft Ministral 3 aus, weil ich weiß, dass es relativ kleine Modelle sind, die ich mit meiner Hardware mühelos betreiben kann. In der Übersicht klickt man jetzt auf das Emoji-Symbol neben dem gewünschten Modell, um zu Hugging Face zu gelangen. In meinem Fall klicke ich auf "Ministral 3 3B".
Unter dem Modellnamen steht hier auch klein die Anforderung an den Speicher, damit ist RAM bzw. VRAM gemeint. Ich habe eine AMD Radeon RX 7800 XT mit 16 GB VRAM, das passt also exakt.

Auf der Hugging Face-Seite des Modells klickt man jetzt auf den Reiter "Files and versions" und lädt dort die .gguf-Datei herunter.

Die heruntergeladene Datei muss man jetzt in das Modell-Verzeichnis ablegen, was in den llama.cpp-Container gemountet ist. Also in das Verzeichnis ./models in dem Verzeichnis, in dem auch die docker-compose.yml liegt.
Danach muss man den llama.cpp-Container womöglich einmal neu starten, damit das Verzeichnis eingelesen wird und dann sollte das Modell im Textfeld im Open WebUI angezeigt werden.

Jetzt kann man das Modell nutzen, fine-tunen oder andere Modelle herunterladen und ausprobieren.