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.

Bereit für Sprach-Pipelines

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()

// Single response
let response = try chat.generate(messages: [
    ChatMessage(role: .system, content: "Answer briefly."),
    ChatMessage(role: .user, content: "What is Swift?")
])
print(response)

// Streaming tokens
let stream = chat.generateStream(messages: [
    ChatMessage(role: .system, content: "Be funny."),
    ChatMessage(role: .user, content: "Tell me a joke")
])
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

RichtungNameShapeBeschreibung
Eingabeinput_ids[1, seq_len]Token-IDs (Int32)
Eingabeattention_mask[1, seq_len]Attention-Maske (Int32)
Eingabekv_cachepro SchichtKey-Value-Cache-Zustand
Ausgabelogits[1, 1, 151936]Next-Token-Logits (Float16)
Ausgabekv_cache_outpro SchichtAktualisierter KV-Cache

Modellvarianten

VarianteQuantisierungGrößeComputeHuggingFace
Qwen3.5-0.8B ChatINT4418 MBMetal-GPU (MLX)aufklarer/Qwen3.5-0.8B-Chat-MLX
Qwen3.5-0.8B ChatINT8981 MBNeural 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
)
let response = try chat.generate(
    messages: [ChatMessage(role: .user, content: "Explain gravity")],
    sampling: config
)
ParameterStandardBeschreibung
temperature0,6Zufälligkeit (0 = greedy, 1 = kreativ)
topK50Behält die Top-K-Kandidaten
topP0,95Nucleus-Sampling-Schwelle
maxTokens512Maximale Antwort-Tokens
repetitionPenalty1,1Bestraft wiederholte Tokens
disableThinkingfalseThinking-Modus überspringen
maxThinkingTokens100Begrenzt Thinking-Tokens

Mehrstufiges Gespräch

let chat = try await Qwen35MLXChat.fromPretrained()

let history = [
    ChatMessage(role: .system, content: "Remember the user's name."),
    ChatMessage(role: .user, content: "My name is Alex"),
    ChatMessage(role: .assistant, content: "Nice to meet you, Alex!"),
    ChatMessage(role: .user, content: "What's my name?")
]
let response = try chat.generate(messages: history)
print(response)  // "Your name is Alex!"

chat.resetState()  // Clear inference state for a new conversation

Speicherverwaltung

// Check memory state
print(chat.isLoaded)        // true
print(chat.memoryFootprint) // 438304768 (~418 MB)

// Free memory under pressure
chat.unload()
print(chat.isLoaded)        // false

// Reload when needed
let chat = try await Qwen35MLXChat.fromPretrained()
Tipp zu iOS-Speicher

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ätPrefillDecodeTokens/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.