Eigenes lokales KI-System

Ollama installieren

Installation

  1. GPU prüfen

    Der Treiber muss die Grafikkarte erkennen.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Zeigt Grafikkarte, Treiberversion und GPU-Speicherbelegung.
    nvidia-smi
    WSW_SCRIPT
  2. Werkzeuge bereitstellen

    curl lädt das Paket, zstd entpackt es.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Aktualisiert die Paketlisten; installiert noch keine Updates.
    apt-get update
    # Installiert Downloadwerkzeug, TLS-Zertifikate und zstd ohne Rückfragen.
    apt-get install -y curl ca-certificates zstd
    WSW_SCRIPT
  3. Ollama installieren

    Aktuelle stabile Ollama-Version unter /opt/wsw-ollama installieren.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Bricht ab, falls das Installationsverzeichnis bereits existiert.
    test ! -e /opt/wsw-ollama
    # Legt das Installationsverzeichnis an.
    install -d /opt/wsw-ollama
    # Lädt das aktuelle stabile Paket; folgt Umleitungen und wiederholt temporäre Fehler.
    curl -fL --retry 3 https://github.com/ollama/ollama/releases/latest/download/ollama-linux-amd64.tar.zst -o /opt/wsw-ollama/ollama.tar.zst
    # Entpackt das zstd-komprimierte Archiv in das Installationsverzeichnis.
    tar --zstd -xf /opt/wsw-ollama/ollama.tar.zst -C /opt/wsw-ollama
    WSW_SCRIPT
  4. Dienst einrichten

    Eigener Benutzer, Modellordner und lokaler Port. OLLAMA_NO_CLOUD=1 deaktiviert Ollamas Cloud-Modelle und Websuche.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Legt Dienstbenutzer und Gruppe an; erlaubt keine interaktive Anmeldung.
    useradd --system --user-group --home-dir /opt/wsw-ollama/state --shell /usr/sbin/nologin wsw-ollama
    # Legt den Zustandsordner an und übergibt ihn dem Dienstkonto.
    install -d -o wsw-ollama -g wsw-ollama /opt/wsw-ollama/state
    # Schreibt die Dienstkonfiguration; der Block endet bei UNIT.
    cat > /etc/systemd/system/wsw-ollama.service <<'UNIT'
    [Unit]
    # Anzeigename des Dienstes.
    Description=WSW Ollama Qwen3-4B FP16
    # Ordnet den Start nach dem Netzwerk-Ziel ein.
    After=network-online.target
    
    [Service]
    # Führt Ollama unter dem eigenen Benutzer und seiner Gruppe aus.
    User=wsw-ollama
    Group=wsw-ollama
    # Hält Benutzerdaten innerhalb der Installation.
    Environment=HOME=/opt/wsw-ollama/state
    # Speichert Modelle in diesem Verzeichnis.
    Environment=OLLAMA_MODELS=/opt/wsw-ollama/state/models
    # Erlaubt API-Zugriffe nur über den lokalen Port 11435.
    Environment=OLLAMA_HOST=127.0.0.1:11435
    # Sperrt Cloud-Modelle und Websuche, nicht sämtlichen Netzwerkverkehr.
    Environment=OLLAMA_NO_CLOUD=1
    # Hält das Modell nach der letzten Anfrage 30 Minuten geladen; spart erneutes Laden.
    Environment=OLLAMA_KEEP_ALIVE=30m
    # Begrenzt den Standardkontext auf 4.096 Token für kurze Workshop-Aufgaben.
    Environment=OLLAMA_CONTEXT_LENGTH=4096
    # Verarbeitet eine Anfrage gleichzeitig und begrenzt den Kontextspeicherbedarf.
    Environment=OLLAMA_NUM_PARALLEL=1
    # Startet den Ollama-Server.
    ExecStart=/opt/wsw-ollama/bin/ollama serve
    # Startet den Dienst nach einem Fehler erneut.
    Restart=on-failure
    
    [Install]
    # Ordnet den Dienst dem normalen Systemstart zu.
    WantedBy=multi-user.target
    UNIT
    # Liest die neue Dienstkonfiguration ein.
    systemctl daemon-reload
    # Aktiviert den Autostart und startet Ollama sofort.
    systemctl enable --now wsw-ollama
    WSW_SCRIPT
  5. Befehl ollama einrichten

    ollama und ollama run sprechen den Dienst auf Port 11435 an.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Prüft, dass kein vorhandener ollama-Befehl überschrieben wird.
    test ! -e /usr/local/bin/ollama
    # Prüft zusätzlich auf einen symbolischen Link mit fehlendem Ziel.
    test ! -L /usr/local/bin/ollama
    # Erstellt den direkt aufrufbaren Befehl; der Block endet bei CLI.
    cat > /usr/local/bin/ollama <<'CLI'
    #!/bin/sh
    # Verbindet die CLI mit unserem Dienst statt mit dem Standardport.
    export OLLAMA_HOST=127.0.0.1:11435
    # Startet die installierte CLI und reicht alle Argumente unverändert weiter.
    exec /opt/wsw-ollama/bin/ollama "$@"
    CLI
    # Macht den Befehl für alle Benutzer ausführbar; nur root darf ihn ändern.
    chmod 755 /usr/local/bin/ollama
    WSW_SCRIPT
  6. GPU für Ollama freigeben

    Stoppt wsw-vllm und deaktiviert dessen Autostart. Für den Vergleich läuft jeweils ein Modell auf der GPU.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Prüft, ob der andere Workshop-Dienst installiert ist.
    if systemctl cat wsw-vllm.service >/dev/null 2>&1; then
      # Stoppt den Dienst samt laufenden Anfragen und deaktiviert seinen Autostart.
      systemctl disable --now wsw-vllm
    fi
    WSW_SCRIPT
  7. Qwen3-4B laden

    Qwen3 mit vier Milliarden Parametern in FP16, etwa 8,1 GB Download.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Versucht bis zu 30-mal, den gestarteten Dienst zu erreichen.
    for i in $(seq 1 30); do
      # Wartet je Versuch höchstens zwei Sekunden; beendet die Schleife bei Erfolg.
      curl -fsS --max-time 2 http://127.0.0.1:11435/api/version >/dev/null 2>&1 && break
      # Wartet vor dem nächsten Versuch eine Sekunde.
      sleep 1
    done
    # Bricht diesen Block ab, wenn die API noch nicht erreichbar ist.
    curl -fsS --max-time 2 http://127.0.0.1:11435/api/version >/dev/null
    # Lädt das Modell nur nach erfolgreicher Erreichbarkeitsprüfung.
    ollama pull qwen3:4b-fp16
    WSW_SCRIPT
  8. Cloud-Sperre prüfen

    Erwartet: cloud.disabled = true. Paket- und Modelldownloads brauchen weiterhin Internet.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Liest den Cloud-Status; erwartet cloud.disabled = true.
    curl -fsS http://127.0.0.1:11435/api/status
    WSW_SCRIPT
  9. Antwort prüfen

    Dieselbe Testfrage wie bei vLLM: ohne Thinking, Temperatur 0, höchstens 64 Antworttoken.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Zeigt die tatsächlich installierte Ollama-Version.
    ollama --version
    # Zeigt Modellgröße und Gewichtungspräzision; erwartet 4B und F16.
    ollama show qwen3:4b-fp16
    # Sendet die Testfrage mit 4.096 Token Kontext und ausgeschaltetem Thinking.
    curl -fsS --max-time 120 http://127.0.0.1:11435/api/chat \
      -H 'Content-Type: application/json' \
      -d '{"model":"qwen3:4b-fp16","messages":[{"role":"user","content":"Antworte nur: Bereit."}],"stream":false,"think":false,"options":{"num_ctx":4096,"num_predict":64,"temperature":0,"repeat_penalty":1}}'
    # Zeigt geladenes Modell, GPU-Anteil und verwendete Kontextgröße.
    ollama ps
    WSW_SCRIPT
Installation gesamt
bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
nvidia-smi

apt-get update
apt-get install -y curl ca-certificates zstd

test ! -e /opt/wsw-ollama
install -d /opt/wsw-ollama
curl -fL --retry 3 https://github.com/ollama/ollama/releases/latest/download/ollama-linux-amd64.tar.zst -o /opt/wsw-ollama/ollama.tar.zst
tar --zstd -xf /opt/wsw-ollama/ollama.tar.zst -C /opt/wsw-ollama

useradd --system --user-group --home-dir /opt/wsw-ollama/state --shell /usr/sbin/nologin wsw-ollama
install -d -o wsw-ollama -g wsw-ollama /opt/wsw-ollama/state
cat > /etc/systemd/system/wsw-ollama.service <<'UNIT'
[Unit]
Description=WSW Ollama Qwen3-4B FP16
After=network-online.target

[Service]
User=wsw-ollama
Group=wsw-ollama
Environment=HOME=/opt/wsw-ollama/state
Environment=OLLAMA_MODELS=/opt/wsw-ollama/state/models
Environment=OLLAMA_HOST=127.0.0.1:11435
Environment=OLLAMA_NO_CLOUD=1
Environment=OLLAMA_KEEP_ALIVE=30m
Environment=OLLAMA_CONTEXT_LENGTH=4096
Environment=OLLAMA_NUM_PARALLEL=1
ExecStart=/opt/wsw-ollama/bin/ollama serve
Restart=on-failure

[Install]
WantedBy=multi-user.target
UNIT
systemctl daemon-reload
systemctl enable --now wsw-ollama

test ! -e /usr/local/bin/ollama
test ! -L /usr/local/bin/ollama
cat > /usr/local/bin/ollama <<'CLI'
#!/bin/sh
export OLLAMA_HOST=127.0.0.1:11435
exec /opt/wsw-ollama/bin/ollama "$@"
CLI
chmod 755 /usr/local/bin/ollama

if systemctl cat wsw-vllm.service >/dev/null 2>&1; then
  systemctl disable --now wsw-vllm
fi

for i in $(seq 1 30); do
  curl -fsS --max-time 2 http://127.0.0.1:11435/api/version >/dev/null 2>&1 && break
  sleep 1
done
curl -fsS --max-time 2 http://127.0.0.1:11435/api/version >/dev/null
ollama pull qwen3:4b-fp16

curl -fsS http://127.0.0.1:11435/api/status

ollama --version
ollama show qwen3:4b-fp16
curl -fsS --max-time 120 http://127.0.0.1:11435/api/chat \
  -H 'Content-Type: application/json' \
  -d '{"model":"qwen3:4b-fp16","messages":[{"role":"user","content":"Antworte nur: Bereit."}],"stream":false,"think":false,"options":{"num_ctx":4096,"num_predict":64,"temperature":0,"repeat_penalty":1}}'
ollama ps
WSW_SCRIPT
Leistung einstellen
  1. Modell geladen halten und Kontext begrenzen

    Die Installation setzt 30 Minuten Modellhaltezeit, 4.096 Token Standardkontext und eine parallele Anfrage. Das spart erneutes Laden und begrenzt den Speicherbedarf. Größeren Kontext nur bei Bedarf wählen. Flash Attention wird bei unterstütztem Modell und GPU automatisch verwendet.

  2. KV-Cache verkleinern · optional

    Nur für einen gesonderten Versuch: q8_0 benötigt ungefähr halb so viel KV-Cache-Speicher wie f16; Modellgewichte bleiben FP16. Für den Vergleich mit vLLM den Standardcache verwenden.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Legt einen Ordner für zusätzliche Diensteinstellungen an.
    install -d /etc/systemd/system/wsw-ollama.service.d
    # Schreibt die optionale Cache-Konfiguration.
    cat > /etc/systemd/system/wsw-ollama.service.d/kv-cache.conf <<'CACHE'
    [Service]
    # Aktiviert das für den quantisierten KV-Cache benötigte Flash Attention.
    Environment=OLLAMA_FLASH_ATTENTION=1
    # Verwendet einen 8-Bit-KV-Cache anstelle des 16-Bit-Standards.
    Environment=OLLAMA_KV_CACHE_TYPE=q8_0
    CACHE
    # Liest die zusätzliche Dienstkonfiguration ein.
    systemctl daemon-reload
    # Startet Ollama mit der neuen Cache-Einstellung; laufende Anfragen enden.
    systemctl restart wsw-ollama
    WSW_SCRIPT
  3. KV-Cache wieder auf Standard setzen

    Entfernt nur die zusätzliche Cache-Konfiguration.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Entfernt die hier angelegte Cache-Anpassung.
    rm -f -- /etc/systemd/system/wsw-ollama.service.d/kv-cache.conf
    # Liest die verbleibende Dienstkonfiguration ein.
    systemctl daemon-reload
    # Startet Ollama wieder mit dem Standardcache; laufende Anfragen enden.
    systemctl restart wsw-ollama
    WSW_SCRIPT
  4. Zu vLLM wechseln

    Wechselt zum bereits installierten wsw-vllm; nur dieser Dienst erhält Autostart.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Stoppt den aktuellen Dienst samt laufenden Anfragen und deaktiviert seinen Autostart.
    systemctl disable --now wsw-ollama
    # Aktiviert den Autostart des anderen Dienstes und startet ihn.
    systemctl enable --now wsw-vllm
    WSW_SCRIPT

Deinstallation

  1. Dienst entfernen

    Ollama stoppen und den automatischen Start entfernen.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Stoppt Ollama und deaktiviert seinen Autostart.
    systemctl disable --now wsw-ollama
    # Löscht die Dienstkonfiguration.
    rm /etc/systemd/system/wsw-ollama.service
    # Entfernt auch die optionalen Diensteinstellungen dieser Installation.
    rm -rf -- /etc/systemd/system/wsw-ollama.service.d
    # Liest die verbleibenden Dienstkonfigurationen neu ein.
    systemctl daemon-reload
    WSW_SCRIPT
  2. Installation und Modelle löschen

    Entfernt ollama und den gesamten Installationsordner: Qwen3-4B, weitere dort gespeicherte Modelle und Dienstzustand.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Entfernt den direkt aufrufbaren ollama-Befehl.
    rm -f -- /usr/local/bin/ollama
    # Löscht Installation, heruntergeladene Modelle und Dienstzustand endgültig.
    rm -rf -- /opt/wsw-ollama
    WSW_SCRIPT
  3. Dienstkonto entfernen

    Das eigens angelegte Konto entfernen.

    # Führt den Block separat aus; bei Fehlern bricht nur dieser Block ab.
    bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
    # Entfernt das eigens angelegte Dienstkonto.
    userdel wsw-ollama
    # Prüft, ob die zugehörige Gruppe noch existiert.
    if getent group wsw-ollama >/dev/null; then
      # Entfernt die gegebenenfalls verbliebene Dienstgruppe.
      groupdel wsw-ollama
    fi
    WSW_SCRIPT
Deinstallation gesamt
bash -e <<'WSW_SCRIPT' || printf 'Abgebrochen (Fehler %s).\n' "$?" >&2
systemctl disable --now wsw-ollama
rm /etc/systemd/system/wsw-ollama.service
rm -rf -- /etc/systemd/system/wsw-ollama.service.d
systemctl daemon-reload

rm -f -- /usr/local/bin/ollama
rm -rf -- /opt/wsw-ollama

userdel wsw-ollama
if getent group wsw-ollama >/dev/null; then
  groupdel wsw-ollama
fi
WSW_SCRIPT