mit Ollama und Open WebUI
Seit dem kometenhaften Aufstieg von ChatGPT sind AI (Artificial Intelligence) und LLMs (Large Language Models) in aller Munde. Es gibt kaum jemanden, der ChatGPT (oder einer seiner Kollegen) nicht im beruflichen oder privaten Umfeld nutzt. Was weniger bekannt ist, dass man LLMs auch herunterladen und lokal laufen lassen kann.
Diese hat folgende Vorteile:
- Man kann experimentieren mit verschiedenen LLMs und Versionen.
- Alles ist lokal, d.h.man kann auch Anfragen mit Business relevanten Informationen machen, da keine Informationen auf fremden Servern landen.
Eine Möglichkeit dafür ist das Open-Source-Projekt Ollama, mit dem man kleinere LLMs herunterladen und auf dem lokalen Computer ausführen kann. In diesem Artikel wollen wir in einem ersten Schritt anschauen, wie man Ollama installieren kann. Und in einem zweiten Schritt werden wir noch ein schickes Web UI installieren, um komfortabler auf Ollama zuzugreifen.
Lokale Installation von Ollama
Unter https://ollama.com/download gibt es Downloads für Mac/Windows/Linux. Und unter https://ollama.com/library findet man die Liste der unterstützten LLMs.
Es gibt LLMs verschiedener bekannter Tech Konzerne. Unter anderem:
- Llama von Meta/Facebook
- Phi von Microsoft
- Gemma von Google
Nach der Installation von Ollama kann man via Command Line LLMs herunterladen. Hier gezeigt am Beispiel von Llama (in der Version 3.2):
>> ollama pull llama3.2
Man kann schauen, was für LLMs man schon heruntergeladen hat und wie gross diese sind:
>> ollama list
Und man kann eine herunter geladene LLM starten und in der Console direkt Anfragen stellen:
>> ollama run llama3.2
Beim Aufruf von run kann man zusätzlich die Anfrage mitgeben. Wenn ich als Beispiel wissen möchte, wie man in Java eine Collection umdrehen kann, kann ich das mit folgendem Aufruf machen:
>> ollama run llama3.2 how can I reverse a collection in java
Funktioniert gut. Via Docker können wir uns noch ein UI installieren, so dass die Anfragen noch komfortabler gestellt werden können.
Installation UI zu Ollama via Docker
Open WebUI https://docs.openwebui.com bietet ein Web UI an für Ollama. Details zur Installation findet man unter: https://docs.openwebui.com/getting-started
Folgender Command installiert das UI und startet einen lokalen Webserver:
>> docker run -d \
-p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
Hier ein paar Erklärungen zu den Parametern beim Docker Aufruf:
docker run -d
- Startet den Container (mit dem UI) im Hintergrund.
-p 3000:8080
- Mappt den Port 8080 im Docker Container auf Port 3000 auf dem lokalen Rechner.
—add-host=host.docker.internal:host-gateway
- host.docker.internal ist der standardmäßige Container-Hostname, der durch Docker definiert wird. Dieser wird nun an die gleiche IP-Adresse des Hosts-Gateways gebunden.
-v open-webui:/app/backend/data
- Ein kurzer Einschub: was sind Docker Volumes und warum brauchen wir diese. Docker Volumes sind ein Mechanismus zur persistenten Datenspeicherung in Docker ( eine Art “virtueller” Ordner auf dem Host-System, der für die Daten der Anwendung im Container verwendet wird). Diese Daten bleiben bestehen, wenn man einen Container stoppt oder löscht.
- Erstellt ein Docker Volume mit dem Namen open-webui auf dem lokalen Rechner und mappt dieses auf den Ordner /app/backend/data im Container. Dies dient zum Austausch von Daten zwischen lokalem Rechner und Docker. Durch Aufruf von
docker volume inspect open-webui
bekommt man mehr Informationen zum Volume.
–name open-webui
- Name des Containers
ghcr.io/open-webui/open-webui:main
- Docker Image Name für das Open WebUI
Danach hat man Zugriff auf das UI direkt im Browser via http://localhost:3000
Beim ersten Start muss man sich noch mit Name, E-Mail und Passwort registrieren. Aber das ist nur für die lokale Installation. Dummy Werte genügen völlig für eine erfolgreiche Installation.
Danach wird man auf die Hauptseite weitergeleitet. Oben links unter “Select a model” kann man eine der lokal (via ollama) installierten LLMs auswählen.
Es wird Zeit für unsere erste Anfrage an die lokale LLM. Ich möchte, dass mir die LLM “llama” Java Code für FizzBuzz generiert. FizzBuzz ist folgendermaßen definiert (und in der Welt der Software Entwickler ziemlich bekannt).
Schreibe ein Programm, das die Zahlen von 1 bis 100 ausgibt. Aber für Vielfache von 3 gebe „Fizz“ anstelle der Zahl aus und für Vielfache von 5 gebe „Buzz“ aus. Für Zahlen, die ein Vielfaches von 3 und 5 sind, gebe „FizzBuzz“ aus..
Fragen wir doch mal “llama”. Die Eingabe von “fizzbuzz in Java” sollte dazu genügen:
- llama kennt FizzBuzz, generiert Java Code dafür und liefert noch zusätzliche Infos.
- Das Fenster mit dem Code hat einen “Copy Code” Link der den Code direkt ins Clipboard kopiert.
- Und das UI kommt in einem ChatGPT ähnlichen Design daher.
Ziemlich cool, lokal und gratis !!!!
Integration von ChatGPT
Es gibt auch die Möglichkeit ChatGPT (OpenAI) ins Open WebUI zu integrieren. OpenAI ist eigentlich schon integriert im Open WebUI, muss aber noch konfiguriert werden.
Als ersten Schritt braucht man einen OPEN_API_KEY. Diesen erhält man durch Registrierung auf https://platform.openai.com und Hinterlegung einer Kreditkarte
Anfragen an ChatGPT sind kostenpflichtig. Bezahlt wird aber per Anfrage. Die Kosten sind für einen einzelnen Benutzer kleiner als ein normales monatliches Abonnement bei ChatGPT.
Für die Integration gibt es 2 Möglichkeiten:
Konfiguration in Open WebUI
Es gibt die Möglichkeit, Docker wie bisher zu starten und in Open WebUI den OPEN_API_KEY zu konfigurieren. Dafür muss man unter “Admin Panel > Settings > Connections > OpenAI API” seinen OPEN_API_KEY hinein kopieren. Unter “Select a model” stehen dann verschiedene ChatGPT LLMs zur Verfügung.
Konfiguration in Docker
Es gibt aber auch die Möglichkeit, OpenAI direkt beim Docker Aufruf zu konfigurieren.
>> docker run -d
-p 3000:8080
-e OPENAI_API_KEY=your_secret_key
-v open-webui:/app/backend/data
--name open-webui
--restart always
ghcr.io/open-webui/open-webui:main
Es gibt einen zusätzlichen Parameter -e
-e OPENAI_API_KEY=your_secret_key
- Einfach your_secret_key ersetzen durch den eigenen OPEN_API_KEY.
Einschub Security: Aus Security Gründen wäre es empfehlenswert, den OPEN_API_KEY nicht direkt beim Docker Aufruf mitzugeben, sondern in einer Environment Variable abzulegen und diese dann zu benutzen. Auf einem Mac (unter OSX) kann ich ein Variable für den OPEN_API_KEY im File “.zprofile” definieren und exportieren:
export OPENAI_API_KEY=lorem_ipsum_dolor_sit_amet
und diese dann beim Aufruf verwenden
>> docker run -d
-p 3000:8080
-e OPENAI_API_KEY=$OPENAI_API_KEY
-v open-webui:/app/backend/data
--name open-webui
--restart always
ghcr.io/open-webui/open-webui:main
Wie man das auf anderen Betriebssystemen macht, fragt man am Besten google oder eine (lokale) LLM.
Danach stehen unter “Select a model” verschiedene ChatGPT LLMs zur Verfügung.
Aber Vorsicht: ChatGPT ist ins Open WebUI integriert, aber ChatGPT läuft nicht lokal. Die Request werden an einen externen Server weitergeleitet.
Performance:
Wie sieht es eigentlich mit der Performance aus? Kommt auf die Grösse der ausgewählten LLM und der eigenen Hardware an. Ich habe via Ollama nachgefragt, was die Hardware Requirements wären für Ollama. Die Antwort war: Intel Core i9 mit 16 GB RAM als Minimum und GPUs wären schön (und diese werden von Ollama direkt unterstützt). Ja nach ausgewählter LLM können sich die Anforderungen erhöhen.
Zur Anschauung habe ich mal die gleiche Abfrage auf meinen aktuellen und meinem “legacy” Laptop gemacht und verglichen.
- Als LLM verwende ich llama.3.2 in der grösseren 3B Version (3B heisst, dass das Modell 3 Milliarden Parameter hat). Zusätzlich gäbe es noch eine kleiner 1B Variante.
- Wir machen folgende Anfrage direkt in Ollama (ohne den Umweg über Open WebUI):
>> ollama run llama3.2 how can I reverse a collection in java
Hardware “Legacy” Laptop
- 5+ Jahre Jahre alt
- Hardware: Dual-Core Intel Core i7 mit 16GB RAM
- Vor der Anfrage hat die CPU ein Auslastung von unter 2%
- Beim Start der Anfrage steigt die CPU Auslastung auf ca. 50%
- Nach der vollständigen Verarbeitung der Anfrage geht die CPU Auslastung wieder auf den ursprünglichen Wert zurück.
- Die CPU History zeigt, dass 2 Cores ausgelastet sind für die Bearbeitung der Anfrage. Und die Anfrage dauert (habe mehrere Versuche gemacht) zwischen 40s und 60s.
Hardware “aktueller” Laptop
- 1+ Jahr alt
- Hardware: M Prozessor mit 32+GB RAM
- Vor der Anfrage hat die CPU ein Auslastung von unter 2%
- Beim Start der Anfrage bleibt die CPU Auslastung fast gleich.
- Gleichzeitig geht die GPUs Nutzung kurzzeitig nach oben. D.h. die ganze Arbeit wird von den GPUs gemacht und die CPUs merken davon praktisch nichts. Und das wird automatisch von Ollama gemacht. Nach der vollständigen Verarbeitung der Anfrage geht die GPU Auslastung wieder auf den ursprünglichen Wert zurück.
- Die Anfrage dauert um die 6 Sekunden.
Zusammenfassend würde ich sagen: Spass macht es nur auf einem Laptop mit aktueller Hardware. Kleinere LLMs könnte man eventuell auch auf einem älteren Laptop laufen lassen, aber das muss man einfach selber ausprobieren.
Fazit:
AI und LLMs sind ein spannendes Thema, Als Softwareentwickler ist es ein guter Zeitpunkt, etwas in diese AI Welt einzutauchen. Ollama mit den lokalen LLMs ist dazu ein einfacher und kostengünstiger Einstieg für eigene Experimente (mit verschiedenen LLMs). Und man gewöhnt sich schnell daran. Ich selber benutze es oft in meinem Arbeitsalltag als Alternative zu klassischen Google Abfragen.