Qwen3.5 Chat(オンデバイスLLM)
Qwen3.5-0.8Bは、24レイヤー(18 DeltaNet + 6 GatedAttention)のハイブリッドDeltaNet(線形アテンション)+ GatedAttentionモデルで、MLX(Metal GPU)用にINT4、CoreML(Neural Engine)用にINT8に量子化されています。MLX経由でMac上、またはCoreML経由でiPhoneとMac上でストリーミングトークン生成により動作します。ASRとTTSの間の「頭脳」を提供するオンデバイスLLMが必要な音声パイプライン向けに設計されています。
Qwen3.5 Chatは、ASR → LLM → TTSチェーンのLLMコンポーネントとしてSpeechCore VoicePipelineと統合されます。ハイブリッドDeltaNetアーキテクチャは、長いコンテキストに対して効率的な線形時間のアテンションを提供します。
クイックスタート
import Qwen3Chat
let chat = try await Qwen35MLXChat.fromPretrained()
// 単一応答
let response = try chat.generate("What is Swift?", systemPrompt: "Answer briefly.")
print(response)
// ストリーミングトークン
let stream = chat.chatStream("Tell me a joke", systemPrompt: "Be funny.")
for try await token in stream {
print(token, terminator: "")
}
アーキテクチャ
Qwen3.5-0.8Bは、24レイヤー(ゲート付きデルタルール再帰とRMSNormGatedを備えた線形アテンションの18 DeltaNetレイヤー、標準的なスケールされたドット積アテンションの6 GatedAttentionレイヤー)のハイブリッドモデルです。MLXバックエンドは、safetensorsウェイトでMetal GPU上で推論を実行します。CoreMLバックエンドは、Neural Engine向けに最適化されたデュアルモデルアーキテクチャ(プレフィル + デコード)を使用します。両方とも、プロンプトキャッシングと設定可能なサンプリング(temperature、top-k、top-p、反復ペナルティ)を備えたKVキャッシュをサポートします。
モデル I/O
| 方向 | 名前 | 形状 | 説明 |
|---|---|---|---|
| 入力 | input_ids | [1, seq_len] | トークンID (Int32) |
| 入力 | attention_mask | [1, seq_len] | アテンションマスク (Int32) |
| 入力 | kv_cache | レイヤーごと | キーバリューキャッシュ状態 |
| 出力 | logits | [1, 1, 151936] | 次トークンロジット (Float16) |
| 出力 | kv_cache_out | レイヤーごと | 更新されたKVキャッシュ |
モデルバリアント
| バリアント | 量子化 | サイズ | 計算 | 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 |
サンプリング設定
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)
| パラメーター | デフォルト | 説明 |
|---|---|---|
temperature | 0.6 | ランダム性(0 = グリーディ、1 = 創造的) |
topK | 50 | 上位K候補を保持 |
topP | 0.95 | ヌクレウスサンプリングしきい値 |
maxTokens | 512 | 最大応答トークン数 |
repetitionPenalty | 1.1 | 繰り返しトークンにペナルティを課す |
disableThinking | false | 思考モードをスキップ |
maxThinkingTokens | 100 | 思考トークンの上限 |
マルチターン会話
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() // 履歴とKVキャッシュをクリア
メモリ管理
// メモリ状態を確認
print(chat.isLoaded) // true
print(chat.memoryFootprint) // 438304768 (~418 MB)
// メモリ圧迫下で解放
chat.unload()
print(chat.isLoaded) // false
// 必要に応じて再ロード
let chat = try await Qwen35MLXChat.fromPretrained()
iPhoneでは、TTS推論の前にLLMをアンロードすると約418 MB(INT4 MLX)または約981 MB(INT8 CoreML)が解放され、完全なASR → LLM → TTSパイプライン実行時のjetsam終了を防ぎます。
パフォーマンス
| デバイス | プレフィル | デコード | トークン/秒 |
|---|---|---|---|
| M2 Max | 約50ms | 約65ms/tok | 約15 tok/s |
| iPhone 16 Pro | 約1.5s | 約450ms/tok | 約2.2 tok/s |
変換
MLXウェイトは、MLX変換スクリプトを使用して元のQwen3.5-0.8Bチェックポイントから変換されます。CoreMLモデルは、Neural Engineデプロイメント用の別の変換スクリプトを使用します。事前変換済みウェイトはHuggingFace上でaufklarer/Qwen3.5-0.8B-Chat-MLX(INT4:418 MB)およびaufklarer/Qwen3.5-0.8B-Chat-CoreML(INT8:981 MB)で入手可能です。