339 lines
9.4 KiB
Markdown
339 lines
9.4 KiB
Markdown
|
|
# Bedienungshandbuch für Qwen3.6-MoE-35B-A3B Server
|
||
|
|
|
||
|
|
Dieses Handbuch beschreibt die Installation, Konfiguration und den Betrieb der lokalen Qwen3.6-MoE-35B-A3B Inferenzserver mit llama.cpp.
|
||
|
|
|
||
|
|
## Inhaltsverzeichnis
|
||
|
|
1. [Systemvoraussetzungen](#systemvoraussetzungen)
|
||
|
|
2. [Installation und Start](#installation-und-start)
|
||
|
|
3. [Server-Verwaltung](#server-verwaltung)
|
||
|
|
4. [Konfiguration und Parameter](#konfiguration-und-parameter)
|
||
|
|
5. [Integration mit Pi](#integration-mit-pi)
|
||
|
|
6. [API-Nutzung](#api-nutzung)
|
||
|
|
7. [Fehlerbehebung](#fehlerbehebung)
|
||
|
|
|
||
|
|
## Systemvoraussetzungen
|
||
|
|
|
||
|
|
### Hardware
|
||
|
|
- **GPU**: NVIDIA RTX 3090 (2x) oder equivalent mit je 24GB+ VRAM
|
||
|
|
- **RAM**: 64GB+ System-RAM empfohlen
|
||
|
|
- **Speicher**: 100GB+ für Modell-Dateien und Cache
|
||
|
|
- **NVIDIA-Treiber**: Mindestens Version 535+ mit CUDA 12.x
|
||
|
|
|
||
|
|
### Software
|
||
|
|
- Docker Engine (Version 20.10+)
|
||
|
|
- Docker Compose (Version 2.0+)
|
||
|
|
- NVIDIA Container Toolkit
|
||
|
|
- curl oder wget für Healthchecks
|
||
|
|
|
||
|
|
## Installation und Start
|
||
|
|
|
||
|
|
### Voraussetzungen prüfen
|
||
|
|
```bash
|
||
|
|
# GPU-Verfügbarkeit prüfen
|
||
|
|
nvidia-smi
|
||
|
|
|
||
|
|
# Docker-Version prüfen
|
||
|
|
docker --version
|
||
|
|
docker compose version
|
||
|
|
|
||
|
|
# Verzeichnisstruktur erstellen
|
||
|
|
mkdir -p ~/llama-server
|
||
|
|
cd ~/llama-server
|
||
|
|
```
|
||
|
|
|
||
|
|
### Server starten
|
||
|
|
|
||
|
|
#### Methode 1: Docker Compose (Empfohlen)
|
||
|
|
```bash
|
||
|
|
# In das Projektverzeichnis wechseln
|
||
|
|
cd ~/llama-server
|
||
|
|
|
||
|
|
# RAG-optimierten Server starten (Standard)
|
||
|
|
docker compose up -d --force-recreate
|
||
|
|
|
||
|
|
# Coding-optimierten Server starten
|
||
|
|
docker compose -f docker-compose_Qwen3.6_Tools_coding.yml up -d --force-recreate
|
||
|
|
|
||
|
|
# Uncensored-Variante starten
|
||
|
|
docker compose -f docker-compose_Qwen3.6_Uncensored.yml up -d --force-recreate
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Methode 2: Shell-Skripte
|
||
|
|
```bash
|
||
|
|
# Server-Modus (Hintergrunddienst)
|
||
|
|
./run_qwen35b_server_tools.sh # Coding-optimiert
|
||
|
|
./run_qwen35b_server_uncensored_rag_longctx.sh # Uncensored + RAG
|
||
|
|
./run_qwen35b_server_uncensored.sh # Uncensored (kein RAG)
|
||
|
|
|
||
|
|
# CLI-Modus (Kommandozeile)
|
||
|
|
./run_qwen35b_cli_tools_rag_longctx.sh # CLI mit RAG
|
||
|
|
./run_qwen35b_cli_uncensored_rag_longctx.sh # CLI Uncensored + RAG
|
||
|
|
|
||
|
|
# Embedding-Server
|
||
|
|
./run_bge_m3_embedding_server.sh
|
||
|
|
```
|
||
|
|
|
||
|
|
**Hinweis**: Alle Shell-Skripte stoppen automatisch existierende Container gleichen Namens vor dem Start.
|
||
|
|
|
||
|
|
## Server-Verwaltung
|
||
|
|
|
||
|
|
### Wichtige Regel
|
||
|
|
> **Nur ein Server kann gleichzeitig auf Port 8000 laufen!**
|
||
|
|
|
||
|
|
### Container-Namen und Konfigurationen
|
||
|
|
|
||
|
|
| Container-Name | Modell | Konfigurationsdatei |
|
||
|
|
|----------------|--------|---------------------|
|
||
|
|
| qwen35b-moe-coding | Carnice | docker-compose_Qwen3.6_Tools_coding.yml |
|
||
|
|
| qwen35b-moe-tools | Carnice | docker-compose_Qwen3.6_Tools.yml |
|
||
|
|
| qwen35b-moe-rag-longctx | Carnice | docker-compose_Qwen3.6_Tools_RAG_faehig.yml |
|
||
|
|
| qwen35b-moe-uncensored | Uncensored | docker-compose_Qwen3.6_Uncensored.yml |
|
||
|
|
| qwen35b-moe-uncensored-rag | Uncensored | docker-compose_Qwen3.6_Uncensored_RAG_faehig.yml |
|
||
|
|
| qwen35b-moe-uncensored-rag-longctx | Uncensored | run_qwen35b_server_uncensored_rag_longctx.sh |
|
||
|
|
|
||
|
|
### Server stoppen und starten
|
||
|
|
|
||
|
|
#### Container stoppen
|
||
|
|
```bash
|
||
|
|
# Nach Container-Namen stoppen
|
||
|
|
docker rm -f qwen35b-moe-coding
|
||
|
|
|
||
|
|
# Oder via docker-compose
|
||
|
|
cd ~/llama-server
|
||
|
|
docker compose -f docker-compose_Qwen3.6_Tools_coding.yml down
|
||
|
|
|
||
|
|
# Alle laufenden Container anzeigen
|
||
|
|
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Server wechseln
|
||
|
|
```bash
|
||
|
|
cd ~/llama-server
|
||
|
|
|
||
|
|
# Aktuellen Server stoppen
|
||
|
|
docker rm -f qwen35b-moe-coding
|
||
|
|
|
||
|
|
# Anderen Server starten
|
||
|
|
docker compose -f docker-compose_Qwen3.6_Uncensored.yml up -d
|
||
|
|
```
|
||
|
|
|
||
|
|
### Healthcheck und Status
|
||
|
|
```bash
|
||
|
|
# Server-Status prüfen
|
||
|
|
curl -fs http://localhost:8000/
|
||
|
|
|
||
|
|
# Container-Logs anzeigen
|
||
|
|
docker logs qwen35b-moe-rag-longctx
|
||
|
|
|
||
|
|
# Container-Status prüfen
|
||
|
|
docker inspect --format='{{.State.Health.Status}}' qwen35b-moe-rag-longctx
|
||
|
|
```
|
||
|
|
|
||
|
|
## Konfiguration und Parameter
|
||
|
|
|
||
|
|
### Hardware-Konfiguration
|
||
|
|
```yaml
|
||
|
|
GPU:
|
||
|
|
Haupt-GPU: "0" (erste 3090)
|
||
|
|
Tensor-Split: "0.5,0.5" (symmetrisch)
|
||
|
|
Alle Layer auf GPU: -ngl 999
|
||
|
|
Flash Attention: -fa on
|
||
|
|
|
||
|
|
KV-Cache:
|
||
|
|
Typ: q8_0 (K und V)
|
||
|
|
Unified Cache: --kv-unified
|
||
|
|
```
|
||
|
|
|
||
|
|
### Kontext- und Performance-Parameter
|
||
|
|
| Parameter | Wert | Beschreibung |
|
||
|
|
|-----------|------|--------------|
|
||
|
|
| Kontext-Fenster | 262,144 (256k) | Für lange RAG-Kontexte |
|
||
|
|
| Max. Ausgabe | 16,384 Token | Verhindert Text-Loops |
|
||
|
|
| Parallel-Slots | 2 | Spart ~10GB KV-Cache |
|
||
|
|
| Batch-Größe | 2,048 | Für lange Kontexte |
|
||
|
|
| Ubatch-Größe | 512 | Passend zu batch-size |
|
||
|
|
|
||
|
|
### Sampling-Parameter
|
||
|
|
|
||
|
|
#### RAG-Modus (Standard)
|
||
|
|
```yaml
|
||
|
|
temperature: 0.2 # Niedriger für faktentreue Antworten
|
||
|
|
top-p: 0.95 # Qwen-Empfehlung
|
||
|
|
top-k: 40 # Qwen-Empfehlung
|
||
|
|
min-p: 0.01 # Stabilisiert Sampling
|
||
|
|
repeat-penalty: 1.05 # Verhindert Wiederholungen
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Coding-Modus
|
||
|
|
```yaml
|
||
|
|
temperature: 0.3 # Kompromiss für Kreativität und Präzision
|
||
|
|
top-p: 0.95
|
||
|
|
top-k: 40
|
||
|
|
min-p: 0.01
|
||
|
|
repeat-penalty: 1.05
|
||
|
|
```
|
||
|
|
|
||
|
|
### Laufzeit-Parameter (ohne Neustart)
|
||
|
|
Diese Parameter können pro API-Request überschrieben werden:
|
||
|
|
- `temperature`
|
||
|
|
- `top_p`
|
||
|
|
- `top_k`
|
||
|
|
- `min_p`
|
||
|
|
- `repeat_penalty`
|
||
|
|
- `max_tokens`
|
||
|
|
|
||
|
|
**Beispiel**:
|
||
|
|
```bash
|
||
|
|
curl -X POST "http://localhost:8000/v1/chat/completions" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{
|
||
|
|
"temperature": 0.0,
|
||
|
|
"top_k": 20,
|
||
|
|
"max_tokens": 512,
|
||
|
|
...
|
||
|
|
}'
|
||
|
|
```
|
||
|
|
|
||
|
|
### Parameter mit Neustart erforderlich
|
||
|
|
| Parameter | Grund |
|
||
|
|
|-----------|-------|
|
||
|
|
| `-c` (Kontext) | KV-Cache wird beim Start allokiert |
|
||
|
|
| `--parallel` | Anzahl KV-Cache-Slots ist fest |
|
||
|
|
| `-ngl`, `--tensor-split` | Modell wird beim Start auf GPU geladen |
|
||
|
|
| `--kv-unified`, `--cache-type-*` | Cache-Struktur ist unveränderlich |
|
||
|
|
| `--batch-size`, `--ubatch-size` | Interne Buffer-Allokation |
|
||
|
|
| Modell-Datei | Offensichtlich |
|
||
|
|
|
||
|
|
## Integration mit Pi
|
||
|
|
|
||
|
|
### Architektur
|
||
|
|
```
|
||
|
|
MCP-Server ←──┐
|
||
|
|
Extensions ←──┤
|
||
|
|
AGENTS.md ←─┤ Pi ──→ llama-cpp Docker ──→ GPU
|
||
|
|
Dateien ←──┘ (API-Request mit System-Prompt + Tools)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 1. Dateien übergeben
|
||
|
|
Pi liest Dateien mit dem `read`-Tool und sendet den Inhalt als Text im Prompt.
|
||
|
|
|
||
|
|
**Automatisches Laden**:
|
||
|
|
- AGENTS.md oder projektspezifische Context-Files beim Session-Start
|
||
|
|
|
||
|
|
### 2. Prompts konfigurieren
|
||
|
|
```bash
|
||
|
|
~/.pi/agent/SYSTEM.md # Ersetzt kompletten System-Prompt
|
||
|
|
~/.pi/agent/APPEND_SYSTEM.md # Wird ans Ende angehängt
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Tools verwenden
|
||
|
|
**Eingebaute Tools**: read, write, edit, bash
|
||
|
|
|
||
|
|
**Eigene Tools**: Als Pi-Extensions in `~/.pi/agent/extensions/` registriert. Das Modell sieht Tool-Definitionen im System-Prompt und ruft sie über OpenAI function-calling API auf (deshalb ist `--jinja` wichtig).
|
||
|
|
|
||
|
|
### 4. MCP-Server einrichten
|
||
|
|
In `settings.json`:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"packages": [
|
||
|
|
"npm:pi-llama-cpp",
|
||
|
|
"npm:@modelcontextprotocol/server-filesystem",
|
||
|
|
"npm:irgendein-mcp-server"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
Der MCP-Server läuft als Prozess neben pi — nicht im llama-cpp-Container.
|
||
|
|
|
||
|
|
**Hinweis**: llama.cpp hat ein `--system-prompt`-Flag, aber das ist weniger flexibel als AGENTS.md und kollidiert mit pi's eigenem System-Prompt.
|
||
|
|
|
||
|
|
## API-Nutzung
|
||
|
|
|
||
|
|
### Chat Completions
|
||
|
|
```bash
|
||
|
|
curl -X POST "http://localhost:8000/v1/chat/completions" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{
|
||
|
|
"model": "qwen3.6-35b-a3b-moe",
|
||
|
|
"messages": [
|
||
|
|
{ "role": "system", "content": "Du bist ein hilfreicher deutscher Assistent." },
|
||
|
|
{ "role": "user", "content": "Erkläre Quantencomputing in 3 Sätzen." }
|
||
|
|
],
|
||
|
|
"max_tokens": 1024,
|
||
|
|
"temperature": 0.2,
|
||
|
|
"stream": false
|
||
|
|
}'
|
||
|
|
```
|
||
|
|
|
||
|
|
### Streaming aktivieren
|
||
|
|
```bash
|
||
|
|
curl -X POST "http://localhost:8000/v1/chat/completions" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{
|
||
|
|
"model": "qwen3.6-35b-a3b-moe",
|
||
|
|
"messages": [
|
||
|
|
{ "role": "user", "content": "Schreibe eine kurze Geschichte." }
|
||
|
|
],
|
||
|
|
"stream": true
|
||
|
|
}'
|
||
|
|
```
|
||
|
|
|
||
|
|
## Fehlerbehebung
|
||
|
|
|
||
|
|
### Server antwortet nicht
|
||
|
|
1. **GPU-Verfügbarkeit prüfen**: `nvidia-smi`
|
||
|
|
2. **Modell-Datei existiert**: `/home/dschlueter/nvme2n1p7_home/huggingface/models/qwen3/`
|
||
|
|
3. **Container-Logs prüfen**: `docker logs qwen35b-moe-rag-longctx`
|
||
|
|
|
||
|
|
### GPU-Speicher-Probleme
|
||
|
|
- Parallel-Slots von 2 auf 1 reduzieren
|
||
|
|
- Batch-Größe von 2048 auf 1024 reduzieren
|
||
|
|
- Uncensored-Variante verwenden (geringerer VRAM-Bedarf)
|
||
|
|
|
||
|
|
### Verbindungsfehler
|
||
|
|
- **Port 8000 belegt**: `lsof -i :8000` prüfen
|
||
|
|
- **Firewall**: Firewall-Einstellungen überprüfen
|
||
|
|
- **Container läuft**: `docker ps | grep qwen35b` prüfen
|
||
|
|
|
||
|
|
### Container startet nicht
|
||
|
|
1. **GPU-Zugriff**: NVIDIA Container Toolkit installieren
|
||
|
|
2. **Speicher**: Ausreichend VRAM verfügbar?
|
||
|
|
3. **Port-Konflikt**: Anderen Server stoppen
|
||
|
|
|
||
|
|
### Modell-Datei nicht gefunden
|
||
|
|
```bash
|
||
|
|
# Pfad prüfen
|
||
|
|
ls -la /home/dschlueter/nvme2n1p7_home/huggingface/models/qwen3/
|
||
|
|
|
||
|
|
# Falls nötig, Modell herunterladen
|
||
|
|
huggingface-cli download <model-name> --local-dir ./models
|
||
|
|
```
|
||
|
|
|
||
|
|
## Wartung und Backup
|
||
|
|
|
||
|
|
### Modell aktualisieren
|
||
|
|
1. Neue GGUF-Datei in HF_HOME-Pfad herunterladen
|
||
|
|
2. docker-compose.yml oder Shell-Skript `-m` Parameter aktualisieren
|
||
|
|
3. Container neu starten
|
||
|
|
|
||
|
|
### Konfiguration sichern
|
||
|
|
```bash
|
||
|
|
# System-Prompts sichern
|
||
|
|
cp ~/.pi/agent/SYSTEM.md ~/backup/
|
||
|
|
cp ~/.pi/agent/APPEND_SYSTEM.md ~/backup/
|
||
|
|
|
||
|
|
# Extensions sichern
|
||
|
|
cp -r ~/.pi/agent/extensions/ ~/backup/
|
||
|
|
|
||
|
|
# Docker-Konfigurationen sichern
|
||
|
|
cp ~/llama-server/docker-compose*.yml ~/backup/
|
||
|
|
```
|
||
|
|
|
||
|
|
### Regelmäßige Wartung
|
||
|
|
- **Wöchentlich**: Container-Logs prüfen
|
||
|
|
- **Monatlich**: GPU-Treiber aktualisieren
|
||
|
|
- **Bei Updates**: Docker und NVIDIA-Treiber updaten
|
||
|
|
|
||
|
|
## Lizenz
|
||
|
|
|
||
|
|
Dieses Projekt verwendet llama.cpp (Apache 2.0) und das Qwen3.6-MoE Modell. Die Modellnutzung unterliegt den Lizenzbedingungen des ursprünglichen Modells.
|