はじめに
AIエンジニアや開発者にとって、Anthropicの「Claude Code」は非常に強力なツールです。しかし、API経由での利用やサブスクリプション費用は、ヘビーに使うほど財布を圧迫します。「もっと自由に、コストを気にせず使い倒したい……」
そんな願いを叶えるのが、ローカルLLMの活用です。最近のオープンソースLLMは非常に性能が高く、適切な設定さえ行えば、ローカル環境でもClaude Codeの「エージェント的な動き」を十分に再現できます。
今回は、RTX 4090を搭載したPCを使って、Claude Codeをローカルで爆速動作させるまでの試行錯誤と、パフォーマンス最適化の記録を共有します。
開発環境
- CPU: Intel Core i9-13900KF
- GPU: NVIDIA GeForce RTX 4090 (24GB VRAM)
- RAM: 128GB
- OS: Windows 10 22H2 (19045.6456)
- モデル: gemma4:26b-a4b-it-q4_K_M
- 推論エンジン: Ollama
セットアップと実行
基本的には、Ollamaでモデルを立ち上げ、Claude Code側でローカルエンドポイントを指定するだけです。
# (Linux) OllamaとClaude Codeのインストール
curl -fsSL https://ollama.com/install.sh | sh
curl -fsSL https://claude.ai/install.sh | sh
# (Windows) OllamaとClaude Codeのインストール
irm https://ollama.com/install.ps1 | iex
irm https://claude.ai/install.ps1 | iex
# Ollamaでモデルをダウンロード
ollama pull gemma4:26b-a4b-it-q4_K_M
# Ollama経由してClaude Codeを実行
ollama launch claude --model gemma4:26b-a4b-it-q4_K_M
しかし、デフォルト設定のままでは「エージェント」として使い物にならない壁がいくつかありました。
トラブルと解決
1. 「コードは書くけどファイルが作られない」問題
現象:
指示を与えると、Claude Codeがターミナル上にコードを出力するだけで終わってしまいます。本来ならwrite_fileなどのツールを呼び出してファイルを自動生成すべきですが、それが実行されません。
原因調査:
ollama psで確認したところ、デフォルトのコンテキスト長(Context Length)が32,768になっていました。エージェントとしての思考プロセスには、この長さでは不十分で、コンテキスト制限によりツール呼び出しに失敗していたようです。
解決方法:
コンテキスト長を 64k (65,536) に拡張したカスタムモデルを作成します。
- 既存モデルの設定を書き出し:
ollama show --modelfile gemma2:27b > Modelfile -
Modelfile内のPARAMETER num_ctx 32768を65536に変更。 - 新モデルとして登録:
ollama create gemma4-26b-64k -f Modelfile
2. コンテキスト拡張による「GPUメモリ溢れ」
現象:
コンテキストを64kに増やしたところ、VRAM(24GB)を使い切り、一部の計算がCPUにオフロードされてしまいました。結果、動作が極端に重くなります。
解決方法:
KVキャッシュの量子化とFlash Attentionを強制的に有効化します。以下の環境変数を設定してOllamaを再起動します。
-
OLLAMA_KV_CACHE_TYPE = q4_0(KVキャッシュを量子化してVRAM節約) OLLAMA_FLASH_ATTENTION = 1
KVキャッシュを量子化(q4_0)することで、モデル本体とキャッシュを合わせてもメモリ使用量はわずか19GBに抑制されました。
さらに、モデルの限界値である128kまでコンテキストを拡張しても占有量は約20GBで済むため、24GBのVRAMがあれば十分に余裕を持って運用可能です。
3. 【難問】数回使うと速度が極端に落ちる
現象: 数回のやり取り後、単純な指示に10分以上かかるようになりました。
調査と試行錯誤:
- 最初は「GPUが正しく使われていない」ことを疑いました。しかし、
ollama psを確認するとProcessorは正常、さらにOllamaのログを見てもCUDAは正常にロードされており、ハードウェア的な問題は見当たりませんでした。 -
OLLAMA_PAGED_ATTENTIONやOLLAMA_CACHE_IMPLEMENTATION=optimizedなどを試すも効果なし。- ネットで見つけたのですが、Ollamaの公式GitHubを確認したところ、実際にはこれら2つのオプションは存在しませんでした。
解決:
-
ヘッダーの無効化など:
~/.claude/settings.jsonに以下を追加(既存設定がある場合はマージ)し、Claude Code を再起動。
{
// env: Claude Code 実行時に適用する環境変数
"env": {
// 帰属ヘッダーの自動付与を無効化し、余計な出力と処理負荷を抑える。これだけで3倍ほど速くなれます。
"CLAUDE_CODE_ATTRIBUTION_HEADER": "0",
// テレメトリ送信を無効化し、追加のネットワーク通信を減らす
"CLAUDE_CODE_ENABLE_TELEMETRY": "0",
// 非本質的な通信を無効化し、バックグラウンドトラフィックを最小化
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
},
"attribution": {
// commit の自動帰属文字列を空にする
"commit": "",
// PR の自動帰属文字列を空にする
"pr": ""
}
}
※ settings.json は JSON 形式のためコメントを許可しない環境があります。その場合は上記コメント行を削除したうえで保存してください。
2. Ollamaのアップデートと再起動: 最終的に、Ollamaを最新版に更新して再起動したところ、速度が10倍に跳ね上がり、100-120 tokens/s を叩き出すようになりました。
考察:
後で OllamaのGitHubリポジトリのIssues を検索したところ、同様の速度低下に見舞われているユーザーが複数見つかりました。どうやら特定の条件下で発生するOllama側のバグだったようで、最新版への更新とプロセスのリセットが正解でした。
性能評価
パフォーマンス評価手法とテストケース
Local LLM を Claude Code に完全統合した際の実際のエンジニアリング性能を体系的に評価するため、テスト専用の Toy Project を事前構築しました。このプロジェクトは実際の開発シナリオをシミュレートしているだけでなく、コード内に複数の「罠」を意図的に仕込んでいます(潜在的な論理バグ、セキュリティリスク、パフォーマンスのボトルネック、外部依存を必要とする TODO 項目など)。
以下の5つの段階的なコアタスクを通じて、モデルの各種中核能力に対するストレステストを実施します。
1. 基礎的な環境認識と単一ファイルの編集
- テスト目的: モデルが Claude Code を介して Shell コマンドを正しく呼び出し、ワークスペースの状態を正確に認識し、元のフォーマットを破壊することなくファイルの読み取りと追記を完了できるかを検証する。
-
プロンプト:
「カレントディレクトリ内の
README.mdファイルを確認してください。もし存在しない場合は新規作成し、存在する場合はファイルの末尾に現在のシステムタイムスタンプを追記してください。また、現在のプロジェクトのディレクトリ構造を詳細なツリー形式で出力してください。」
2. 複数ファイルにまたがるリファクタリング
- テスト目的: モデルのコンテキストウィンドウ(Context Window)の維持能力と、コード間の呼び出し依存関係を正確に理解し、リファクタリング時に参照の更新漏れがないことを確認する。
-
プロンプト:
「
src/processor.pyにあるformat_task_name関数をtransform_labelにリネームしてください。それに伴い、プロジェクト内でこの関数を呼び出している全ての箇所(src/main.pyなど)を特定し、エラーが出ないように一括更新してください。」
3. 自動デバッグと修正のループ
- テスト目的: ターミナル出力(スタックトレース)の解析能力を検証する。エラーメッセージを自律的に読み解き、ソースコードのバグを特定し、テストケースが完全にパスするまで修正案の作成と適用を反復できるかをテストする。
-
プロンプト:
「プロジェクトのユニットテスト(
pytestなど)を実行してください。テストが失敗した場合は、エラーメッセージを分析してソースコード内のバグを特定し、すべてのテストがパスするまで修正と再テストを繰り返してください。」
4. ツール呼び出しと外部ライブラリの統合
-
テスト目的: モデルの Tool Use の精度(
grep検索など)を評価する。また、機能拡張が必要な際に、自律的にベストプラクティスを検索し、requirements.txtの依存関係を正しく更新できるかを確認する。 -
プロンプト:
「プロジェクト全体から 'TODO' コメントを検索してください。各 TODO に対して、最適な実装方法を GitHub やドキュメント等から調査し、各コメントの下に 100 文字程度の具体的な実装アドバイスを追記してください。また、必要に応じて
requirements.txtに新しいライブラリを追加してください。」
5. 構造的理解とドキュメント生成
- テスト目的: 大規模なコードに対する論理的推論と要約能力をテストする。システム全体の業務フロー図を作成するだけでなく、現在のコードに潜む潜在的なリスクを鋭く見抜けるかを要求する。
-
プロンプト:
「プロジェクトの全ソースコードを読み込み、システム全体の業務フロー図を Mermaid 記法で作成してください。また、現在のコードにおける潜在的なパフォーマンスのボトルネック、またはセキュリティ上のリスクを 3 点指摘してください。」
評価結果
実際に5つのプログラミングタスク(関数実装、バグ修正、テストコード生成など)を投げてみた結果がこちらです。
| タスク番号 | 実行時間 | 結果 |
|---|---|---|
| 1 | 10s |
成功: README.md を新規作成し、現在のシステム時刻を追記。プロジェクト構成も正しくツリー出力。 |
| 2 | 19s | 成功: 関数名のリネームと参照先の一括更新を完了し、リファクタリングを問題なく実施。 |
| 3 | 22s | 成功: コード内の不具合を2件特定して修正し、最終的に全テストケースをパス。 |
| 4 | 56s |
成功: 各 TODO に実装アドバイスを追記し、requirements.txt の依存関係も適切に更新。 |
| 5 | 11s | 成功: Mermaid 記法で業務フロー図を生成し、意図的に埋め込まれた脆弱ポイントを2件指摘。 |
全タスク成功。 複雑な指示でも1分以内、シンプルなものなら10秒台で完了します。
まとめ
本記事では、Ollama 上の Gemma4-26b を Claude Code のバックエンドとして運用し、実運用で起きやすい課題を段階的に切り分けて解決しました。具体的には、コンテキスト長不足によるツール呼び出し不全を 64k 化で改善し、KV キャッシュ量子化と Flash Attention で VRAM 使用量と速度を最適化。さらに、長時間利用時の速度低下は Ollama の更新と再起動で大幅に解消できました。
加えて、5つの実践的タスクによる性能評価では、すべての課題を短時間で完了し、ファイル編集・リファクタリング・デバッグ・外部依存管理・ドキュメント生成まで一貫して実行可能であることを確認できました。以上より、ローカル Gemma4-26b を Claude Code の後段に据える構成は、コストを抑えつつ日常開発に活用できる、十分に実用的な選択肢だと言えます。
