SWIFTとは?追加モデルなしでLLM推論を高速化する自己スペキュレーティブデコーディング

SWIFTは、同じLLMの一部の層をスキップして軽量なドラフトモデルをその場で作り、追加学習なしで推論を1.3〜1.6倍高速化する手法です。自己スペキュレーティブデコーディングの考え方、仕組み、使い道を論文ベースで解説します。

参考文献

SWIFT: On-the-Fly Self-Speculative Decoding for LLM Inference Acceleration

Heming Xia, Yongqi Li, Jun Zhang, Cunxiao Du, Wenjie Li

論文を見る

今回の論文

今回取り上げるのは、Heming Xia、Yongqi Li、Jun Zhang、Cunxiao Du、Wenjie Li による論文「SWIFT: On-the-Fly Self-Speculative Decoding for LLM Inference Acceleration」です。2024年10月9日に arXiv で公開されました。研究分野としては、LLM 推論最適化、speculative decoding、自己スペキュレーティブデコーディングに当たります。URL は https://arxiv.org/abs/2410.06916 です。

この論文を選んだ理由は、推論高速化の中でもかなり実務寄りだからです。通常の speculative decoding は小さなドラフトモデルを別に用意する必要がありますが、SWIFT は 「同じ LLM の一部の層を飛ばして、その場でドラフトモデル化する」 という発想を取ります。つまり、新しい補助モデルを学習しなくても、既存の LLM サービング基盤に比較的載せやすい可能性があります。

どんな技術か

SWIFT は、LLM が次に出しそうな複数トークンを、別モデルではなく 同じモデルの軽量版 で先読みし、本体モデルがまとめて検証することで推論を速くする技術です。

ポイントは、その軽量版を事前に固定しておかないことです。SWIFT では、推論中に「どの層をスキップすれば今の入力に合うか」を観測しながら調整します。要するに、入力ごとに相性のよいドラフト構成を見つけ、その構成で speculative decoding を回します。

そのため、単なる層スキップではありません。層スキップをドラフト生成に使い、そのドラフトが当たりやすいようにオンライン最適化まで組み込んだ推論アルゴリズム だと見ると理解しやすいです。

課題

この技術が解決しようとしているのは、LLM の自己回帰生成が遅いことと、既存の高速化手法が実運用では扱いにくいことの両方です。

何が難しいのかというと、LLM は 1 トークンずつ順番に生成するため、GPU 上で大きな行列演算をしていても、全体としては逐次処理の制約を受けます。モデルが大きいほど 1 ステップのコストも重くなり、応答時間が長くなります。

既存の speculative decoding は、この問題に対してかなり有効です。小さなドラフトモデルで先に複数トークンを出し、大きなモデルで並列検証することで、逐次生成の回数を減らせます。ただし、この方式には限界があります。追加のドラフトモデルが必要になり、学習、蒸留、配置、監視、バージョン管理まで含めて運用が複雑になりやすいからです。

一方で、同じモデルの一部を使う self-speculative decoding もありますが、どの層を飛ばすかは簡単ではありません。あるタスクではよく当たる層の組み合わせが、別のタスクでは外れることがあります。論文でも、ストーリー生成向けに最適化した層スキップ設定を推論タスクへ持ち込むと、高速化効果が大きく落ちることが示されています。

なぜこの課題を解く必要があるのかというと、実際の AI システムでは、レイテンシ削減のために毎回追加モデルを持てるわけではないからです。社内ツール、SaaS の生成機能、コード補完、要約 API、エージェント基盤では、モデルの数が増えるだけで構成管理も障害点も増えます。SWIFT は、そこに対して 「同じモデルだけでどこまで速くできるか」 を狙っています。

用語解説

Speculative Decoding
軽いドラフトモデルで複数トークンを先に提案し、本体モデルがそれを並列検証する推論高速化手法です。SWIFT はこの枠組みを使いながら、ドラフトモデルを外部に持たず、同一 LLM の層スキップ版で代用する点が重要です。
自己スペキュレーティブデコーディング
別モデルではなく、ターゲット LLM 自身の一部を軽量化してドラフト生成に使う方式です。SWIFT の土台になる考え方で、モデル追加なしの高速化を狙えるため、実運用との相性がよいです。
層スキップ(Layer Skipping)
Transformer の一部の層を計算せずに通すことで、計算量を減らす考え方です。ただし単純に飛ばすだけでは精度低下が起きやすいため、SWIFT では「どの層を飛ばすか」を入力文脈に応じて最適化します。
受理率(Token Acceptance Rate)
ドラフトしたトークンのうち、本体モデルの検証を通過してそのまま採用された割合です。speculative decoding の効き具合を測る重要指標で、SWIFT はこの値を高く保つことで速度を稼ぎます。
KV キャッシュ
既に計算した attention の Key と Value を保存して再利用する仕組みです。SWIFT でもターゲットモデルの KV キャッシュを再利用してドラフト計算を軽くし、同一モデルベースの高速化を成立させています。

技術の仕組み

SWIFT の技術的な肝は、推論を大きく 2 段階に分けていることです。前半で「この入力に合う層スキップ設定」を見つけ、後半でその設定を使って speculative decoding を回します。

基本アイデア

基本アイデアは、ターゲット LLM の中間層をいくつかスキップしたモデルを、軽量なドラフトモデルとして使うことです。層を飛ばせば 1 回の forward は軽くなります。そこで、その軽量版に次トークン列を先読みさせ、本体モデルがまとめて検証します。

ただし、どの層を飛ばしてもよいわけではありません。飛ばしすぎるとドラフト精度が落ちて、検証で弾かれるトークンが増え、かえって遅くなります。そこで SWIFT は、推論中に観測される生成文脈を使って、入力ごとにスキップ層集合を調整します。

モデル構造

モデルを新しく増やすわけではありません。ターゲット LLM を M_T とすると、ドラフトモデル M_DM_T の一部の層をスキップして構成されます。論文では、このスキップする層の集合を最適化対象にしています。

この設計のよいところは、重みを別途持たなくてよい点です。追加モデル型の speculative decoding と違い、同じ重みを流用しながら軽いドラフト経路を作れます。

仕組みの全体像

1. 初期状態では一様な層スキップで走り始める

SWIFT は最初から最適な層構成を知っているわけではありません。そこで、まずは一様に層をスキップした暫定ドラフトモデルで推論を始めます。

2. 一定数の生成トークンを文脈としてためる

生成されたトークン列が短いうちは、どの層スキップ設定が合うか判断しにくいです。そのため、まず一定長の context window をためます。ここで得られた LLM 出力が、後続の最適化で疑似的な正解ラベルとして使われます。

3. 文脈を使ってスキップ層集合をオンライン最適化する

ここが SWIFT の一番おもしろい部分です。過去に本体モデルが実際に生成したトークン列を ground truth とみなし、候補となる層スキップ設定でそれをどれだけ再現できるかを測ります。

論文では、この一致度を matchness として定義しています。要するに、軽量ドラフトモデルが「さっき本体が出したトークン」をどれだけ当てられるかを見るわけです。これが高い設定ほど、次の未来トークンも当てやすいだろうと考えます。

4. 候補探索はランダム探索とベイズ最適化を併用する

層の組み合わせは多いため、毎回フル探索はできません。そこで SWIFT は、普段はランダム探索で候補を出し、一定間隔でベイズ最適化を入れて探索効率を上げます。

この設計はかなり実務的です。厳密最適化を目指すより、短い推論時間の中で十分よい設定を素早く見つける ことを優先しています。

5. 最適化が落ち着いたら高速化フェーズへ移る

最適化ステップの最大回数に達するか、最良候補がしばらく変わらなくなったら、層スキップ設定を固定します。その後は毎トークンごとの最適化をやめ、通常の draft-and-verify を高速に回します。

信頼度つきの推論制御

SWIFT は、単にドラフトして検証するだけではありません。ドラフト側の top-1 確率を信頼度として使い、無駄なドラフト計算を減らします。

Early-stopping Drafting

ドラフトモデルの確信度が閾値より下がったら、その時点でそれ以上のドラフト生成を止めます。これにより、当たりにくい先読みをだらだら続けるのを防ぎます。

Dynamic Verification

ドラフトトークンの信頼度に応じて、検証時に何個の候補を持たせるかを変えます。信頼度が低い位置では top-k 候補を広めに取り、高い位置では候補数を絞ります。これで、検証精度と検証コストのバランスを取っています。

データの扱い方

学習データを追加で用意する方式ではありません。SWIFT が使う「評価データ」は、いま推論している入力そのものから生まれる生成トークンです。これはかなり重要です。

つまり SWIFT は、外部教師データでドラフトモデルを訓練するのではなく、いま流れている入力ストリームの中で自己適応する 手法です。分布が変わりやすい本番環境と相性がよい設計だと言えます。

実験と結果

論文では、SWIFT が本当に速いのか、タスクが変わっても効くのか、コード生成のような別領域でも成立するのかを検証しています。

何を検証したのか

主な検証対象は、通常の自己回帰生成と比べた wall-clock speedup、tokens/sec、平均生成長 M、受理率 α です。加えて、既存の plug-and-play 系手法である Parallel Decoding と Lookahead Decoding と比較しています。

論文の立場として重要なのは、速度だけでなく lossless に近い整合性を保ったまま速くすること です。speculative decoding の枠組みを使うため、生成分布は理論上保たれる設計になっています。

どんなデータセットや評価指標を使ったのか

テキスト生成では、要約に CNN/Daily Mail、数理推論に GSM8K、ストーリー生成に TinyStories を使っています。コード生成では HumanEval を用いています。モデルは LLaMA-2 系列と CodeLLaMA 系列です。

評価指標としては、実速度に加えて、平均何トークン分を一度に進められたかを示す mean generated length M と、ドラフトトークンがどの程度そのまま採用されたかを示す受理率 α が使われています。SWIFT のような手法では、この 2 つが速度の説明変数になります。

テキスト生成での結果

LLaMA-2-13B では、全体の速度が 20.10 tokens/sec から 28.26 tokens/sec に上がり、全体 speedup は 1.41 倍でした。タスク別では、CNN/DM で 1.37 倍、GSM8K で 1.31 倍、TinyStories で 1.53 倍です。

LLaMA-2-70B では効果がさらに大きく、4.32 tokens/sec から 6.41 tokens/sec に伸び、全体 speedup は 1.48 倍でした。タスク別では、CNN/DM で 1.43 倍、GSM8K で 1.39 倍、TinyStories で 1.62 倍となっています。

ここから言えるのは、モデルが大きいほど層スパース性を活かしやすい可能性があることです。論文でも、大規模モデルほどより高い speedup を示す傾向が報告されています。

受理率の意味

論文では、特に LLaMA-2 系列で受理率が 98% から 100% と高く保たれています。これは、層スキップ版のドラフトが本体モデルとかなり近い振る舞いをしていることを意味します。

この値が高いと、ドラフトで提案したトークンをほぼそのまままとめて採用できるため、self-speculative decoding としてかなり理想的です。逆にここが低いと、ドラフト計算だけ増えて高速化は崩れます。

コード生成での結果

HumanEval でも SWIFT は有効でした。CodeLLaMA-13B では pass@1 で 1.40 倍、pass@10 で 1.29 倍、CodeLLaMA-34B では pass@1 で 1.46 倍、pass@10 で 1.30 倍の speedup が出ています。

しかも、論文中では精度指標そのものは維持されています。たとえば CodeLLaMA-13B の pass@1 は vanilla も SWIFT も 0.311、34B ではどちらも 0.372 です。つまり、少なくともこの評価では「速くしたらコード品質が落ちた」という形にはなっていません。

どのような分析結果が出たのか

論文の詳細分析では、オンライン最適化にかかる計算は全体のわずか 0.8% で、かなり軽いと報告されています。さらに、従来の Self-SD がオフライン最適化に長時間を要するのに対し、SWIFT は最適化時間を大幅に削減しています。

また、入力ストリームが動的に変わる実験でも、SWIFT は受理率 0.9 超を維持しながら安定した高速化を示しています。ここはかなり実務的で、固定分布前提の高速化ではないことを示すポイントです。

結果から何が言えるのか

この結果から見えてくるのは、LLM 推論高速化では「別モデルを持つかどうか」が大きな設計分岐になることです。SWIFT は、追加モデルなしでも 1.3〜1.6 倍程度の高速化を出せる現実的なラインを示しました。

爆発的な 3 倍速ではありませんが、追加学習なし、重み追加なし、オンライン適応あり、という条件を考えるとかなり強いです。特に、インフラ複雑性を増やしたくない現場では価値があります。

何に使える?

SWIFT が向いているのは、推論レイテンシを下げたいが、追加ドラフトモデルまでは持ちたくない場面です。

既存の LLM API 基盤の高速化

すでに 1 つの基盤モデルを中心にアプリを組んでいる場合、別の小型モデルを足すとデプロイ構成が複雑になります。SWIFT 的な考え方なら、同じモデルの推論経路だけを変えて速度改善を狙えます。

特に、社内要約、チャット補助、問い合わせ回答、コード補完のように、1 モデルを横展開して使う基盤では相性がよいです。

エージェント基盤の応答短縮

AI エージェントでは、1 回の応答だけでなく、複数ターンの思考やツール呼び出しを含めて総レイテンシが積み上がります。モデルそのものを変えずに 1.3 倍前後速くできるだけでも、全体の体感はかなり変わります。

特に、計画生成、コード修正案、ログ解釈のように中長文の出力が続くタスクで効果が出やすそうです。

コード生成や開発支援

論文でも HumanEval で有効性が示されているため、開発支援との相性はよいです。IDE 補完、PR コメント生成、テスト雛形生成などでは、品質を保ちつつ待ち時間を削れる可能性があります。

実際には、補完のような短い応答より、説明文やコードブロックをある程度長く返す支援機能のほうが恩恵は大きいと考えられます。

オンプレミスや専用環境での運用

追加モデルを持たないという特徴は、オンプレや閉域環境で特に効きます。モデル追加ごとに審査や配備が重くなる環境では、1 モデル構成のまま推論最適化できる価値が大きいです。

開発や事業へのヒント

この論文から得られる実務上のヒントは、単に「速い手法がある」ではありません。高速化の設計思想そのものにあります。

補助モデル前提で考えすぎない

推論高速化というと、量子化か別モデルによる speculative decoding をまず考えがちです。ただ、プロダクトによっては、速度より運用複雑性の増加のほうが痛い場合があります。

SWIFT は、そこに対して「まずは単一モデル構成のまま近道を探す」という発想を与えてくれます。小規模チームや運用負荷に厳しいプロダクトでは特に参考になります。

本番入力から適応する設計は強い

SWIFT は事前にタスクごとの最適設定を固定せず、推論中の文脈を使って調整します。これは、ユーザー入力の分布が動くプロダクトに向いています。

たとえば、社内ナレッジ検索、サポートチャット、コーディング支援のように、曜日や顧客層やユースケースで入力分布が変わる環境では、静的最適化よりこうした動的最適化のほうが実運用に近いです。

スピード改善はモデル外でも作れる

この論文は、モデル重みを変えなくても、デコーダ制御と探索戦略で性能を上げられることを示しています。これはプロダクト設計上かなり大きい示唆です。

自分で AI アプリを作るなら、モデル選定だけでなく、ドラフト、検証、停止条件、キャッシュ再利用、候補選択といった 推論オーケストレーション層 を差別化ポイントとして見たほうがよいです。

大規模モデルほど最適化投資の回収がしやすい

論文では大きいモデルほど speedup が伸びる傾向が見えています。もし高性能モデルを使う事業を考えるなら、単価の高いモデルほど、こうした推論制御の工夫が利益率に効きやすいです。

SaaS であれば粗利改善に直結しますし、社内利用であれば GPU 使用量や待ち時間の削減につながります。

限界

もちろん、SWIFT にも明確な限界があります。

まず、計算コストがゼロになるわけではありません。オンライン最適化は軽いとはいえ追加処理ですし、ドラフトと検証の二段構え自体もオーバーヘッドを持ちます。生成が極端に短いケースでは、最適化コストを回収しにくい可能性があります。

次に、データ依存性があります。論文自体が、層スキップの最適構成はタスク依存だと示しています。SWIFT はそれに対処するための手法ですが、それでも文脈が十分にたまる前は最適化の精度が出にくいはずです。

また、実装の難しさもあります。単純な speculative decoding 以上に、層スキップ、KV キャッシュ再利用、オンライン探索、特殊な検証マスクなどを一体で実装する必要があります。推論サーバーの内部を触れない環境では導入しにくいです。

さらに、論文結果は主に batch size 1 前提の評価です。高スループットのバッチ推論や混載サービングで同じ効果がどこまで出るかは、別途検証が必要です。この点は実運用前に確認したい注意点です。

最後に、追加学習が不要とはいえ、どのモデルでも同じように効くとは限りません。論文では LLaMA 系や CodeLLaMA 系でよい結果が出ていますが、アーキテクチャや実装の違う商用モデルでの再現性は個別検証が必要です。

よくある質問

Q. SWIFT は普通の speculative decoding と何が違うのですか?

A. 一番の違いは、ドラフトモデルを別に持たないことです。普通の speculative decoding は小型モデルを別途用意することが多いですが、SWIFT は同じ LLM の層を一部スキップした軽量版を、その場でドラフトとして使います。

Q. SWIFT を使うと出力品質は落ちませんか?

A. 論文の枠組みでは speculative decoding による検証を行うため、生成分布は理論上維持されます。実験でもコード生成精度は維持されており、少なくとも評価設定では大きな品質劣化は確認されていません。

Q. どんなプロダクトで特に効きそうですか?

A. 中長文を返すチャット、要約、コード生成、エージェント実行のように、1 回の応答で多くのトークンを出す機能と相性がよさそうです。短文レスポンス中心の機能では、最適化コストの回収が難しい可能性があります。

Q. 追加学習がいらないなら、すぐ導入できますか?

A. 学習は不要ですが、実装は簡単ではありません。層スキップ版ドラフト、KV キャッシュ再利用、検証ロジック、オンライン最適化を推論スタックに統合する必要があるため、vLLM や独自推論基盤の内部まで触れる前提になりやすいです。

Q. 小さいモデルでも意味はありますか?

A. ありますが、大きいモデルほど効果は出やすいと考えられます。論文でも 70B クラスのほうが 13B より speedup が高く、重いモデルほど 1 ステップ削減の価値が大きいことが示唆されています。

今日の学び

この論文は、LLM 推論が遅い一方で、追加ドラフトモデルを持つ高速化は運用が重いという課題を扱っています。そこに対して SWIFT は、同じ LLM の層を一部スキップした軽量版をドラフトに使い、しかもその層構成を推論中の文脈からオンライン最適化することで解こうとしました。

ここから得られるヒントは、推論高速化はモデル圧縮だけではなく、同じモデルをどう走らせるか の設計でも大きく変わるということです。プロダクト開発でも、モデル選定だけでなく、デコーディング制御やオンライン適応を差別化ポイントとして考える価値があります。

関連記事

推論最適化

SpecInferとは?トークン木でLLM推論を高速化する投機的デコーディング手法

SpecInferは、小さな補助モデルが作る候補列をトークン木としてまとめ、大規模LLMでまとめて検証する推論高速化手法です。通常の speculative decoding との違い、仕組み、実験結果、使い道を日本語で整理します。

参照論文:SpecInfer: Accelerating Generative Large Language Model Serving with Tree-based Speculative Inference and Verification

推論最適化

MARLINとは?4bit量子化をバッチ推論でも高速に活かすLLM推論カーネル技術

MARLINは、4bit重み量子化の利点を単発推論だけでなく複数リクエストの同時推論でも維持するGPUカーネル技術です。なぜ既存量子化カーネルがバッチで失速するのか、仕組み、結果、実務での使い道まで日本語で整理します。

参照論文:MARLIN: Mixed-Precision Auto-Regressive Parallel Inference on Large Language Models

推論最適化

FlashDecoding++とは?LLM推論のsoftmax同期とFlat GEMMの無駄を減らしてGPU推論を速くする技術

FlashDecoding++は、LLM推論で発生するsoftmax同期、Flat GEMMの計算浪費、静的データフローの非効率をまとめて改善する推論エンジンです。どこが遅いのか、どう直すのか、実運用で何に効くのかを技術的に整理します。

参照論文:FlashDecoding++: Faster Large Language Model Inference on GPUs