Passende Sprachmodelle für die eigene Hardware finden

Wer Sprachmodelle lokal ausführen möchte, steht zunächst vor der Frage, welche Modelle auf der vorhandenen Hardware sinnvoll genutzt werden können. Neben der Größe des Modells spielen hierbei der verfügbare Speicher und die gewünschte Kontextgröße eine Rolle. Das Werkzeug llmfit hilft dabei, passende Modelle für den eigenen Rechner zu finden.

Die interaktive Oberfläche von llmfit

Dazu erkennt llmfit unter anderem den Prozessor, den Arbeitsspeicher sowie vorhandene Grafikkarten und deren Speicher. Auch der gemeinsam genutzte Speicher von Apple-Silicon-Systemen wird berücksichtigt. Auf dieser Grundlage bewertet das Werkzeug die Modelle aus seinem Katalog nach Speicherbedarf, geschätzter Geschwindigkeit, Qualität und Kontextgröße. Daneben wird eine passende Quantisierung ermittelt, bei welcher die Modellgewichte mit geringerer Genauigkeit gespeichert werden, um den Speicherbedarf zu reduzieren. Alternativ können auch andere Rechnerkonfigurationen hinterlegt werden.

Unter macOS kann llmfit über Homebrew installiert werden:

brew install llmfit

Nach der Installation kann das Werkzeug mittels:

llmfit

gestartet werden. Damit öffnet sich eine interaktive Oberfläche im Terminal. Im oberen Bereich werden die erkannten Hardwaredaten dargestellt. Darunter befindet sich eine Tabelle mit den bewerteten Modellen, einschließlich der geschätzten Geschwindigkeit in Tokens pro Sekunde und der empfohlenen Quantisierung. Für eine einfache tabellarische Ausgabe kann alternativ:

llmfit fit

genutzt werden. Empfehlungen lassen sich außerdem nach ihrem Einsatzzweck filtern. Wer beispielsweise ein Modell für die Softwareentwicklung sucht, kann die Ergebnisse als JSON ausgeben lassen:

llmfit recommend --json --use-case coding --limit 3

Die Geschwindigkeitsangaben sollten zunächst als Schätzungen verstanden werden. Für eine Messung über eine bereits laufende lokale Laufzeitumgebung, beispielsweise Ollama, steht das Subkommando:

llmfit bench

zur Verfügung. Damit kann die Einschätzung durch Messwerte auf dem eigenen Rechner ergänzt werden. Der Quelltext von llmfit ist auf GitHub zu finden. Lizenziert ist das Werkzeug unter der MIT-Lizenz und damit freie Software.

Fallout 1 und 2 unter macOS spielen

Die ersten beiden Fallout-Spiele lassen sich dank der Fallout Community Edition und der Fallout 2 Community Edition auch auf aktuellen Macs spielen. Dabei handelt es sich um Neuimplementierungen der ursprünglichen Spielengines, welche nativ auf Intel-Macs und Macs mit Apple Silicon laufen. Die Spieldaten der Originalspiele werden allerdings weiterhin benötigt.

Um die Einrichtung zu vereinfachen, habe ich zwei Installationsskripte geschrieben. Diese extrahieren die benötigten Daten aus den GOG-Offline-Installern, laden die aktuelle macOS-Version der jeweiligen Community Edition herunter und erstellen die passende Konfiguration. Anschließend wird das Spiel direkt gestartet.

Für Fallout 1 werden diese Dateien aus dem GOG-Offline-Installern erwartet:

setup_fallout_1.2_(27130).exe
setup_fallout_1.2_(27130)-1.bin

Für Fallout 2 sind es:

setup_fallout_2_1.02_gog_v1_(77792).exe
setup_fallout_2_1.02_gog_v1_(77792)-1.bin

Liegen die Skripte und Installationsdateien beispielsweise im Ordner Fallout innerhalb des Benutzerverzeichnisses, wird im Terminal zunächst in diesen gewechselt:

cd ~/Fallout
chmod +x install-fallout-1.sh install-fallout-2.sh

Anschließend kann Fallout 1 mit:

./install-fallout-1.sh

installiert werden. Für Fallout 2 lautet der entsprechende Aufruf:

./install-fallout-2.sh

Die Installation erfolgt unter /Applications/Fallout beziehungsweise /Applications/Fallout 2. Für diese Verzeichnisse und das Verzeichnis der Skripte müssen Schreibrechte vorhanden sein. Die Disk-Images der Community Editions werden automatisch heruntergeladen und eingebunden; ein manueller Download ist nicht notwendig.

Nach der Installation lassen sich die Spiele jederzeit über den Finder starten. Die Anwendungen heißen Fallout Community Edition.app und Fallout II Community Edition.app und befinden sich in den jeweiligen Installationsverzeichnissen. Die Installationsskripte stehen unter der MIT-Lizenz. Der Quelltext und die ausführliche Anleitung sind im GitHub-Repository zu finden.

M5Stack

In den letzten Wochen beschäftigte ich mich mit unterschiedlichen Mikrocontrollern und Geräten auf Basis des ESP32. Dabei stieß ich auf die Produkte des chinesischen Herstellers M5Stack.

Die Stick S3 von M5Stack

Bei M5Stack handelt es sich nicht nur um einen Hersteller einzelner Entwicklungsboards, sondern um ein relativ umfangreiches Ökosystem. Angeboten werden unterschiedliche Mikrocontroller, Displays, Sensoren und Erweiterungsmodule. Interessant sind hierbei vor allem die Geräte, welche bereits mit Display, Gehäuse, Tasten und je nach Modell einem Akku ausgestattet sind.

Interessant ist das System vor allem dann, wenn nicht die Entwicklung der Hardware selbst im Vordergrund steht. Für ein klassisches Mikrocontrollerprojekt müssen neben dem Mikrocontroller meist Display, Stromversorgung und Bedienelemente ausgewählt und miteinander verbunden werden. Hier kann hingegen gleich mit fertiger Hardware gestartet werden, welche trotzdem über entsprechende Schnittstellen erweitert werden kann.

Die Stopwatch von M5Stack

Das Angebot selbst ist mittlerweile relativ unübersichtlich geworden und besteht aus einer Reihe unterschiedlicher Produktfamilien. Dazu gehören unter anderem die Core-, Stick-, Atom-, Stamp- und Paper-Geräte.

Für die Programmierung stellt M5Stack mit UIFlow eine eigene Entwicklungsumgebung zur Verfügung. Daneben können die Geräte unter anderem über das Arduino- und Espressif-Ökosystem programmiert werden. Da viele der Geräte auf Mikrocontrollern von Espressif basieren, ist daneben die Entwicklung mit Rust interessant. Für den ESP32 existiert mittlerweile eine entsprechende Rust-Unterstützung. Bei spezielleren Komponenten der M5Stack-Geräte kann es allerdings notwendig sein, entsprechende Treiber oder Abstraktionen selbst zu implementieren.

In Deutschland können die Geräte z. B. über BerryBase bezogen werden, auch wenn viele Geräte im Moment schnell ausverkauft sind.

Spieleerinnerungen #8

In dieser Episode von Deus ex machina rede ich mit Felix wieder über Spiele, die uns im Gedächtnis geblieben sind und uns nachhaltig beeinflusst haben. Konkret geht es diesmal um Fallout 1 und 2, Kerbal Space Program und The Final Station.

Falls noch nicht geschehen, könnt ihr Deus ex machina in eurem Podcatcher abonnieren oder eine Bewertung auf Apple Podcasts hinterlassen. Daneben ist die Unterstützung über Tone H möglich.

Tool-Aufrufe unter OpenCode reparieren

Der Open-Source AI-Coding-Agent OpenCode lässt sich nicht nur mit den üblichen Cloud-Anbietern, sondern auch mit lokalen bzw. selbst gehosteten Sprachmodellen nutzen. Dazu kann beispielsweise Ollama über dessen OpenAI-kompatible API angebunden werden.

OpenCode Desktop unter macOS

In Verbindung mit bestimmten Modellen wie dem qwen3-coder:30b zeigte sich allerdings ein interessantes Problem. Tool-Aufrufe funktionieren nicht, da sie oft als Klartext ausgeben und nicht korrekt interpretiert werden. Probleme mit Tool-Aufrufen sind im OpenCode-Projekt bereits länger bekannt und diskutiert.

Ob das verwendete Modell grundsätzlich Tool-Aufrufe unterstützt, lässt sich mit:

ollama show qwen3-coder:30b

überprüfen. Unter Capabilities sollte hierbei unter anderem:

tools

aufgeführt sein. Ist dies der Fall und funktionieren die Werkzeuge in OpenCode trotzdem nicht zuverlässig, kann die Ursache im von Ollama verwendeten Kontextfenster liegen.

OpenCode benötigt für agentisches Arbeiten vergleichsweise viel Kontext. Neben der eigentlichen Unterhaltung befinden sich dort unter anderem der System-Prompt und die Beschreibungen der zur Verfügung stehenden Werkzeuge. Ist das Kontextfenster zu klein, können Tool-Aufrufe dadurch nicht mehr zuverlässig funktionieren. Auch die OpenCode-Dokumentation weist bei Problemen mit Tool Calls in Verbindung mit Ollama darauf hin, num_ctx zu erhöhen.

Wird Ollama allerdings über die OpenAI-kompatible Schnittstelle von OpenCode angesprochen, lässt sich num_ctx nicht ohne Weiteres zuverlässig über die OpenCode-Konfiguration setzen. Als Workaround kann deshalb ein eigenes Ollama-Modell mit fest eingestellter Kontextgröße angelegt werden. Dazu wird das gewünschte Modell zunächst gestartet:

ollama run qwen3-coder:30b

Anschließend wird die Kontextgröße gesetzt:

/set parameter num_ctx 131072

und die Konfiguration unter einem neuen Modellnamen gespeichert:

/save qwen3-coder:30b-128k
/bye

Damit existiert neben dem ursprünglichen Modell nun eine Variante, bei welcher das größere Kontextfenster fest hinterlegt ist. Die Größe muss nicht zwangsläufig 128K betragen. Für Tool-Aufrufe empfiehlt OpenCode eine Erhöhung in den Bereich von 16K bis 32K. Bei entsprechend verfügbarem Speicher kann für längere Coding-Sitzungen allerdings auch ein deutlich größeres Kontextfenster sinnvoll sein. In OpenCode muss anschließend das neu angelegte Modell konfiguriert werden:

nano ~/.config/opencode/opencode.json

Eine entsprechende Konfiguration kann beispielsweise wie folgt aussehen:

{
  "$schema": "https://opencode.ai/config.json",

  "provider": {
    "remote-ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Remote Ollama",

      "options": {
        "baseURL": "https://example.org/ollama/v1",

        "headers": {
          "Authorization": "Bearer secret-token-123"
        }
      },

      "models": {
        "qwen3-coder:30b-128k": {
          "name": "Qwen3 Coder 30B 128K",
          "tools": true,
          "limit": {
            "context": 131072,
            "output": 16384
          }
        }
      }
    }
  },

  "model": "remote-ollama/qwen3-coder:30b-128k"
}

Wichtig ist hierbei die Unterscheidung zwischen den beiden Konfigurationen. Mit:

"limit": {
  "context": 131072,
  "output": 16384
}

wird OpenCode mitgeteilt, welche Grenzen das Modell besitzt. Dadurch wird allerdings nicht die tatsächliche Kontextgröße gesetzt, diese wurde stattdessen im neuen Modell angelegt. Nach einem Neustart von OpenCode kann das Tooling beispielsweise mit:

Erstelle eine Datei todo.md mit exakt dem Inhalt ‚hello world‘.

getestet werden. Wird die Datei tatsächlich über die OpenCode-Werkzeuge angelegt, funktionieren die Tool-Aufrufe. Da sich OpenCode und die Anbindung lokaler Modelle derzeit schnell weiterentwickeln, kann es allerdings auch mit dieser Konfiguration zu Problemen mit Tool-Aufrufen kommen, die andere Ursachen haben.