GitHub Copilot kostet Geld, schickt deinen Code in die Cloud und wird ab Juni 2026 richtig teuer. Mit einer halbwegs modernen NVIDIA-GPU lässt sich das komplett lokal lösen. In diesem Artikel zeige ich, wie ich llama.cpp als OpenAI-kompatibler API-Server nutze und ihn über die Continue.dev-Extension in VS Code sowie Open Code als CLI-Tool eingebunden habe – vollständig kostenlos, ohne API-Key und ohne Datenweitergabe.
Mein System: Windows 11 | RTX 4090 (24 GB VRAM) | 64 GB DDR5 RAM | WSL2
Voraussetzungen
- Windows 11 mit WSL2
- NVIDIA GPU (mindestens 8 GB VRAM empfohlen, ich nutze eine RTX 4090 mit 24 GB VRAM)
- VS Code
1. WSL2 einrichten
Das Modell läuft in einer separaten WSL2-Distribution. Öffne PowerShell als Administrator:
| |
Nach dem Neustart WSL2 als Standardversion verifizieren:
| |
1.1 Separate Distribution erstellen
Ich lege eine eigene Distribution mit dem Namen unsloth an, um sie sauber vom Rest zu trennen:
| |
Es öffnet sich ein Terminal – dort Benutzername und Passwort vergeben. Danach das Fenster schließen und prüfen ob die Distribution korrekt angelegt wurde:
| |
Erwartete Ausgabe:
| |
1.2 Arbeitsspeicher-Limit anpassen
Windows limitiert WSL2 standardmäßig auf 50 % RAM. Für KI-Workloads brauchen wir mehr. Datei C:\Users\WIN11\.wslconfig erstellen oder bearbeiten:
| |
Danach WSL neu starten:
| |
1.3 DNS-Auflösung fixieren
WSL2 hat bei mir ein Problem mit systemd-resolved. Ohne diesen Fix schlägt apt update mit Temporary failure in name resolution fehl.
In der WSL2-Shell:
| |
Tip
192.168.178.1 ist die IP des Fritzbox-Routers. Bei einem anderen Router entsprechend anpassen. 8.8.8.8 (Google DNS) funktioniert immer als Alternative.
1.4 Grundpakete installieren
| |
2. Unsloth installieren und Modell laden
Unsloth stellt eine einfache Web-Oberfläche bereit, mit der man GGUF-Modelle herunterladen und testen kann. Die Installation läuft über ein offizielles Skript:
| |
Die Installation dauert ca. 1–2 Minuten. Danach WSL neu starten:
| |
Unsloth Studio starten:
| |
Dann im Browser http://localhost:8888 öffnen. Über die Oberfläche das gewünschte Modell herunterladen – ich nutze Qwen3.6-27B.
2.1 Modell- und Quantwahl
Qwen3.6-27B ist im GGUF-Format in verschiedenen Quantisierungsstufen verfügbar. Da die RTX 4090 meine primäre GPU ist, die Windows zum Rendern des Desktops nutzt, büße ich natürlich ein wenig Kontextgröße ein. Hier sind die realen Benchmarks, bei denen alle Layer vollständig ins VRAM passten:
| Modell | KV Quant | Kontextgröße | t/s |
|---|---|---|---|
| UD-Q2_K_XL | q8_0 | 262144 | 59 |
| UD-Q3_K_XL | q8_0 | 262144 | 51 |
| UD-Q4_K_XL | q8_0 | 190000 | 44 |
| UD-Q5_K_XL | q8_0 | 115000 | 40 |
| UD-Q2_K_XL | f16 | 185000 | 60 |
| UD-Q3_K_XL | f16 | 146000 | 52 |
| UD-Q4_K_XL | f16 | 100000 | 45 |
| UD-Q5_K_XL | f16 | 61000 | 41 |
Ich nutze UD-Q4_K_XL mit q8_0 KV-Cache und 190000 Token Kontext – das ist ein guter Kompromiss. Der Stromverbrauch beträgt dabei etwa 350 W.
Tip
Wenn Layer in den RAM ausgelagert werden (weil das Modell nicht komplett in den VRAM passt), sinkt die Geschwindigkeit auf ca. 15 Token/s. Es lohnt sich also, einen Quant zu wählen, der vollständig in den VRAM passt.
2.2 Multi Token Prediction (MTP) / Speculative Decoding
Multi Token Prediction (MTP) lädt einen zusätzlichen Transformer-Layer in den VRAM, der es ermöglicht, mehrere Tokens parallel auszulesen. Das kann bis zu 2x mehr Geschwindigkeit bei der Tokengenerierung erzeugen. Der zusätzliche Layer muss allerdings ins VRAM passen, was die Kontextgröße deutlich reduziert:
| Modell | KV Quant | Kontextgröße | t/s |
|---|---|---|---|
| MTP-UD-Q4_K_XL | q8_0 | 96000 | 90 |
| MTP-UD-Q5_K_XL | q8_0 | 37000 | 86 |
| MTP-UD-Q4_K_XL | f16 | 52000 | 93 |
| MTP-UD-Q5_K_XL | f16 | 20000 | 89 |
Warning
Unsloth Studio unterstützt MTP aktuell nicht. Du musst llama.cpp selbst bauen und die MTP-Modelle direkt von Huggingface laden.
Mit der Huggingface CLI kannst du die MTP-Modelle von havenoammo/Qwen3.6-27B-MTP-UD-GGUF herunterladen:
| |
2.3 Empfohlene Inferenzparameter
Ich nutze folgende Inferenzparameter, die das Modell besser für Coding-Aufgaben vorbereiten. Insbesondere die Temperatur ist bei Unsloth viel zu hoch eingestellt, sodass es zu häufig halluziniert. Mit 0.2 oder 0.3 sieht das Ergebnis viel besser aus:
| Parameter | Wert | Hinweis |
|---|---|---|
Temp | 0.2 | Weniger Fantasie beim Coden. Unsloth empfiehlt 0.6, was aber viel zu hoch ist. |
Top-p | 0.95 | Von Unsloth empfohlen |
Top-k | 20 | Von Unsloth empfohlen |
Min-p | 0.00 | Von Unsloth empfohlen |
Presence Penalty | 0.0 | Von Unsloth empfohlen |
Frequency Penalty | 0.1 | Unsloth empfiehlt 1.0, ich hatte aber keine Probleme mit Looping, daher auf 0.1 gesenkt. |
Tip
Mit uvx hf lässt sich auch die Huggingface CLI direkt nutzen, um weitere Modelle zu laden. Für schnelles Ausprobieren ist aber Unsloth Studio meist komfortabler.
llama-server kennt auch das Argument -hf, mit dem direkt Modelle von Huggingface genutzt werden können.
3. llama.cpp bauen
llama.cpp ist die empfohlene Inference-Engine für GGUF-Modelle – stabil, GPU-beschleunigt und OpenAI-API-kompatibel. Unsloth nutzt llama.cpp intern selbst. Wir bauen es separat, damit wir den Port und alle Parameter selbst kontrollieren können.
3.1 CUDA Toolkit installieren
Das Unsloth-Installationsskript richtet CUDA nur für Python ein. cmake benötigt zusätzlich das systemweite CUDA Toolkit (nvcc + Header). Wir installieren CUDA 13.1 per Runfile.
Warning
Nutze nicht CUDA 13.2 – diese Version enthält Bugs, die bei stark quantisierten Modellen zu kryptischem oder gibberish Output führen, insbesondere in Verbindung mit Compiler-Optimierung -O3. Mehr dazu auf Reddit.
| |
Umgebungsvariablen setzen und WSL neu starten:
| |
| |
Installation verifizieren:
| |
Erwartete Ausgabe:
| |
3.2 llama.cpp kompilieren
| |
Der Build dauert je nach CPU ein paar Minuten. Danach verifizieren:
| |
3.3 Kontext-Parameter mit llama-fit-params bestimmen
Mit llama-fit-params kannst du die optimalen Parameter für deine Hardware berechnen lassen. --fit-target gibt an, wie viele MB als Reserve frei bleiben sollen:
| |
4. llama-server starten
llama-server stellt eine OpenAI-kompatible REST-API bereit – direkt nutzbar für Continue.dev, Open Code und andere Tools. In einem WSL2-Terminal ausführen (Terminal-Tab offen lassen, solange der Server laufen soll):
Tip
Du kannst auch Vision-Features aktivieren, um Bilder verarbeiten zu können. Das kostet aber etwas VRAM und damit Kontextgröße. Nutze einfach --mmproj $(find ~ -path "*Qwen3.6-27B-GGUF*" -name "mmproj-BF16.gguf" | head -1).
UD-Q4_K_XL mit q8_0 KV-Cache:
| |
UD-Q5_K_XL mit q8_0 KV-Cache:
| |
MTP-UD-Q4_K_XL (mit Multi Token Prediction für ~2x Geschwindigkeit):
| |
Tip
Der zusätzliche Transformer-Layer für MTP kostet viel VRAM und damit Kontextgröße. Die Geschwindigkeit verdoppelt sich jedoch (~90 t/s statt ~45 t/s).
4.1 Parameter erklärt
Technische Parameter:
| Parameter | Wert | Erklärung |
|---|---|---|
--gpu-layers -1 | alle | Alle Layer in den VRAM laden – maximale Geschwindigkeit |
--flash-attn on | on | Reduziert VRAM-Bedarf des KV-Caches spürbar |
--cache-type-k/v | q8_0 | KV-Cache in 8-Bit – spart VRAM bei minimalem Qualitätsverlust |
--reasoning on | on | Aktiviert <think>-Tags von Qwen3 (Chain-of-Thought) |
--parallel 1 | 1 | Nur eine gleichzeitige Anfrage – spart KV-Cache-Speicher |
--jinja | – | Jinja-Rendering für Chat-Templates aktivieren |
Inferenzparameter:
| Parameter | Wert | Erklärung |
|---|---|---|
--temp | 0.2 | Unsloth empfiehlt 0.6 – das ist für Coding viel zu hoch und führt zu häufigen Halluzinationen. Mit 0.2 verhält sich das Modell deutlich zuverlässiger. |
--top-p | 0.95 | Von Unsloth empfohlen |
--top-k | 20 | Von Unsloth empfohlen |
--min-p | 0.00 | Von Unsloth empfohlen |
--presence-penalty | 0.0 | Von Unsloth empfohlen |
--frequency-penalty | 0.1 | Unsloth empfiehlt 1.0, ich hatte damit aber keine Probleme mit Looping – daher auf 0.1 gesenkt. |
Wenn der Server lädt, erscheint im Terminal u.a.:
| |
4.2 API testen
| |
5. Networking: Zugriff aus dem LAN
WSL2 nutzt NAT. Dank localhostForwarding=true in der .wslconfig ist der llama-server unter Windows automatisch per localhost:8001 erreichbar. Damit andere Geräte im LAN (z.B. ein zweiter Rechner mit VS Code) ebenfalls zugreifen können, brauchen wir eine Portweiterleitung. 192.168.178.115 ist dabei die LAN-IP meines Windows-Hosts – entsprechend anpassen.
Dazu einfach in PowerShell als Administrator:
| |
Warning
Als listenaddress unbedingt die konkrete LAN-IP des Windows-Hosts angeben, nicht 0.0.0.0. Wenn 0.0.0.0 genutzt wird, versucht der Portproxy auch 127.0.0.1 zu binden – und verhindert damit genau das Localhost-Forwarding von WSL, das wir nutzen wollen.
Anschließend noch eine eingehende Windows-Firewall-Regel anlegen. Das geht am einfachsten über die Firewall-UI (Windows Defender Firewall mit erweiterter Sicherheit → Eingehende Regeln → Neue Regel):
- Protocol: TCP
- Ports: 8001, 8888
5.1 Performance-Analyse: Was bringt MTP und q8_0?
Interessanterweise ergibt sich aus den Benchmarks ein gewisser Kostenfaktor für die Features:
Aktivierung von MTP kostet ca. 50% Kontextgröße, sorgt aber für einen Geschwindigkeitsboost um den Faktor 2x. Weniger stark quantisierte Modelle leiden stärker, da hier in absoluten Zahlen der Kontextverlust durch den zusätzlichen Transformer-Layer stärker ins Gewicht fällt.
Die Aktivierung der q8_0 Quantisierung für den KV-Cache bringt ca. 55% mehr Kontextgröße. Ein Unterschied zu f16 ist selbst bei Coding-Aufgaben nicht zu bemerken. Es kommt allerdings zu einem kleinen Geschwindigkeitsverlust von ca. 2%.
Wenn du eine bessere Quantisierung für das Modell auswählst, kostet es ca. 30% Kontextgröße. Wenn MTP aktiviert ist, sogar 60%.
Gewinne durch MTP
| Modell (MTP) | KV Quant | Kontextgröße | t/s | Verbleibender Kontext | Gain in t/s |
|---|---|---|---|---|---|
| UD-Q4_K_XL | q8_0 | 96000 | 90 | 51% | 2.0 |
| UD-Q5_K_XL | q8_0 | 37000 | 86 | 32% | 2.2 |
| UD-Q4_K_XL | f16 | 52000 | 93 | 52% | 2.1 |
| UD-Q5_K_XL | f16 | 20000 | 89 | 33% | 2.2 |
Gewinne durch q8_0 Quantisierung des KV-Cache
| Modell (KV=q8_0) | Gain in Kontext | Loss in t/s |
|---|---|---|
| UD-Q2_K_XL | +42% | -2% |
| UD-Q3_K_XL | +80% | -2% |
| UD-Q4_K_XL | +90% | -2% |
| UD-Q5_K_XL | +89% | -2% |
| MTP-UD-Q4_K_XL | +85% | -3% |
| MTP-UD-Q5_K_XL | +85% | -3% |
Kontextgewinne durch stärkere Quantisierung
| Modell | KV Quant | Gain in Kontext |
|---|---|---|
| Choosing Q2 over Q3 | q8_0 | +0% |
| Choosing Q3 over Q4 | q8_0 | +38% |
| Choosing Q4 over Q5 | q8_0 | +65% |
| Choosing Q4 over Q5 (MTP) | q8_0 | +159% |
| Choosing Q2 over Q3 | f16 | +27% |
| Choosing Q3 over Q4 | f16 | +46% |
| Choosing Q4 over Q5 | f16 | +64% |
| Choosing Q4 over Q5 (MTP) | f16 | +160% |
6. Chat-Clients einrichten
Alle drei Tools verbinden sich über die OpenAI-kompatible API des llama-servers.
6.1 Qwen Code Companion
Qwen Code Companion ist die offizielle VS Code Extension von Alibaba. Von der Bedienung her ähnelt sie GitHub Copilot Chat am stärksten – besonders die Tool-Nutzung funktioniert hier sehr gut.
Installation: Extension Qwen.qwen-coder im VS Code Marketplace suchen und installieren.
Konfigurationsdatei %USERPROFILE%\.qwen\settings.json öffnen (ggf. erstellen):
| |
VS Code neu starten und den Chat mit Strg+L öffnen.
Tip
Mit dem /init-Befehl lässt Qwen Companion die gesamte Codebase einmalig analysieren und legt eine QWEN.md mit allen wichtigen Projektdetails an – vergleichbar mit der CLAUDE.md bei Claude Code.
6.2 Continue.dev
Continue ist eine Open-Source VS Code Extension für KI-gestütztes Coding – Chat, Inline-Edits und Tab-Autocomplete in einem.
Installation: Extension Continue.continue im VS Code Marketplace suchen und installieren.
Konfigurationsdatei %USERPROFILE%\.continue\config.yaml öffnen:
| |
Tip
Das apiKey-Feld ist ein Pflichtfeld in Continue, wird vom lokalen llama-server aber nicht ausgewertet – ein beliebiger Wert wie dummy reicht aus.
VS Code neu starten. Shortcuts:
| Shortcut | Funktion |
|---|---|
Strg+L | Chat öffnen (agentic, mit Dateikontext) |
Strg+I | Inline-Edit im Editor |
Strg+Shift+R | Tab-Autocomplete manuell triggern |
6.3 Open Code
Open Code ist ein Agentic-Coding-CLI-Tool – vergleichbar mit Claude Code, aber vollständig mit lokalen Modellen. Es gibt auch einen Desktop-Client, der die Einrichtung vereinfacht.
Installation: Desktop-Client von opencode.ai/de/download herunterladen und installieren.
Konfigurationsdatei %USERPROFILE%\.config\opencode\opencode.jsonc anpassen:
| |
Nach dem Speichern Open Code einmal neu starten – erst dann erscheint der neue Provider in der Oberfläche.
7. Test-Prompts
Hier sind ein paar Prompts, mit denen ich das Modell teste. Man sieht deutliche Unterschiede im Verhalten, wenn die Temperatur z.B. auf 0.6 gestellt ist.
7.1 OAuth2 Client Beispiel
Kannst du mir ein oauth2 Beispiel bauen in c#, ohne externe libs. Also einfach nur ein program.cs das eine api per client credential grant aufruft.Haufenweise key value pairs... Bitte nutze .net 10 und die coolen shortcuts. Dann kannst du diese ganzen new KeyValuePair<string,string> weglassen.
Bitte nutze die neusten c# language features7.2 OpenIddict Knowledge
Kennst du OpenIddict?Ich habe in meinem Projekt OpenIddict genutzt. Und zwar im degraded mode. Ich möchte nun, dass du den authorization code beim pkce grant kürzer machst. Speicher einfach den code in einem memory cache und ersetz den einfach mit einem reference code. Kannst du mir zeigen, wie man das konkret implementieren würde?Du brauchst Handler für ProcessSignInContext und ExtractTokenRequestContext.7.3 WSL Networking
Ich hab wsl und hoste einen http server da drin. Ich kann nun aber nicht von anderen Rechnern im LAN darauf zugreifen. Meine ip ist 192.168.178.115 und mein server unter port 8001 gehostet. Wenn ich per localhost von Windows aus draufgehe geht es. Aber selbst wenn ich http://192.168.178.115:8001 in Windows eingebe gehts schon nicht. Es geht auch nicht wenn ich das von anderen Rechnern im LAN aus aufrufe. Ne idee was man machn kann?Eine gute Antwort erwähnt:
- Windows Firewall konfigurieren
netsh portproxymitlistenaddress=192.168.178.115– nicht0.0.0.0, da das die WSL-Bindung störtconnectaddress=127.0.0.1, weil Windows Ports danklocalhostForwarding=truedort bindet- Optional:
networkingMode=mirroredals Alternative (Bei temp=0.6 halluziniert er den Parameter zunetworkMode=mirrored)
Fazit
Qwen3.6 27B ist beeindruckend. Es hält locker mit Claude Sonnet 4.5 mit und läuft dabei auf einfacher Consumer Hardware – vollständig lokal und kostenlos.
Der Einrichtungsaufwand ist einmalig hoch: WSL2, CUDA, llama.cpp bauen, Networking konfigurieren. Wer das einmal durchgezogen hat, bekommt dafür einen vollwertigen KI-Coding-Assistenten, der dauerhaft nichts kostet und keinen API-Key braucht.
Schwächen zeigen sich bei komplexen Mehrschrittaufgaben: Qwen neigt gelegentlich dazu, Syntaxfehler zu produzieren oder suboptimale Architekturentscheidungen zu treffen, bei denen Sonnet besser abschneiden würde. Außerdem ist er mit ~45 t/s spürbar langsamer als Claude.
Für den alltäglichen Einsatz im Homelab oder für datenschutzsensible Projekte ist das Setup aber klar empfehlenswert. Die Kombination aus Qwen Companion, Continue.dev und Open Code deckt praktisch jeden Anwendungsfall ab.