メインコンテンツへ移動
AIチュートリアル

基礎から学ぶLLM推論エンジニアリング

トークン化、プリフィル、デコード、KVキャッシュ、スケジューリング、バッチ処理、メモリ管理、推論エンジンの内部実装を、実装を重視した学習パスで学びます。このチュートリアルでは、リポジトリで最初に利用できる章から始め、今後予定されているランタイム構築のレッスンに備える方法を説明します。

基礎から学ぶLLM推論エンジニアリング

Inference Engineering Zero to Heroとは?

Inference Engineering Zero to Heroは、大規模言語モデルのサービングを支えるランタイムシステムを理解するための実践的なコースリポジトリです。モデルのトレーニングや品質改善に焦点を当てるのではなく、リクエストがLLMに到達した後に何が起こるのかを検証します。

このプロジェクトでは、まず最小限の推論処理から始め、段階的にコンパクトな推論ランタイムへと進みます。想定される学習の流れは次のとおりです。

トークン化 → プリフィル → デコード → KVキャッシュ → サンプリング → リクエスト状態 → スケジューリング → 継続的バッチ処理 → メモリ管理 → サービングエンジンの内部

実装を重視するアプローチにより、テンソル、生成された出力、キャッシュ状態、メモリ使用量を直接確認します。これにより、モデルの処理と、レイテンシ、スループット、GPU使用率、メモリ消費量といった実際のサービング上の課題を結び付けて理解できます。

学習内容

このコースは、LLM推論をシステムの観点から捉える思考モデルの構築を目的としています。主なトピックは次のとおりです。

  • トークン化: プロンプトが、モデルによって処理されるトークンIDになる仕組み。
  • プリフィル: モデルが初期プロンプトを処理し、生成に必要な状態を作成する仕組み。
  • デコード: 後続のトークンが1ステップずつ生成される仕組み。
  • KVキャッシュ: アテンションの状態が増加し、不要な再計算を避ける仕組み。
  • サンプリング: モデルの出力スコアからトークンを選択する仕組み。
  • リクエスト状態: ランタイムがプロンプト、生成済みトークン、完了状態を追跡する仕組み。
  • スケジューリング: エンジンが処理対象のリクエストを決定する仕組み。
  • 継続的バッチ処理: システムへの出入りに応じて、アクティブなリクエストを効率的にまとめる仕組み。
  • メモリ管理: GPUメモリがどこで使用され、キャッシュの構成が容量にどう影響するか。
  • サービングエンジンの内部: 効率を高めるシステムが、モデル実行をどのように支えているか。

コースの状況と構成

リポジトリは、Beginner、Intermediate、Advancedのレベルに分かれています。現在はBeginnerトラックが進行中です。IntermediateとAdvancedの教材はまだ利用できません。

利用可能なチャプター

  • Chapter 01: Manual LLM Inference From First Principles — beginner/01_manual_llm_inference/で利用できます。

予定されているBeginnerチャプター

  1. サンプリング
  2. リクエスト状態
  3. シンプルスケジューラ
  4. 継続的バッチ処理
  5. KVキャッシュ管理
  6. ページドまたはブロックKVキャッシュ
  7. プレフィックスキャッシュ
  8. 推論のベンチマーク

ロードマップは意図的に柔軟に設計されています。実装作業によって新たな問題が明らかになるにつれ、チャプターが追加、削除、分割、並べ替えされる場合があります。

インストールとセットアップ

リポジトリのREADMEには、固定された依存関係のインストールコマンドや環境仕様は記載されていません。まずリポジトリをダウンロードまたはクローンし、その後、Chapter 1に含まれるファイルと手順を確認してから、何かをインストールまたは実行してください。

  1. GitHubリポジトリのローカルコピーを取得します。
  2. ターミナル、エディタ、またはノートブック環境でリポジトリのディレクトリを開きます。
  3. beginner/01_manual_llm_inference/へ移動します。
  4. チャプター固有の手順を読み、そのディレクトリ内のノートブックを特定します。
  5. チャプターの教材で指定されている依存関係だけをインストールします。
  6. ノートブックを開き、セルを順番に実行します。
beginner/01_manual_llm_inference/

READMEには正確なパッケージバージョン、ハードウェア要件、インストールコマンドが記載されていないため、実行環境のセットアップについてはチャプターのノートブックを信頼できる情報源として使用してください。

基本的な使い方: 手動推論を進める

Chapter 1から始めることを推奨します。その目的は、完全なサービングAPIの背後に生成処理を隠すのではなく、LLMの手動推論を第一原理から検証することです。

Step 1: ノートブックを順番に進める

ノートブックを最初から最後まで実行します。後続の処理が、前の段階で作成されたモデルオブジェクト、トークン化された入力、またはキャッシュされた状態に依存する可能性があるため、セットアップや確認用のセルを飛ばさないでください。

Step 2: プロンプトを追跡する

入力プロンプトが推論処理を通過するにつれて、どのように変化するかを確認します。概念的には、次のように追跡できます。

プロンプトテキスト
→ トークンID
→ プロンプト処理またはプリフィル
→ 次トークンのスコア
→ 選択されたトークン
→ 更新された系列
→ デコードの繰り返し

ノートブックに表示される場合は、テンソルの形状とトークン数を記録してください。これにより、プロンプト全体を処理する場合と、追加のトークンを1つ生成する場合の違いを把握しやすくなります。

Step 3: プリフィルとデコードを分ける

プリフィルではプロンプトを処理し、生成に必要な状態を確立します。デコードでは追加のトークンを段階的に生成します。これらを別々の段階として扱うことは、それぞれの計算特性とメモリ特性が異なるため重要です。

ノートブックを実行しながら、次の点を確認してください。

  • プリフィル中に処理される入力トークン数はいくつか。
  • 各デコードステップで渡される入力は何か。
  • 新しいトークンが生成された後、どのテンソルが変化するか。
  • 再計算せずに再利用できる状態はどれか。

Step 4: 出力を直接確認する

トークンIDとデコードされたテキストを比較し、ノートブックで確認できる場合は中間出力も調べます。目的は単にテキストを生成することではなく、そのテキストを生み出す一連の処理を理解することです。

ランタイムモデルを理解する

このリポジトリに取り組む際は、生成を単一のモデル呼び出しではなく、状態を持つループとして捉えると理解しやすくなります。

リクエストを準備する
プロンプトを処理する
再利用可能な状態を保存する
次のトークンを選択する
リクエストの状態を更新する
完了するまで繰り返す

この視点は、後の章に備えるのに役立ちます。サンプリングは選択されるトークンを決定し、リクエスト状態は各生成を追跡し、スケジューリングは処理対象を選択し、連続バッチ処理は複数のアクティブなリクエストからの処理をまとめます。

発展的な学習のヒント

形状、状態、メモリを一緒に追跡する

テンソルを単独で調べないでください。重要な操作ごとに、入力形状、出力形状、シーケンス長、キャッシュ状態、予想されるメモリ増加量を記録します。これにより、数学的なモデル実行とシステムの動作が結び付きます。

プロンプト長とデコード長を比較する

章の内容で入力を変更できる場合は、短いプロンプトと長いプロンプト、短い生成と長い生成を比較します。プリフィル中に発生するコストと、デコード中に蓄積するコストを観察してください。測定結果が示す範囲を超えて、ベンチマークの結論を一般化しないでください。

リクエスト状態の表を作成する

リクエスト状態を扱う専用の章が利用可能になる前でも、次のような項目で観察結果を整理できます。

  • 入力トークンID
  • 生成されたトークンID
  • 現在のシーケンス長
  • キャッシュ状態
  • 生成ステータス

これは現在のリポジトリが提供すると約束している機能ではなく、学習方法の一つです。推論エンジンにモデル自体を取り巻くシステムが必要な理由を明らかにするのに役立ちます。

最適化する前に測定する

ロードマップには、推論ベンチマーキングに関する章が予定されています。それが利用可能になるまでは、実験条件を統制してください。一度に変更する入力または生成条件は一つにし、観察結果を記録し、測定した動作と仮定を区別します。

以前の章を読み直す

サンプリング、スケジューリング、バッチ処理、キャッシュ管理の章が追加されたら、手動推論を読み直してください。それぞれの新しい抽象化を元のトークン生成ループと関連付けることで、最適化を実際のモデル実行に基づいたものに保てます。

現在の制限事項

現在、利用可能な章として掲載されているのは最初のBeginner章だけです。サンプリング、スケジューラ、連続バッチ処理、キャッシュ管理戦略、ベンチマーキング、およびIntermediateとAdvancedの各トラックは、引き続き予定段階です。したがって、このリポジトリは完全な推論エンジンフレームワークではなく、発展途上のコースとして扱うべきです。

まとめ

Inference Engineering Zero to Heroは、LLMのランタイム側を学ぶための実践的な道筋を提供します。beginner/01_manual_llm_inference/から始め、ノートブックを順番に実行し、プロンプト、トークン、テンソル、再利用可能な状態が生成処理を通じてどのように移動するかに注目してください。この基礎があれば、スケジューリング、バッチ処理、メモリ、サービングエンジンの内部実装に関する予定レッスンも理解しやすくなります。