2026-09-10、DeepSeek は新アーキテクチャファミリーの中で最小サイズのメンバー DeepSeek-V4.1-Flash を発表しました:552B 総パラメータ MoE、まったく新しい Causal-Encoder-Decoder(CED)非対称アーキテクチャ、入力側はわずか 8B を活性化、出力側は 16B を活性化し、さらに 1M tokens コンテキスト、384K tokens 最大出力、ネイティブなマルチモーダル視覚理解を備えています。さらに重要なのは、ローカル展開者に向けたシグナルです:KV Cache は 1 token あたり約 890 bytes で、V4 Flash の約 3514 bytes と比較して、HBM 要件は前世代の 1/4、SSD ストレージは 1/8 に低減し、初代 DeepSeek と比べて約 437 倍 縮小しています。同時に、公式はオープンソースコミュニティと緊密に協力して V4.1-Flash の推論サポートを推進し、より多くの展開オプションを模索すること、2000 GPU + ストレージクラスタを対象とする大規模展開については公式と相談可能であることを明確にしています。重みは Hugging Face の deepseek-ai/DeepSeek-V4.1-Flash で公開され、技術レポートも添付されています。国家超算インターネットも 2026-09-11 に API サービスと重みファイルを公開しました。本記事の第1部では、アーキテクチャ、メモリ会計、KV Cache、長シーケンススケジューリングという4つの「難所」に焦点を当て、公式に公開されたデータを実行可能な展開パラメータとコード骨格に翻訳します。第2部では、高並行サービスオーケストレーションと負荷テスト調整に進みます。
CED 非対称アーキテクチャの分解:入力 8B / 出力 16B 活性化が MoE 推論パスをどう書き換えるか
従来の Decoder-only 大規模モデルは、各層で同じトークン群に対して同じアテンションと MoE ルーティングを行い、入力と出力の計算予算は高度に対称です。DeepSeek-V4.1-Flash の Causal-Encoder-Decoder(CED)非対称アーキテクチャはこの対称性を破ります:入力側(エンコーダの役割)は各トークンで 8B パラメータのみを活性化し、コンテキストを因果的に利用可能な表現に圧縮する役割を担います。出力側(デコーダの役割)は新しく生成される各トークンで 16B パラメータを活性化し、高品質な自己回帰生成を担います。ここでの「エンコーダ」は依然として因果的であることに注意してください。未来のトークンを見ることはできず、巨大なコンテキストを一度に読み込んで KV としてキャッシュするだけなので、検索型の双方向エンコーダとは本質的に異なります。
この分業が推論パスに与える影響は、3点に分解できます:
- 計算グラフの非対称性:Prefill 段階は 8B 活性化パスを通り、計算密度が低くメモリ帯域幅の圧力も比較的小さいため、長い prompt のスループットを高くしやすいです。Decode 段階は 16B 活性化パスを通り、1 token あたりの計算量と重み読み込み量が大きく、レイテンシの主戦場となります。エンジニアリング上は、最適化リソースを Decode に傾けるべきです。たとえば、出力側のエキスパートに対してより積極的な量子化と、より細かいエキスパート並列分割を行うなどです。
- メモリ使用量の分離:入力側の活性化は小さく安定しているため常駐に適し、出力側の活性化は大きく batch の増加に伴って増えるため動的割り当てに適します。両者を同じメモリプールで統一的な並列戦略の下に混在させると、「Prefill が Decode の重みを押し出す」OOM が発生しやすくなります。
- KV 生成のタイミング差:エンコード段階では全シーケンスの KV を一度に生成し、デコード段階では KV を増分的に追加します。出力側の活性化が高いため、Decode 段階では 1 token あたりの KV 書き込み圧力がより大きく、キャッシュチャンク戦略は Decode の KV 永続化帯域を優先的に保証する必要があります。
一言でまとめると:CED は「コンテキストを読む」ことを安く、「答えを書く」ことを高くします。これは後述するすべてのスケジューリング戦略の優先順位を直接決定します。Decode 回数を減らし、入力再利用率を高める最適化は、その効果が増幅されます。
552B 総パラメータ MoE のメモリ会計:単機マルチ GPU におけるエキスパート並列と重みシャーディングの実装
まずよくある誤解を正しましょう:552B 総パラメータは 552B の全量常駐メモリを意味しません。MoE のスパース活性化は、単一トークンが一部のエキスパートのみを通ることを意味しますが、重みはすべてアドレス可能でなければならないため、メモリ会計は「重み」「活性化」「KV」「フレームワークオーバーヘッド」の4つの帳簿に分けて計算する必要があり、公式に公開された 552B と 8B/16B 活性化に基づく比例推測のみを行い、未公開のパラメータは一切導入しません。
重みの帳簿:総パラメータ数は 552B。BF16(2 bytes/param)で見積もると、全量重みは約 1104 GB です。出力側エキスパートを FP8(1 byte/param)にし、残りを BF16 に保つ混合方式なら、約 700~900 GB 程度まで圧縮できます。これが、単機 8 カードで各カード 80GB(合計 640GB)であっても、単純な TP ではなく エキスパート並列(EP)+ テンソル並列(TP) の組み合わせが必要になる理由です。経験的な方法:
- EP 優先:異なるエキスパートを異なるカードに分割し、All-to-All はルーティングでヒットしたカード間でのみ発生させます。エキスパート数とカード数の整除関係が負荷分散を決定するため、EP 度は単層のエキスパート数の整数倍にして、ホットスポットカードを避けることを推奨します。
- TP で補完:アテンション重みと共有層を TP で分割し、単カード常駐メモリを削減します。TP が導入する All-Reduce は EP の All-to-All と相互接続帯域を奪い合うため、必ず両者を異なるリンクまたは異なるタイミングでオーバーラップさせてください。
- 重みシャーディング:非アクティブなエキスパートは pinned host memory や NVMe に置き、プリフェッチを併用できます。ここで SSD 1/8 の効果が現れます。重みと KV の永続化要件が同時に低下します。
以下のコードは、ローカル展開時に最も直接的なメモリ予算プローブを示します。まず deepseek-flash に最小リクエストを送ってサービス到達性を確認し、次に公式の活性化比に基づいてローカルメモリ割り当てを見積もります。
import os
import requests
BASE = "https://api.deepseek.com"
KEY = "your-deepseek-api-key"
HEADERS = {
"Authorization": f"Bearer {KEY}",
"Content-Type": "application/json",
}
# 1) 接続性とモデル名の確認:公式 API のモデル名は deepseek-flash
def probe():
payload = {
"model": "deepseek-flash",
"messages": [{"role": "user", "content": "ping"}],
"max_tokens": 8,
}
r = requests.post(f"{BASE}/chat/completions",
headers=HEADERS, json=payload, timeout=30)
r.raise_for_status()
return r.json()
# 2) 552B 総パラメータのローカル重みメモリ予算
TOTAL_PARAMS = 552_000_000_000 # 公式発表の総パラメータ
BYTES = {"bf16": 2.0, "fp8_mix": 1.4} # 混合精度の等価バイト係数
def weight_budget(n_gpus, per_gpu_gb, dtype="bf16"):
total_gb = TOTAL_PARAMS * BYTES[dtype] / (1024 ** 3)
capacity = n_gpus * per_gpu_gb
return {
"weight_requirement_GB": round(total_gb, 1),
"cluster_capacity_GB": capacity,
"headroom_GB": round(capacity - total_gb, 1),
"fully_resident": capacity >= total_gb,
}
if __name__ == "__main__":
print(probe()["choices"][0]["message"]["content"])
print(weight_budget(8, 80)) # 単機 8x80GB BF16
print(weight_budget(16, 80, "fp8_mix")) # 2台 16x80GB 混合精度
落とし穴の注意:8B/16B 活性化をメモリ要件と見なさないでください。それらは計算量を決定するもので、常駐重みではありません。MoE の All-to-All は小さい batch ではレイテンシ占有率が極めて高いため、continuous batching を有効にし、EP 通信と計算をオーバーラップさせることを推奨します。そうしないと、Decode 段階の 16B 活性化の利点が通信に食われてしまいます。
KV Cache
サイズ実測:890 bytes/token と HBM 1/4、SSD 1/8 のデプロイ上の意味
これは今世代で最も「直感に反する」データであり、ローカル展開者にとって最も歓迎すべきものでもある。公式リリース投稿によると、V4.1-Flash は 1 token あたりの KV Cache が約 890 bytes、V4 Flash は約 3514 bytes である。これに基づくと、KV Cache の HBM 要件は前世代の 1/4 に下がり、SSD ストレージは 1/8 に下がり、初代 DeepSeek と比べると約 437 倍 縮小する。
この 3 つの数字を構成判断に翻訳すると:
| 指標 | V4 Flash | V4.1-Flash | エンジニアリング上の意味 |
|---|---|---|---|
| KV の 1 token あたりサイズ | 約 3514 bytes | 約 890 bytes | 単一 GPU で保持できる同時コンテキスト token 数が約 4 倍に増加 |
| KV の HBM 要件 | 基準 1.0 | 0.25(1/4 に低下) | 同じ GPU 数で約 4 倍の KV 常駐量を支えられる、またはより少ない GPU で同じ同時実行数を処理できる |
| KV の SSD ストレージ | 基準 1.0 | 0.125(1/8 に低下) | 長セッションの永続化コストが大幅に下がり、1M コンテキストのスピルオーバーキャッシュがより現実的になる |
| 初代 DeepSeek との比較 | — | 約 437 倍縮小 | かつてハイエンドクラスタが必要だった KV が、今では単一マルチ GPU マシンで計画できる |
実測レベルの意味:1M tokens のコンテキストを例にすると、単一シーケンスの KV は約 890 bytes × 1,000,000 ≈ 890 MB(マルチシーケンス増幅は考慮せず)。32 並列がそれぞれ 100K tokens を占める場合、約 32 × 100,000 × 890 bytes ≈ 2.85 GB となる。これは、KV がもはや VRAM を食い尽くす元凶ではなく、重みこそが第一の制約であることを意味する。したがって、ローカル展開の第一優先は「KV を節約する」から「重みを節約する + 高帯域相互接続」へと変わる。
対応するサーバー側の構成戦略:
- KV ページングブロック(block)はやや大きめに設定し、ページテーブル管理のオーバーヘッドを減らせる。890 bytes/token により単一ブロックのサイズがより穏やかになるため。
- HBM 内の KV プールは 1/4 で見積もればよく、節約した VRAM を出力側の 16B 活性化重みに回せる。
- SSD 側は 1/8 の容量で計画し、「長コンテキストセッションの全量永続化 + ホット/コールド階層化」を大胆に有効化できる。
次のセクションでは、公式 API を使って「token あたりの KV 永続化量を見積もる」検証スクリプトを作り、実際の同時実行曲線と照合しやすくする:
import requests
BASE = "https://api.deepseek.com"
KEY = "your-deepseek-api-key"
HEADERS = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}
KV_BYTES_PER_TOKEN = 890 # 公式:V4.1-Flash 約 890 bytes/token
KV_V4_FLASH = 3514 # 公式:V4 Flash 約 3514 bytes/token
def estimate_kv(text: str, concurrency: int = 1):
payload = {
"model": "deepseek-flash",
"messages": [{"role": "user", "content": text}],
"max_tokens": 1,
}
r = requests.post(f"{BASE}/chat/completions",
headers=HEADERS, json=payload, timeout=60)
r.raise_for_status()
usage = r.json().get("usage", {})
pt = usage.get("prompt_tokens", 0)
kv_new = pt * KV_BYTES_PER_TOKEN / (1024 ** 2)
kv_old = pt * KV_V4_FLASH / (1024 ** 2)
return {
"prompt_tokens": pt,
"KV_MB_新": round(kv_new * concurrency, 2),
"KV_MB_旧": round(kv_old * concurrency, 2),
"压缩比": round(kv_old / kv_new, 2), # 予想約 4.0
}
if __name__ == "__main__":
long_text = "部署测试。" * 2000
print(estimate_kv(long_text, concurrency=32))
1M コンテキスト + 384K 出力:長シーケンス推論の KV 管理とチャンクスケジューリング戦略
公式には 1M tokens のコンテキスト と 最大 384K tokens の出力 が示されている。この 2 つの数字を組み合わせると、1 回のリクエストが約 1.38M tokens の KV ライフサイクルを担う可能性がある。890 bytes/token で見積もると、ピークは約 1.2 GB/シーケンスとなる。マルチシーケンス同時実行下では、KV の割り当て、再利用、回収がスケジューリングシステムの中核となる。
推奨されるチャンクスケジューリング戦略:
- プレフィックスチャンクと共有:system prompt、ツール定義、長文ドキュメントを固定ブロックに分割してハッシュを計算し、同一プレフィックスは KV を直接再利用する。ヒットすれば Prefill 全体を節約できる。公式価格では「キャッシュヒット入力」がオフピーク 0.02 元 / ピーク 0.04 元であるのに対し、「キャッシュミス入力」はオフピーク 1 元 / ピーク 2 元で、ヒットとミスの差は 50 倍である。ローカルサービスでも同様に、プレフィックスキャッシュヒット率を第一級指標とすべきである。
- スライディングウィンドウ + セグメント Checkpoint:超長入力に対して、ブロック単位で KV checkpoint を保存し、切り捨てやロールバック時に直近の checkpoint から復元して全量再計算を避ける。
- 出力側のセグメントフロー制御:384K 出力を一度に生成することは不可能であり、セグメントごとに停止条件と再試行境界を設定し、単一リクエストが Decode リソースを長時間占有して他の同時実行に影響するのを防ぐ。
- ホット/コールド階層化:アクティブセッションの KV は HBM に残し、低頻度セッションは SSD に降格(1/8 容量で計画)。プリフェッチで IO レイテンシを隠蔽する。
エンジニアリングの落とし穴:長コンテキストの Prefill は 8B 活性化であり、それ自体は高コストではないが、KV 書き込みとページテーブル保守はブロック数の増加に伴って線形に悪化する。最大ブロック数の上限と LRU 淘汰を必ず設定すること。そうしないとメモリ断片化が有効 VRAM を食い尽くす。もう 1 つの落とし穴は位置エンコーディングの外挿である。1M コンテキスト下で RoPE スケーリングを校正しないと、長距離アテンションが明らかに劣化する。展開構成で目標コンテキスト長を明示的に宣言し、一貫性チェックを行うことを推奨する。
思考強度 low/high/max の 3 段階:非思考モードと思考モードの推論予算配分
公式設定:思考モードがデフォルトで、強度は low / high / max の 3 段階。同時に非思考モードも保持される。この 3 段階は「スイッチ」ではなく推論予算の段階であり、CoT 長と Decode 回数に直接作用する。Decode はまさに 16B 活性化パスの高コスト部分であるため、段階の選択はレイテンシと品質の直接的なトレードオフに等しい。
| モード/段階 | 典型的なレイテンシ | 出力長の傾向 | リソース使用量 | 適用シーン |
|---|---|---|---|---|
| 非思考 | 最低 | 短く直接的 | 低 | 分類、抽出、フォーマット、FIM コード補完 |
| 思考 low | 低〜中 | 中程度の CoT | 中 | 通常の Q&A、簡単なツールオーケストレーション |
| 思考 high | 中〜高 | 長い CoT | やや高い | 複雑 推論、マルチステップツール呼び出し |
| 思考 max | 最高 | 最長 CoT | 高 | GPQA/数学/競技レベルの難問、Agent 長鎖計画 |
選定の推奨:非思考モードはすべての「決定論的タスク」——JSON 抽出、意図分類、コード FIM 補完——に使用し、思考ティアは「非決定論的タスク」に残します。サービスオーケストレーションではリクエストごとに動的にルーティングすべきです。ゲートウェイ層で prompt の特徴(「証明/導出/多段」を含むか)または上流の意図分類器の出力に基づいてティアを決定し、max ティアには並行制限をかけます。公式の並行制限は 2500 で、max ティアは単一リクエストの占有時間が長いため、全体の SLA を損なわないよう、別途制限付きキューを用意することを推奨します。注意点として思考モードはデフォルトで有効です。クライアントが明示的に思考を無効化しない場合、短いタスクが不可解に遅くなります——これは接続側で最もよくある性能苦情の原因です。
ネイティブマルチモーダル視覚理解の接続:画像リンク、base64、Files API の3経路
V4.1-Flash はネイティブマルチモーダル視覚理解をサポートし、画像入力には3つの経路があります:画像リンク、base64、Files API。三者はローカルサービスにおける前処理とキャッシュ設計が大きく異なります。
- 画像リンク:サーバーが URL から取得します。利点はリクエストボディが小さく再利用しやすいこと;落とし穴は外部ネットワーク到達性と直リンク防止で、同一 URL の内容が変化する可能性があるため、URL をそのままキャッシュキーにできません。ETag やコンテンツハッシュと組み合わせるべきです。ローカルデプロイで外部ネットワークが制限されている場合、プロキシを自前で構築して取得・ディスク保存し、base64 に変換する必要があります。
- base64:自己完結型で外部依存がなく、イントラネットやオフライン環境に適しています;代償はリクエストボディが約 33% 膨張し、大量の重複画像が繰り返し転送されることです。ゲートウェイ層で画像コンテンツのハッシュによる重複排除を行い、ヒット時は参照 ID に置き換えるべきです。
- Files API:先にアップロードしてから参照する方式で、大きな画像やマルチターンでの再利用に最適です。エンジニアリング上は「アップロード時に登録」するリソーステーブルを実装し、ファイル ID、ハッシュ、TTL を記録し、セッション次元で参照カウントを行い、ファイルリークを防ぐべきです。
キャッシュ設計の要点:画像特徴(生バイトではなく)を再利用可能なオブジェクトとして扱い、同一画像で異なる質問には視覚エンコード結果を優先的にヒットさせます;同時にマルチモーダル入力の KV も 890 bytes/token の台帳に含まれるため、長画像+長コンテキストの組み合わせは事前に予算を取る必要があります。視覚リクエストは非思考または思考 low ティアを推奨し、タスク自体が深い視覚推論を必要としない限り、max ティアは明らかな遅延の無駄を生みます。
JSON Output、Tool Calls、Responses API:構造化出力のエンジニアリング実装
V4.1-Flash は JSON Output、Tool Calls、Responses API、Anthropic API、および対話プレフィックス継続と FIM(非思考のみ)をサポートします。ローカルサービスオーケストレーションにとって、真の分水嶺は「誰が構造の正しさを保証するか」です。
- JSON Output:抽出とデータパイプラインに適し、サーバー側で schema 検証と失敗時のリトライを行うべきで、未検証の JSON を直接 DB に書き込んではいけません。自由形式の記述ではなく厳格な schema(必須フィールド+列挙制約)を使うことを推奨します。
- Tool Calls:どのツールを呼ぶかはモデルが決定し、サーバーはツールホワイトリスト+パラメータ schema 検証+タイムアウト遮断の三点セットを必ず実装し、モデルがツール名やパラメータを捏造するのを防ぎます。多段ツールチェーンは最大ラウンド数を制限し、思考ティアと連動させることを推奨します(複雑なチェーンは high、単純なチェーンは low)。
- Responses API:従来の chat よりも「1リクエスト1構造化レスポンス」のパラダイムに近く、多段オーケストレーションを単一呼び出しに収束させるのに適しています;ローカルゲートウェイにとってレスポンスオブジェクトの状態機械がより単純で、冪等性とリプレイの実装に有利です。
- Anthropic API:既存の Anthropic エコシステムのクライアントに互換接続を提供し、ローカルサービスは両方のプロトコルを同時に公開でき、ゲートウェイでプロトコル正規化を行うことで業務側の改造成本を避けられます。
以下に JSON schema 検証とツールホワイトリストを備えた最小実装を示します:
import json
import requests
BASE = "https://api.deepseek.com"
KEY = "your-deepseek-api-key"
HEADERS = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}
ALLOWED_TOOLS = {"get_weather", "search_docs"}
SCHEMA = {"name": str, "score": (int, float)} # 期待する構造化フィールド
def call_json(prompt: str):
payload = {
"model": "deepseek-flash",
"messages": [{"role": "user", "content": prompt}],
"response_format": {"type": "json_object"},
"max_tokens": 1024,
}
r = requests.post(f"{BASE}/chat/completions",
headers=HEADERS, json=payload, timeout=120)
r.raise_for_status()
text = r.json()["choices"][0]["message"]["content"]
try:
data = json.loads(text)
except json.JSONDecodeError:
return {"ok": False, "reason": "invalid_json"}
for k, typ in SCHEMA.items():
if k not in data or not isinstance(data[k], typ):
return {"ok": False, "reason": f"bad_field:{k}"}
return {"ok": True, "data": data}
def validate_tool_calls(msg):
calls = msg.get("tool_calls") or []
for c in calls:
name = c.get("function", {}).get("name")
if name not in ALLOWED_TOOLS:
raise ValueError(f"tool not allowed: {name}")
return calls
if __name__ == "__main__":
print(call_json("name と score フィールドを含む JSON を出力"))
落とし穴:JSON Output と思考モードを重ねると、CoT が構造フィールドを汚染する可能性があるため、必ず公式の能力境界に従ってレスポンス形式を使用し、後検証を行ってください;Tool Calls のパラメータにネストしたオブジェクトが含まれる場合、トップレベルの型だけを見るのではなく層ごとに検証することを推奨します。
対話プレフィックス継続と FIM:非思考モードのみでのコード補完チェーン構築
公式に明確です:対話プレフィックス継続と FIM は非思考モードのみをサポートします(FIM は明確に「非思考のみ」と記載)。これはハード制約であり、コード補完チェーンは思考を明示的に無効化しなければならず、そうでなければリクエストが拒否されるか、期待と異なる動作になります。
ローカルコード補完チェーンの実装要点:
- モード固定:補完サービスのリクエスト構築層で非思考を強制し、上位層から思考パラメータを透過させないようにし、アーキテクチャ上で誤用を排除します。
- コンテキストのトリミング:補完リクエストは「全ファイル」ではなく「前後文のウィンドウ」が重要です。構文ブロック単位でトリミングし、カーソル前の数行とカーソル後の少数行を保持し、prompt 長を制御して遅延を抑えることを推奨します。
- FIM テンプレートの一貫性:FIM は固定の前後綴プレースホルダ規約に依存するため、クライアントとサーバーは同一のテンプレートを使用しなければならず、そうでなければ補完品質が崖のように低下します。
- プレフィックス継続による制約生成:対話プレフィックス継続は「与えられた冒頭を強制的に続ける」のに適し、固定形式のコードスニペットや設定項目の生成に使用できます。
- キャッシュ再利用:同一ファイルの履歴補完 KV はプレフィックスハッシュで再利用でき、キャッシュヒット後は入力コストをアイドル 0.02 元 / ピーク 0.04 元(100万 tokens あたり)の水準まで下げられ、IDE の高頻度トリガー場面では決定的なコスト最適化となります。
遅延予算については、補完体験では最初の token をできるだけ早く返す必要があるため、非思考 + 短い出力で、ストリーミング返却を併用しなければなりません。ここまでで、アーキテクチャ、VRAM、KV、長いシーケンス、思考ティア、マルチモーダル、構造化出力、補完パイプラインが整理されました。次の部分では、高並行サービスのオーケストレーション、並行数上限 2500 における待ち行列とレート制限の設計、価格設定とピーク/アイドル戦略のコスト計算(ピークは月曜から金曜の 9:00-12:00、14:00-18:00、アイドル価格はピークの半額。キャッシュヒット入力はアイドル 0.02 元 / ピーク 0.04 元、キャッシュミス入力はアイドル 1 元 / ピーク 2 元、出力はアイドル 4 元 / ピーク 8 元)、そして API からローカルデプロイへの移行パスと負荷試験方法に入ります。
前半では、DeepSeek-V4.1-Flash の 552B MoE と CED 非対称アーキテクチャ(入力側で 8B を活性化、出力側で 16B を活性化)、1M コンテキストと 384K 最大出力、そして KV Cache のサイズが V4 Flash の約 3514 bytes/token から約 890 bytes/token に削減されたという、ストレージと VRAM の主線を整理しました。続くこのセクションでは、視点をモデル自体からサービス側へ移します。モデル名と並行数、ルーティング切り替え、価格設定とオフピーク、ベンチマークの読み解き、重みのデプロイ、エコシステム連携、そして実際に本番運用して初めて踏む移行の落とし穴です。
deepseek-flash のモデル名と 2500 同時実行:API 互換ルーティングと旧名の移行
まず最初にやるべきことはモデル名を確定することです。DeepSeek-V4.1-Flash の API モデル名は deepseek-flash で、公式に示されている同時実行制限は 2500 です。この数字は上級者にとって何を意味するのでしょうか。それは孤立した QPS 指標ではなく、クライアントのコネクションプール、リトライキュー、レートリミッターのしきい値を逆算するために使う上限制約です。本番環境ではローカルセマフォを 2200〜2400 に設定し、ヘルスチェック、カナリアプローブ、運用コールのバーストトラフィックのために約 4%〜12% の余裕を残すことを推奨します。
同時に、旧名のライフサイクルにも注意が必要です。旧 deepseek-v4-flash と deepseek-v4-flash-vision-exp はすでにオフラインになっており、現在は互換ルーティングです。つまり、旧名へのリクエストはすぐに 404 を返すのではなく、透過的に V4.1-Flash へ転送されます。これはスムーズな移行のための猶予を与える一方で、隠れたリスクも孕んでいます。呼び出しチェーンに旧名が残っていると、エラーは表面化せず、互換ルーティングが完全に削除される日に一斉に爆発します。エンジニアリング上正しいやり方は、モデル名を 1 つの設定項目(環境変数または設定センター)に収束させ、同時にゲートウェイで旧名を含む warn ログを出力し、「旧名ヒット率」という指標で移行の進捗を駆動することです。
今回の視覚機能はネイティブなマルチモーダル視覚理解であり、画像リンク、base64、Files API の 3 つの入力形態をサポートします。以前は V4-Flash-Vision-Exp が独立したモデル名でしたが、現在は deepseek-flash に統一されたため、ルーティング層は「テキスト/視覚」で分岐する必要がなくなり、content 配列に image_url を含めなければ純粋なテキストリクエストになります。これはアーキテクチャを簡素化しますが、同じレート制限ゲートがテキストと視覚のトラフィックを同時に担うことを意味し、視覚リクエストのトークン増幅効果には別途クォータを設ける必要があります。
import os
import asyncio
import httpx
API_KEY = os.environ.get("DEEPSEEK_API_KEY", "your-deepseek-api-key")
BASE_URL = "https://api.deepseek.com"
MODEL = "deepseek-flash"
MAX_CONCURRENCY = int(os.environ.get("DS_MAX_CONCURRENCY", "2200"))
sem = asyncio.Semaphore(MAX_CONCURRENCY)
async def call_flash(client, messages, thinking="high"):
body = {
"model": MODEL,
"messages": messages,
"max_tokens": 8192,
"thinking": {"type": "enabled", "effort": thinking},
"stream": False,
}
async with sem:
for attempt in range(5):
try:
resp = await client.post(
f"{BASE_URL}/chat/completions",
headers={"Authorization": f"Bearer {API_KEY}"},
json=body,
timeout=httpx.Timeout(180.0, connect=10.0),
)
if resp.status_code == 429:
await asyncio.sleep(min(2 ** attempt, 30))
continue
resp.raise_for_status()
return resp.json()
except (httpx.ConnectError, httpx.ReadTimeout):
await asyncio.sleep(min(2 ** attempt, 30))
raise RuntimeError("deepseek-flash exhausted retries")
async def main():
limits = httpx.Limits(max_connections=MAX_CONCURRENCY,
max_keepalive_connections=MAX_CONCURRENCY // 2)
async with httpx.AsyncClient(limits=limits, http2=True) as client:
tasks = [
call_flash(client, [{"role": "user", "content": f"审计片段 {i}"}])
for i in range(50)
]
results = await asyncio.gather(*tasks, return_exceptions=True)
ok = sum(1 for r in results if isinstance(r, dict))
print(f"ok={ok} failed={len(results) - ok}")
if __name__ == "__main__":
asyncio.run(main())
2026-09-14 のルーティング切り替え:deepseek-v4-pro のリクエストが Flash 課金となる場合の対応戦略
変更通知ウィンドウに必ず記載しなければならない 2 つ目のイベントは、北京時間 2026-09-14 12:00 以降、deepseek-v4-pro のリクエストはすべて V4.1-Flash にルーティングされ、V4.1-Pro がリリースされるまで Flash の料金で課金されるというものです。このポリシーはコスト面では有利ですが、動作の一貫性にとってはリスクです。
なぜリスクなのか。V4 Pro と V4.1-Flash は能力のベースラインが非常に近い(具体的な比較は後述)ものの、思考モードのデフォルト値、出力長の分布、ツール呼び出しのトリガー傾向において必ずしも一致しないからです。ビジネスロジックに「モデルが X を返したら分岐 A に進む」といった脆弱な判定を書いていると、ルーティング切り替え当日に分岐のドリフトが発生する可能性があります。
- 課金の基準を再照合する必要がある:以前は Pro 料金で予算計上していた請求が、切り替え後は Flash 料金で決済されます。財務側のコストモデルも同期して更新しないと、「予算消費が異常に少ない」という誤報が発生します。
- 能力のリグレッションテストは事前に実施する:2026-09-14 より前に、Pro の本番サンプルを deepseek-flash にリプレイし、出力長、ツール呼び出し回数、JSON 妥当性の 3 次元で比較します。
- バージョン番号をビジネス判定に紐付けない:response のモデルフィールドをロジック分岐に使うのは典型的なアンチパターンで、ルーティング期間中はそれが直接変化します。
- 思考強度は明示的に指定する:V4.1-Flash はデフォルトで思考モードになり、強度は low/high/max の 3 段階です。Pro リクエストを移行する際に明示的にダウングレードしないと、高同時実行シナリオで無駄にレイテンシが上がる可能性があります。
実用的なカナリア戦略は、Pro トラフィックをビジネスラインごとにスライスし、まず 5% を deepseek-flash に切り替えて思考強度を明示的に high に設定し、P99 レイテンシと失敗率を観測してから、25%、50%、100% へと段階的に拡大するというものです。切り替えは公式側で統一的に実行されるため、あなたが制御できるのは「モデル名を明示的に指定する」ことと「思考強度を明示的に指定する」ことの 2 点だけです。したがって、12:00 までに必ずこの 2 項目を設定に書き込んでください。
価格モデルとピーク/アイドルスケジューリング:キャッシュヒットとミスのコスト最適化
V4.1-Flash の価格は北京時間 2026-09-10 12:00 に発効し、単位は 100 万トークンあたりです。ピーク時間帯は月曜から金曜の 9:00-12:00 と 14:00-18:00 で、アイドル価格はピークの半額です。V4 Flash と比較して、キャッシュヒットは 60% 値下げ、ミスは約 33.3% 値下げ、出力は約 11.1% 値下げされています。
| 課金項目 | アイドル時間帯(元/100 万トークン) | >ピーク時間帯(元/百万トークン) | 最適化レバー |
|---|---|---|---|
| キャッシュヒット入力 | 0.02 | 0.04 | プレフィックス再利用、システムプロンプトの固定化 |
| キャッシュミス入力 | 1 | 2 | コンテキストのトリミング、検索結果の重複排除 |
| 出力 | 4 | 8 | 思考強度の引き下げ、max_tokens の絞り込み |
この表は非常に直感に反する結論を明らかにしている:キャッシュヒットとミスの間には50倍の関係(0.02 対 1)があり、よくある10倍ではない。つまり、コスト最適化の主戦場は、入力をできるだけキャッシュに乗せることであり、出力を削ることではない。キャッシュヒットした入力は、ほぼ無料に等しい。
これに基づき、スケジューリング戦略は次のように構成できる:
- 安定したプレフィックスを極限まで作り込む:システムプロンプト、ツール定義、少数ショット例、固定のフォーマット制約をすべて前方に配置し、バイトレベルで不変にする。スペース1つの変更でもキャッシュプレフィックスが無効になる。
- 可変コンテンツをすべて後方に配置する:ユーザーの質問、検索スニペット、会話履歴をプレフィックスの後に置き、キャッシュを汚染しないようにする。
- リプレイではなく会話プレフィックス継続を使用する:V4.1-Flash は会話プレフィックス継続をサポートしている。マルチターン対話では、履歴全体を再送するのではなく継続を使うことで、ミス入力量と出力量を同時に削減できる。
- 非リアルタイムタスクをアイドル時間帯にずらす:バッチ要約、データラベリング、オフライン評価、コードリポジトリのインデックス作成といったタスクを夜間や週末に移せば、単位コストが直接半減する。アイドル価格0.02元/百万トークンのキャッシュヒット入力は、数千万トークン規模のオフラインバッチ処理コストを1桁台に圧縮できることを意味する。
- 思考強度をタスクごとに段階分けする:低複雑度の分類タスクには low、通常の Agent には high、複雑な推論と長チェーン計画にのみ max を使う。思考強度は出力トークンを直接増幅し、出力はピーク時に8元/百万トークンで最も高い階層である。
もう一つ見落とされがちな点はKV Cache のストレージコストである。V4.1-Flash の KV Cache HBM 要件は前世代の1/4に、SSD ストレージは1/8に低下し、初代 DeepSeek と比べて約437倍小さくなっている。これは、推論サービスを自前でホストする場合、これまでより高いキャッシュヒット率を実現できることを意味する——同じ VRAM でより多くのセッションのプレフィックスキャッシュを保持できるからだ。自建環境では、この優位性をより高いヒット率に変換することが、ローカルデプロイの核心的な収益の一つである。
公式ベンチマークの解釈:GPQA Diamond 90.9、Codeforces 3471、Agent ベンチマーク比較
公式ベンチマークはモデル選定の一次証拠である。V4.1-Flash が公表した数字には以下が含まれる:GPQA Diamond 90.9、Codeforces レーティング 3471、MathArena Apex 65.6、Terminal-Bench 2.1 スコア 90.6、CyberGym 88.1。公式リリース投稿ではさらに4つの Agent ベンチマークが示されている:Terminal-Bench 3.0 スコア 30.0、DeepSWE v1.1 スコア 74.2、CyberGym 88.1、Automation-Bench 54.8。
| ベンチマーク | V4.1-Flash | V4 Pro | 解釈 |
|---|---|---|---|
| GPQA Diamond | 90.9 | — | 大学院レベルの科学 Q&A、飽和領域に接近 |
| Codeforces レーティング | 3471 | — | 競技プログラミングのトップレベル |
| MathArena Apex | 65.6 | — | 高難度数学、依然として非飽和指標 |
| Terminal-Bench 2.1 | 90.6 | 87.9 | ターミナル Agent タスク、2.7ポイントリード |
| CyberGym | 88.1 | 83.3 | サイバーセキュリティ攻防、4.8ポイントリード |
| Terminal-Bench 3.0 | 30.0 | — | より新しく難しいバージョンで、スコアは当然低い。バージョンをまたいで比較しないこと |
| DeepSWE v1.1 | 74.2 | — | ソフトウェアエンジニアリング Agent の総合能力 |
| Automation-Bench | 54.8 | — | 自動化フロータスク、現在の能力の天井がここにある |
この表を解釈するには3点を押さえる必要がある。第一に、V4.1-Flash は Terminal-Bench 2.1 と CyberGym でそれぞれ 90.6 対 87.9、88.1 対 83.3 と明確に V4 Pro を上回っている。これが、公式が Pro のトラフィックを直接ルーティングしてくる理由を説明している——それは「ダウングレード代替」ではなく「アップグレード代替」である。第二に、Terminal-Bench 3.0 の 30.0 と Automation-Bench の 54.8 こそが真の能力境界のシグナルである。Agent 製品を作る際は、この2つの数字で期待値管理を行うべきであり、90.6 で納品成功率を約束すべきではない。第三に、GPQA Diamond 90.9 はすでに飽和領域に入っており、これを使い続けてモデル選定の識別を行うのは区別度が低い。MathArena Apex 65.6 のような非飽和指標を見るべきである。
エンジニアリング上は、このベンチマーク群をあなたのプライベート回帰セットに変換することを推奨する:オンラインの実トラフィックから200〜500件をサンプリングし、JSON Output、Tool Calls、長コンテキスト(1Mトークンに近い極端なサンプルは別途数件確保)、マルチモーダル画像理解をカバーし、各件に自動判定可能な期待結果を用意する。公式ベンチマークは「何ができるか」を教え、プライベート回帰セットは「あなたの業務で劣化していないか」を教えてくれる。
Hugging Face 重みの実装:deepseek-ai/DeepSeek-V4.1-Flash からローカル推論サービスへ
重みはすでに Hugging Face で公開されており、リポジトリは deepseek-ai/DeepSeek-V4.1-Flash で、技術レポートも添付されている。これは重要なシグナルである:公式は、オープンソースコミュニティと密接に協力して V4.1-Flash の推論サポートを推進し、より多くのデプロイオプションを模索すると明言している。上級読者にとって、ローカルデプロイの価値は「API 費用の節約」ではなく、データがドメイン外に出ない、カスタマイズされた量子化ができる、オフラインバッチ処理ができる、プライベートデータ上で継続的な評価ができることにある。
さらに、国家超算インターネットは2026-09-11に DeepSeek V4.1 Flash モデル API サービスと重みファイルを公開した。開発者はワンクリックで API を呼び出すか、重みをダウンロードして二次開発とローカルデプロイを行える。これは公式チャネル以外の第二の経路を提供する。
| 経路 | ソース | 利点 | 適用シーン |
|---|---|---|---|
| A:マネージド API | api.deepseek.com(deepseek-flash)または国家超算インターネット API | ゼロ運用、同時実行上限2500、従量課金、バージョンに応じて自動更新 | 迅速なローンチ、トラフィック変動が大きい、GPU リソースなし |
| B:ローカル重みデプロイ | Hugging Face deepseek-ai/DeepSeek-V4.1-Flash または国家超算インターネットの重みダウンロード | データがドメイン外に出ない、量子化可能、カスタマイズ可能、トークン課金なし | 機密データ、オフラインバッチ処理、深いカスタマイズ |
経路 B の実装手順は次のように構成することを推奨する:
- まず技術レポートを読んでから着手する。CED は非対称アーキテクチャ(入力側で8Bを活性化、出力側で16Bを活性化)であり、これはプリフィル段階とデコード段階の計算需要が非対称であるng>、ビデオメモリと計算能力の計画は、対称モデルの従来の経験に基づいて行うことはできません。
- KV Cache の特性に基づいて容量計画を立てる。890 bytes/token は公式に示されたトークンあたりのサイズです。これに目標とする同時セッションのコンテキスト長を掛けることで、SSD 側のキャッシュプールサイズを見積もれます。これが 1/4 HBM、1/8 SSD という 2 つの数字のエンジニアリング上の意味です。
- 長いコンテキストは個別に負荷テストする。1M tokens のコンテキスト、384K の最大出力は能力の上限であり、経済的な構成ではありません。実際のサービスでは、長いコンテキストのリクエストを個別のキューに入れる必要があります。そうしないと、1 つの超長リクエストがバッチ処理ウィンドウ全体を圧迫します。
- マルチモーダルは統一エントリを通す。ネイティブの視覚理解は画像リンク、base64、Files API をサポートします。base64 はリクエストボディを大幅に膨らませるため、ゲートウェイ層では body size 制限を緩和し、base64 リクエストに対して個別のレート制限を行う必要があります。
- FIM は非思考モードでのみ利用可能。モデルを IDE に接続してコード補完を行う場合、思考モードを明示的にオフにする必要があります。そうしないと FIM リクエストは失敗します。
以下は Responses API を使ってローカルサービスのヘルスチェックと能力プローブを行う最小の JSON 例です。CI のスモークテストケースとしてそのまま利用できます。
{
"model": "deepseek-flash",
"base_url": "https://api.deepseek.com",
"auth": {
"header": "Authorization",
"value": "Bearer your-deepseek-api-key"
},
"probe_cases": [
{
"name": "json_output",
"request": {
"model": "deepseek-flash",
"response_format": { "type": "json_object" },
"thinking": { "type": "enabled", "effort": "low" },
"messages": [
{ "role": "user", "content": "JSON を返してください: フィールド ok は true、フィールド tier は flash" }
],
"max_tokens": 128
},
"assert": { "json_field": "ok", "equals": true }
},
{
"name": "tool_calls",
"request": {
"model": "deepseek-flash",
"thinking": { "type": "enabled", "effort": "high" },
"tools": [
{
"type": "function",
"function": {
"name": "get_storage",
"description": "SSD キャッシュプールの残り容量を照会する",
"parameters": {
"type": "object",
"properties": { "pool": { "type": "string" } },
"required": ["pool"]
}
}
}
],
"messages": [
{ "role": "user", "content": "pool=kv-ssd の残り容量を確認してください" }
],
"max_tokens": 256
},
"assert": { "has_tool_call": "get_storage" }
},
{
"name": "fim_non_thinking",
"request": {
"model": "deepseek-flash",
"thinking": { "type": "disabled" },
"fim": { "prompt": "def fib(n):\n if n < 2:\n return n\n ", "suffix": "\n\nprint(fib(10))" },
"max_tokens": 64
},
"assert": { "non_empty_text": true }
}
]
}
エコシステム連携と大規模デプロイ: WorkBuddy、OpenCode、2000 GPU クラスタ連携
公式パートナーである WorkBuddy(CodeBuddy を含む)と OpenCode は V4.1-Flash を全面統合済みです。自社構築チームへの示唆は次のとおりです。もしあなたのシナリオが IDE 内コード補完、Agent 型タスク実行、自動化ワークフローであれば、この 2 社の統合実践は参考実装になります。彼らの Tool Calls、会話プレフィックス継続、FIM といった能力に対するエンジニアリング処理は、V4.1-Flash の主要な API 面をほぼカバーしています。
真に大規模なシナリオ向けに、公式は協業チャネルを開放しています。2000 GPU + ストレージクラスタを対象とする大規模デプロイは公式と協業を相談できます。この規模は通常「プライベートデプロイ + 高並列推論サービス」の形態に対応し、重みだけでなく、推論エンジンの適合、KV Cache の階層ストレージ、バッチスケジューリング、マルチレプリカの一貫性も含みます。公式の姿勢は、オープンソースコミュニティと密接に協力して推論サポートを推進し、より多くのデプロイ選択肢を模索するというもので、推論側の最適化余地は今後も継続的に解放されることを意味します。
選定にあたっての実用的な判断を 1 つ示します。日次リクエスト量が百万級以内で、強いデータレジデンシー要件がない場合は、マネージド API を優先してください。あなたのシナリオが機密データを扱う、カスタム量子化が必要、あるいはオフラインバッチ処理量が十分に大きい(例えば数千万 token 級の日常バッチ処理)場合にのみ、ローカルデプロイの Total Cost が逆転する可能性があります。「自主可控」という直感のためだけに、より高コストなエンジニアリングを行うべきではありません。
ローカルデプロイのエンジニアリング上の落とし穴: 旧モデル廃止、C 端エントリ統合、バージョン互換性の調査
移行期に最もよくある落とし穴は、ほぼすべて「古いものがまだあると思い込んでいた」ことに由来します。1 つずつ列挙し、調査方法を示します。
- V4 Flash と V4-Flash-Vision-Exp はサービス停止済み。現在の deepseek-v4-flash と deepseek-v4-flash-vision-exp は、V4.1-Flash への一時的な互換ルートです。調査方法: ゲートウェイでモデル名ごとに計測し、旧名にヒットする日次リクエスト量を集計します。ゼロでなければ、未移行の呼び出し元がまだ存在することを意味します。
- 旧名の互換ルートは実際のエラーを覆い隠す。リクエストは 404 にならず、レスポンス構造も「ほぼ同じ」に見えるかもしれませんが、細部は変わります。調査方法: 旧名リクエストに強制的にレスポンスヘッダのマーカーを付け、呼び出し元がログで自分がまだ旧名を使っていることに一目で気づけるようにします。
- C 端の 3 エントリは統合済み。App/Web 側の従来の「クイック応答 / プロフェッショナル相談 / 画像認識」という 3 つの対話エントリは、現在は単一のインタラクティブ画面に統合されています。あなたの自動化スクリプトや RPA がこれら 3 エントリの UI パスに依存している場合、アップグレード後に直接機能しなくなります。調査方法: UI 自動化ケースのセレクタをエントリレベルから機能レベルに変更します。
- 視覚能力はもはや独立したモデル名ではない。以前に deepseek-v4-flash-vision-exp で分岐していたルーティングロジックは削除し、deepseek-flash に統一し、メッセージ構造で画像を含むかどうかを区別します。
- FIM と思考モードの相互排他。FIM は非思考モードでのみ利用可能です。あなたの IDE プラグインがデフォルトで思考モードを有効にしている場合、補完リクエストは失敗します。調査方法: プラグイン層で FIM リクエストに対して強制的に思考をオフに設定します。
- 並列 2500 は複数経路で共有される。テキスト、視覚、FIM のトラフィックが 1 つのモデル名を共有する場合、それらは同じ並列クォータを共有します。調査方法: ビジネスラインごとにローカルセマフォのクォータを割り当て、単一ビジネスが 2500 を使い切って他のビジネスが待ち行列になるのを避けます。
- 思考モードがデフォルトで有効になることによる遅延の急変。V4.1-Flash はデフォルトで思考モードを使用します。Pro から移行したリクエストが明示的にダウングレードされていない場合、遅延分布は全体的に右にシフトします。調査方法: 遅延に敏感なインターフェースでは effort を low に明示的に指定し、P99 を観測します。
2026-09-14 12:00 のルーティング切り替えウィンドウの前に、全リンクのモデル名監査を一度完了することを推奨します。
まとめとベストプラクティス
- モデル名を固定する:deepseek-flash を統一して使用し、base_url は https://api.deepseek.com とする。旧名の deepseek-v4-flash と deepseek-v4-flash-vision-exp は互換ルーティング期間にのみ存在するため、「旧名ヒット率」指標でゼロに誘導する。
- 並行数を管理する:並行上限は 2500。ローカルセマフォは 2200~2400 に設定し、ビジネスラインごとにサブクォータを割り当て、テキスト/ビジョン/FIM が互いを圧迫しないようにする。
- ルート切り替えに備える:北京時間 2026-09-14 12:00 以降、deepseek-v4-pro のリクエストはすべて V4.1-Flash にルーティングされ、Flash の料金で課金される。V4.1-Pro の提供開始まで継続する。事前に能力回帰テストを実施し、バージョン番号に業務分岐を紐付けず、思考強度を明示的に指定する。
- キャッシュを極める:キャッシュヒット入力はアイドル時 0.02 元、ピーク時 0.04 元。未ヒット入力はアイドル時 1 元、ピーク時 2 元。出力はアイドル時 4 元、ピーク時 8 元。ヒットと未ヒットの差は 50 倍。安定したプレフィックスをバイト単位で不変にし、可変内容はすべて後置する。
- オフピークでバッチ実行する:ピークは月曜から金曜の 9:00-12:00 と 14:00-18:00。アイドル価格はピークの半額。バッチ要約、データラベリング、オフライン評価をアイドル時間帯に移し、単位コストを直接半減させる。
- 出力を制御する:出力は最も高価な階層(ピーク時 8 元/百万 tokens)。タスクごとに思考強度を low/high/max に設定し、max_tokens を絞り、マルチターンでは履歴を再生するのではなく会話プレフィックス継続を使用する。
- 正しいベンチマークを見る:GPQA Diamond 90.9、Codeforces 3471、MathArena Apex 65.6、Terminal-Bench 2.1 90.6、CyberGym 88.1。V4 Pro の Terminal-Bench 2.1 87.9 と CyberGym 83.3 と比較する。Agent 側では Terminal-Bench 3.0 の 30.0、DeepSWE v1.1 の 74.2、Automation-Bench の 54.8 を見て、期待値管理に用いる。
- パスを選ぶ:マネージド API(国家超算互联网が 2026-09-11 に開始した API サービスを含む)は迅速なリリースに適している。Hugging Face リポジトリ deepseek-ai/DeepSeek-V4.1-Flash は技術レポートを添付しており、データをドメイン外に出さないことと深いカスタマイズに適している。
- KV Cache の利点を活かす:1 token あたり約 890 bytes(V4 Flash は約 3514 bytes)。HBM は前世代の 1/4、SSD は 1/8 に低減し、初代 DeepSeek と比べて約 437 倍縮小。自社構築時はこの空間をより高いキャッシュヒット率に活用する。
- 能力の境界を守る:コンテキスト 1M tokens、最大出力 384K tokens は上限であり、経済的な構成ではない。マルチモーダルは画像リンク、base64、Files API をサポート。FIM は非思考モードでのみ利用可能。JSON Output、Tool Calls、Responses API、Anthropic API は必要に応じて選択する。
- エコシステムに接続する:WorkBuddy(CodeBuddy を含む)と OpenCode はすでに全量接続済みで、参考実装として利用できる。2000 GPU + ストレージクラスタ向けの大規模展開については、公式と直接協議する。
- 監査を行う:V4 Flash と V4-Flash-Vision-Exp はサービスを停止し、C 端末の 3 入口は単一インターフェースに統合された。リリース前に SDK、ゲートウェイ、設定、定期タスク、スモークテスト、アラートルールについて、モデル名と入口パスの全チェーン監査を一度実施する。