技術 約7分で読めます

DeepSeek-V4-Pro-DSparkは新モデルではなく投機的デコード用のV4-Pro派生

いけさん目次

Hugging Faceに deepseek-ai/DeepSeek-V4-Pro-DSpark が出ていた。
名前だけ見るとDeepSeek V4の新しいPro版に見えるが、モデルカードにははっきり「新モデルではない」と書かれている。
中身は同じDeepSeek-V4-Proチェックポイントに、投機的デコード用の追加モジュールを付けた派生リポジトリだった。

4月に書いたDeepSeek V4 Previewの記事では、1.6T総パラメータ、49Bアクティブ、1Mコンテキスト、CSA+HCAの長文脈アテンションを見た。
DSpark版はその基盤性能を伸ばした発表ではなく、焦点はデコード時のトークン生成をまとめて先読みするための部品にある。

投機的デコードで何を足したのか

投機的デコードは、軽いドラフトモデルが先に複数トークンを提案し、本体モデルがそれを検証して採用する推論手法だ。
1トークンずつ本体を呼ぶより、採用された分だけデコードの待ち時間を縮められる。
品質は本体モデルで検証するため、ドラフト側は「当たりやすく、安く、速い」ことが役割になる。

検証は本体の1回の前向き計算でまとめて行う。
ドラフトが出した候補列を本体に通し、先頭から本体の分布と一致する分だけ採用する。
途中で外れた位置は本体側の出力で1つ埋め直すので、最終的に出てくるトークン列は本体を単体で回したときと同じになる。
速くなるだけで品質は落ちない、というのがこの手法の前提だ。

flowchart TD
    A[確定済みトークン列] --> B[DSparkドラフトヘッド<br/>5トークンを一括提案]
    B --> C[V4-Pro本体で<br/>5トークンを1回の計算で検証]
    C --> D{先頭から<br/>どこまで一致したか}
    D -->|全部一致| E[5トークン採用<br/>本体が次の1つを追加]
    D -->|途中で外れ| F[一致分だけ採用<br/>外れた位置は本体の出力で訂正]
    E --> A
    F --> A

DeepSeekが参照している DeepSpec は、このドラフトモデルを訓練・評価するためのコードベースだ。
扱うドラフトは3種類で、外部で提案されたEAGLE系のEagle3に、DeepSeek名義のDSparkとDFlashが加わる。
パイプラインはデータ準備・訓練・評価の3段。まず本体モデルでターゲット出力を作り直してキャッシュし、それを教師にしてドラフトを訓練する。
READMEには、小さい Qwen/Qwen3-4B を本体に使うデフォルト例でもターゲットキャッシュが約38TBに達する、と注意書きがある。1.6T級のV4-Proを本体に据えれば当然これより重い。手元で軽く再学習するための道具ではない。

DSpark版V4-Proの config.json には、通常のV4-Proにはない設定が増えている。

項目DSpark版の値意味
dspark_block_size5一度にドラフトする候補トークン数
dspark_target_layer_ids58, 59, 60本体側の終盤層から隠れ状態を取る位置
dspark_markov_rank512Markov head側の低ランク表現
dspark_noise_token_id128799ドラフト入力を埋める専用トークン

inference/model.py では DSparkBlockmtp.* 名前空間の下に置かれ、forward_spec がドラフト候補、ロジット、confidenceを返す。
本体の終盤層から取った隠れ状態を main_proj でまとめ、ノイズトークンで埋めたドラフト列を作り、5トークン分の候補を生成する流れになっている。
Markov headが直前トークン由来のバイアスを足し、confidence headが候補ごとの採用しやすさを出す。

ファイルサイズはむしろ増えている

Hugging Face APIで見ると、通常の DeepSeek-V4-ProusedStorage が約864.8GB、DSpark版は約892.8GBだった。
投機的デコードは推論時の待ち時間を下げるための仕組みで、重みファイルの配布サイズを小さくするものではない。
DSpark版では追加モジュールの分だけストレージは増えている。

モデル本体の条件もV4-Proのままだ。
総パラメータ1.6T、アクティブ49B、最大位置埋め込み1,048,576、MoEエキスパート384個、トークンごとに6エキスパート。
重みはFP8中心で、MoEエキスパートはFP4を使う。

Hugging Faceのパラメータ表示は、V4-Proが約8,616億、DSpark版が約8,895億と出る。公称の1.6Tと桁が合わないが、これは数え方の問題だ。
FP4のエキスパート重みは2つを1バイト(int8)にまとめて格納され、メタデータ上は詰めたあとの要素数で数えられている。
V4-Proの内訳ではint8が約7,864億要素を占め、これを2倍に開くとエキスパートだけで約1.57Tになる。残りのFP8・BF16を足すと、おおよそ公称の1.6Tに届く。
DSpark版で要素数が増えているのも、別モデルになったからではなく、ドラフトヘッドのぶんが上乗せされただけだ。

inference/README.md も、ローカル実行の入り口は軽くない。
まずHugging Face形式の重みをプロジェクト独自形式に変換し、EXPERTS=256MP=4 の例で torchrun を叩く。
FP8で使う場合は config.json から expert_dtype: "fp4" を外し、変換時に --expert-dtype fp8 を指定する、とある。

個人PCで「DSparkが付いたからV4-Proを触りやすくなった」という話ではない。
V4-Proを置けるGPU構成が先にあり、そのうえでデコード待ち時間を削るための派生だ。

既存のMTPとは別の先読み経路

V4-Proの設定にはもともと num_nextn_predict_layers: 1 がある。これは本体側のMTP(複数トークン予測)で、本体が次トークンを出すついでに先のトークンも当てにいくための1層だ。
DSparkはこれとは別系統の先読みになる。model.py では本体の layers とは独立に self.mtp という ModuleList が用意され、そこに DSparkBlock が並ぶ。

段数は n_mtp_layers という推論側の引数で決まり、config.json には書かれていない(コード上の既定値は1)。
config.jsonに固定されているのは参照先の層のほうだ。dspark_target_layer_ids: [58, 59, 60] の通り、61層あるうちの終盤3層から隠れ状態を引く。
DSparkBlockmain_proj はこの3層ぶんの隠れ状態を連結し(入力次元は dim × 3)、1本にまとめてからドラフト生成へ渡す。

DSparkは単なるサンプリング設定ではない。
終盤3層の隠れ状態を受け取り、専用ブロックで候補を作り、直前トークン由来のバイアスを足すMarkov headと、候補ごとの採用しやすさを出すconfidence headまで持つ。
構造としては「V4-Proを速く回すための外付けドラフトヘッド」に近い。

V4-Pro本体は、もともとメモリ側の負荷を削る方向に振った設計でもある。
KVヘッドは num_key_value_heads: 1 の実質マルチクエリーで、論文でもV3.2比でKVキャッシュは1割まで落ちるとされる。
メモリを削り切ると、残る待ち時間は1トークンずつ順に出す逐次デコードそのものになる。DSparkはそこを縮めにいく派生だ。

Claude Fable停止後の中華系エージェントモデル比較では、DeepSeek V4を「1M文脈のオープンウェイトを置いたモデル」として扱った。
DSpark版を足すと、その後段に「配った重みをどう速く生成させるか」という推論ランタイム側の話が出てくる。
APIで叩く分には表に出ないが、自前ホストでは出力速度とGPU占有時間にそのまま差が出る。

まだ速度の数字は読めない

モデルカードには、DSpark版そのものの速度ベンチは載っていない。
DeepSpec側も評価スクリプトとデータセット名(gsm8k、math500、aime25、humaneval、mbpp、livecodebench、mt-bench など)は公開しているが、READMEにDeepSeek-V4-Pro-DSparkの速度倍率や採用長(1ステップで平均何トークン通るか)の数字はない。
作成は2026年6月27日。翌日に見直した時点でダウンロード数は数百件まで増えていたが、893GBの配布物という性質上これが丸ごと走らせた回数とは限らず、速度を測った第三者のベンチもまだ見当たらない。

なので、今の段階で読めるのは構造までだ。
V4-Pro本体の能力比較ではなく、1.6T級MoEを本番推論に載せるとき、ドラフトヘッドまで含めた配布物をDeepSeekが出し始めた。
同じMITライセンスで、推論コード、変換スクリプト、エンコーディング実装、66分割のsafetensorsまで揃っている。

参考