0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MacBook Air 2017(8GB RAM)でAIエージェント組織を運営してみた — CPUファンが悲鳴を上げた日々

0
Posted at

始まりは「どうせ動くだろう」という過信

「AIエージェントを複数動かして、個人開発を自動化しよう」

そう思い立ったとき、私の手元にあったのは MacBook Air 2017(Intel Core i5 / 8GB RAM)だった。

「まあ、CLIツールだし。テキスト処理がメインだし。動くでしょ」

——この楽観主義が、のちに私を深夜のメモリ監視沼へと引きずり込むことになる。

Claude Code を使ってAIエージェントを組み合わせた自動化フローを組んでいる。複数のエージェントがタスクを分担して動き、記事生成・コード生成・レビュー・投稿まで一連の流れを自律的にこなすような仕組みだ。詳しい構成については ai-concierge-kei.com にまとめているので興味のある方はどうぞ。

問題は、これを8GBマシンでやろうとしたことである(そりゃそうだ)。


8GB RAMとAIエージェントの壮絶な戦い

CPUファンが悲鳴を上げた瞬間

最初の異変は、Claude Code を立ち上げてエージェントに「このリポジトリ全体を解析して」と投げた瞬間だった。

MacBook Air のファンが回り始めた。いや、「回り始めた」という表現は正確ではない。覚醒したのだ。

# CPU温度確認(Intel Mac / powermetrics使用)
sudo powermetrics --samplers smc -n 1 | grep "CPU die temperature"
# CPU die temperature: 94.50 C

94.5℃。夏の屋外より熱い。

Slack の通知音は完全に掻き消されていた。エージェントが「タスク完了しました」と言っている横で、私はファンの爆音の中、口パクで「え、なに?」をやっていた。

しばらくすると、エージェントの返答が妙に遅くなった。明らかに考えすぎている。いや、正確にはスワップしているのだ。

# メモリ使用量確認(Mac)
top -l 1 | grep "PhysMem"
# PhysMem: 7902M used (1792M wired), 290M unused.

290MB。残り290MB。

8GBのうち290MBしか残っていない状態で「複数エージェントを並列実行」などという夢を見ていたわけだ。なんというロマンチストだろう(笑えない)。


メモリ使用量のリアルタイム監視が趣味になった

こうなると人間の本能が働く。「監視しよう」と。

# Claude Code プロセスのCPU・メモリ確認
ps aux | grep -E "claude|node" | grep -v grep | awk '{print $1, $2, $3, $4, $11}'

これを5分おきに打つのが日課になった。趣味と言えば趣味だが、健全な趣味とは言い難い。

エージェントが複数立ち上がると、node プロセスが5〜6個並ぶ。それぞれが100〜400MBのメモリを食っている。合計すると余裕で2GBを超える。

あるとき、エージェントの一匹(一体?)が突然応答しなくなった。ログを見ると、タスクの途中でフリーズしている。メモリが足りなくて処理を諦めたらしい。黙ってサボり始めたのである。

仕方なく強制終了する。

# 暴走したClaudeプロセスをまとめて駆逐する
kill $(ps aux | grep claude | awk '{print $2}')

このコマンドを打つ回数が、週に3〜4回を超えたあたりで「さすがに運用として成り立っていない」と気づいた(遅い)。

同じ悩みを持つ方は多いはず。「AIツールを使い倒したいが、PCが追いつかない」という現実は、M1/M2 Mac を持っていない個人開発者には切実な問題だ。あなたのPCは何GB?


試行錯誤の末に見つけた「軽量化5つの戦術」

半月ほどCPUと格闘した結果、なんとか運用できるレベルに落ち着いた。以下が、8GBマシンでAIエージェントを動かすための実用的な戦術だ。

1. モデルをフル活用しない(超重要)

Claude Code はデフォルトで Sonnet などの高性能モデルを使う。高性能なのは良いが、レスポンスが長く、処理も重い。

軽量なタスク(フォーマット変換、ファイル分類、定型テキスト生成など)には Haiku を使うよう明示的に指定する。

# モデルを明示してコスト・負荷を下げる
claude --model claude-haiku-4-5-20251001 "この文章を箇条書きにまとめて"

Haiku は体感で Sonnet の6〜7割のパフォーマンスだが、メモリ消費とレスポンス長が抑えられる。単純作業エージェントを Haiku に切り替えるだけで、並列実行時のメモリ圧迫がかなり改善された。

モデル選定の詳細については、Claude Code CLI のAPIコスト最適化についてまとめた記事も参考になる。


2. コンテキストウィンドウを意識的に削る

「リポジトリ全体を読んで」とエージェントに投げると、数千行のコードを一気に読み込む。これがメモリキラーの筆頭だった。

対策は「読む範囲を限定する」こと。

# 特定ファイルのみ渡す(リポジトリ全体は渡さない)
claude "以下のファイルだけレビューして" < src/specific_module.py

また、長い会話セッションは意図的にリセットする。コンテキストが積み上がるほどメモリ消費は増える。「新しいタスクは新しいセッションで」を鉄則にした。


3. 並列実行を諦めてシリアル実行に切り替える

「エージェントを並列で走らせて効率化!」という夢は、8GBでは早々に諦めた。

2つのエージェントが同時に動くと、合計メモリが6〜7GBに達し、OS 自体がモタつく。ブラウザタブを全部閉じて、Slack も落として、やっと Claude Code が快適に動く、という状態である。

そこで採用したのがシリアル(直列)実行だ。タスクをキューに積んで、1つが終わったら次を実行する。

#!/bin/bash
# シンプルなシリアル実行スクリプト
tasks=("task_a.txt" "task_b.txt" "task_c.txt")

for task in "${tasks[@]}"; do
  echo "▶ 実行中: $task"
  claude < "$task"
  echo "✅ 完了: $task"
  sleep 3  # プロセスがきれいに終了するのを待つ
done

これで並列実行の2倍の時間はかかるが、マシンがフリーズしなくなった。スピードより安定性を選ぶ、老成した判断である(諦めとも言う)。


4. アイドル時間を活用したバッチ処理

AIエージェントに「重い処理」をさせるなら、自分がPCを使っていない時間を狙う。

夜中の2時、あるいは昼食中。そういったアイドルタイムにバッチジョブを仕込む。

# cron で深夜2時に実行
# crontab -e で以下を追加
0 2 * * * /path/to/agent_batch.sh >> /path/to/agent.log 2>&1

この「人間が寝ている間にエージェントが働く」という体制を確立してから、昼間のファン爆音に悩まされることが激減した。

エージェントも夜型になってしまったが、文句は言わない(言えないし)。


5. ローカルLLMとの使い分け

超軽量タスクには、Ollama などでローカル LLM を動かす選択肢もある。

# Ollama でローカルモデルを使う
ollama run llama3.2:1b "この文章の誤字を直して"

1B〜3B パラメータのモデルなら、8GB マシンでも比較的快適に動く。API コストもゼロ。

ただし、品質は Claude と比べると差があるため「テキストの整形」「フォーマット変換」「簡単な要約」などに限定して使っている。判断が必要なタスクは Claude に任せる、という役割分担だ。


実際のシステム負荷グラフ(コマンド例)

実運用で使っているモニタリングコマンドをまとめておく。同じ悩みを抱えるマシンをお持ちの方はぜひ。

# 1. リアルタイムメモリ監視(1秒おき)
while true; do
  top -l 1 | grep "PhysMem"
  sleep 1
done

# 2. Claude / Node プロセスの現在の負荷
ps aux | grep -E "claude|node" | grep -v grep \
  | awk '{printf "PID: %s | CPU: %s%% | MEM: %s%% | CMD: %s\n", $2, $3, $4, $11}'

# 3. CPU温度(Intel Mac)
sudo powermetrics --samplers smc -n 1 2>/dev/null | grep "CPU die temperature"

# 4. スワップ使用量の確認
sysctl vm.swapusage

# 5. ゾンビプロセスの確認(動いているつもりで止まっているエージェント)
ps aux | awk '$8 == "Z" {print $0}'

5番目のゾンビプロセス確認は、エージェントが「サボっているのか死んでいるのか」を判定するのに重宝している。ゾンビになっているエージェントを見つけたときの気持ちは、人事担当者に近い何かを感じる。


結論: 低スペックPCはAI開発の最高の反省材料だった

半月間、8GB MacBook Air でAIエージェントを運用してみて得た知見を振り返る。

技術的に得られたもの:

  1. モデル選定の重要性が身に染みた — 高性能モデルを使えばいいというわけではない。タスクに合ったモデルを選ぶことが、コストとパフォーマンス両面で重要だ。
  2. コンテキスト管理は最重要スキル — 大きなコンテキストを渡せば良い結果が出るわけではなく、必要な情報だけを渡す設計が品質を上げることもある。
  3. 並列化は銀の弾丸ではない — リソースが潤沢なときは並列化が効くが、ボトルネックが別にある場合はシリアル実行の方が安定する。
  4. 監視なくして運用なし — エージェントは黙ってサボる。プロセス監視とログ出力は最初から仕込んでおくべきだった。

高性能な M3 Mac Pro があれば、こんな苦労はしなかったかもしれない。でも、制約があるからこそ「最小限で動かす設計」を真剣に考えた。

制約は思考を強制する。

今ではM1以上のMacに乗り換えた知人に「並列でガンガン動かせる」と言われても、「でもコンテキスト管理ちゃんとしてる?」と聞き返せる自信がある。

CPUファンの爆音は、良い師匠だった(騒がしいけど)。


より詳細なAIエージェント構成やコスト最適化の知見は ai-concierge-kei.com でも発信しているので、興味のある方はのぞいてみてほしい。

低スペックPCで格闘している仲間、コメントで語り合いましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?