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が必要な音声パイプライン向けに設計されています。

Voice Pipeline Ready

Qwen3.5 Chatは、ASR → LLM → TTSチェーンのLLMコンポーネントとしてSpeechCore VoicePipelineと統合されます。ハイブリッドDeltaNetアーキテクチャは、長いコンテキストに対して効率的な線形時間のアテンションを提供します。

クイックスタート

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: "")
}

アーキテクチャ

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

サンプリング設定

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
)
パラメーターデフォルト説明
temperature0.6ランダム性(0 = グリーディ、1 = 創造的)
topK50上位K候補を保持
topP0.95ヌクレウスサンプリングしきい値
maxTokens512最大応答トークン数
repetitionPenalty1.1繰り返しトークンにペナルティを課す
disableThinkingfalse思考モードをスキップ
maxThinkingTokens100思考トークンの上限

マルチターン会話

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

メモリ管理

// 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()
iOSメモリのヒント

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)で入手可能です。