Qwen3.5 Chat (LLM auf dem Gerät)
Qwen3.5-0.8B ist ein hybrides Modell aus DeltaNet (lineare Attention) + GatedAttention mit 24 Schichten (18 DeltaNet + 6 GatedAttention), quantisiert auf INT4 für MLX (Metal-GPU) und INT8 für CoreML (Neural Engine). Läuft auf dem Mac über MLX oder auf iPhone und Mac über CoreML mit Streaming-Token-Erzeugung. Entwickelt für Sprach-Pipelines, in denen ein LLM auf dem Gerät als "Gehirn" zwischen ASR und TTS dient.
Qwen3.5 Chat integriert sich als LLM-Komponente in ASR → LLM → TTS-Ketten in die SpeechCore-VoicePipeline. Die hybride DeltaNet-Architektur bietet effiziente lineare Attention für lange Kontexte.
Schnellstart
import Qwen3Chat
let chat = try await Qwen35MLXChat.fromPretrained()
// Einzelne Antwort
let response = try chat.generate("What is Swift?", systemPrompt: "Answer briefly.")
print(response)
// Token-Streaming
let stream = chat.chatStream("Tell me a joke", systemPrompt: "Be funny.")
for try await token in stream {
print(token, terminator: "")
}
Architektur
Qwen3.5-0.8B ist ein hybrides Modell mit 24 Schichten: 18 DeltaNet-Schichten (lineare Attention mit Gated-Delta-Rule-Rekurrenz und RMSNormGated) und 6 GatedAttention-Schichten (standardmäßige Scaled-Dot-Product-Attention). Das MLX-Backend führt die Inferenz auf der Metal-GPU mit safetensors-Gewichten aus. Das CoreML-Backend verwendet eine Dual-Model-Architektur (Prefill + Decode), optimiert für die Neural Engine. Beide unterstützen KV-Cache mit Prompt-Caching und konfigurierbares Sampling (Temperature, top-k, top-p, Repetition Penalty).
Modell-I/O
| Richtung | Name | Shape | Beschreibung |
|---|---|---|---|
| Eingabe | input_ids | [1, seq_len] | Token-IDs (Int32) |
| Eingabe | attention_mask | [1, seq_len] | Attention-Maske (Int32) |
| Eingabe | kv_cache | pro Schicht | Key-Value-Cache-Zustand |
| Ausgabe | logits | [1, 1, 151936] | Next-Token-Logits (Float16) |
| Ausgabe | kv_cache_out | pro Schicht | Aktualisierter KV-Cache |
Modellvarianten
| Variante | Quantisierung | Größe | Compute | HuggingFace |
|---|---|---|---|---|
| Qwen3.5-0.8B Chat | INT4 | 418 MB | Metal-GPU (MLX) | aufklarer/Qwen3.5-0.8B-Chat-MLX |
| Qwen3.5-0.8B Chat | INT8 | 981 MB | Neural Engine (CoreML) | aufklarer/Qwen3.5-0.8B-Chat-CoreML |
Sampling-Konfiguration
let config = ChatSamplingConfig(
temperature: 0.7,
topK: 40,
topP: 0.9,
maxTokens: 128,
repetitionPenalty: 1.1,
disableThinking: false,
maxThinkingTokens: 50
)
let response = try chat.generate("Explain gravity", sampling: config)
| Parameter | Standard | Beschreibung |
|---|---|---|
temperature | 0,6 | Zufälligkeit (0 = greedy, 1 = kreativ) |
topK | 50 | Behält die Top-K-Kandidaten |
topP | 0,95 | Nucleus-Sampling-Schwelle |
maxTokens | 512 | Maximale Antwort-Tokens |
repetitionPenalty | 1,1 | Bestraft wiederholte Tokens |
disableThinking | false | Thinking-Modus überspringen |
maxThinkingTokens | 100 | Begrenzt Thinking-Tokens |
Mehrstufiges Gespräch
let chat = try await Qwen35MLXChat.fromPretrained()
let r1 = try chat.generate("My name is Alex", systemPrompt: "Remember the user's name.")
print(r1) // "Nice to meet you, Alex!"
let r2 = try chat.generate("What's my name?")
print(r2) // "Your name is Alex!"
chat.resetConversation() // Historie und KV-Cache leeren
Speicherverwaltung
// Speicherzustand prüfen
print(chat.isLoaded) // true
print(chat.memoryFootprint) // 438304768 (~418 MB)
// Speicher bei Druck freigeben
chat.unload()
print(chat.isLoaded) // false
// Bei Bedarf neu laden
let chat = try await Qwen35MLXChat.fromPretrained()
Auf dem iPhone gibt das Entladen des LLM vor der TTS-Inferenz ~418 MB (INT4 MLX) oder ~981 MB (INT8 CoreML) frei und verhindert jetsam-Terminierung beim Ausführen vollständiger ASR → LLM → TTS-Pipelines.
Leistung
| Gerät | Prefill | Decode | Tokens/Sek. |
|---|---|---|---|
| M2 Max | ~50 ms | ~65 ms/Token | ~15 Tokens/s |
| iPhone 16 Pro | ~1,5 s | ~450 ms/Token | ~2,2 Tokens/s |
Konvertierung
MLX-Gewichte werden aus dem ursprünglichen Qwen3.5-0.8B-Checkpoint mit dem MLX-Konvertierungsskript konvertiert. CoreML-Modelle verwenden ein separates Konvertierungsskript für die Neural-Engine-Bereitstellung. Vorkonvertierte Gewichte sind auf HuggingFace unter aufklarer/Qwen3.5-0.8B-Chat-MLX (INT4: 418 MB) und aufklarer/Qwen3.5-0.8B-Chat-CoreML (INT8: 981 MB) verfügbar.