Eigenes lokales KI-System
»Ollama installieren
Installation
- 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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_SCRIPTLeistung einstellen
- 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.
- 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 - 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 - 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
- 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 - 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 - 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