NVIDIA GPU 上的多 Agent 編排:自治 AI 艦隊的架構設計
NVIDIA GPU 上的多 Agent 編排
「4 隻 Agent,1 張 GPU,0 個衝突。秘密在架構,不在硬體。」
在 GPU 上跑一隻 AI Agent 很簡單。跑四隻 Agent 共用同一張 GPU 而不衝突、不洩漏上下文、不搶資源 — 這是架構問題。
Ultra Lab 已經在一張 NVIDIA RTX 3060 Ti 上跑了 4 隻 Agent 的生產工作負載。這篇文章涵蓋編排架構:Agent 如何共用 GPU 資源、維持隔離上下文、排程任務不碰撞、和自動從故障中恢復。
問題:單 GPU 多 Agent
多隻 Agent 共用一張 GPU 時,你面對三個挑戰:
- 資源爭搶:兩隻 Agent 同時請求推論,要嘛排隊(慢),要嘛崩潰(OOM)
- 上下文隔離:Agent A 的客戶資料絕不能洩漏到 Agent B 的社群貼文
- 排程:4 隻 Agent 的 105 個每日任務需要不碰撞地執行
大多數多 Agent 框架用的方案是給每隻 Agent 自己的 GPU 或 API endpoint。我們沒有這個奢侈 — 只有一張 8GB VRAM 的 RTX 3060 Ti。所以我們在架構上解決。
架構概觀
┌──────────────────────────────────────────────────┐
│ 排程層 │
│ (25 個 systemd 定時器,交錯執行) │
├──────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ OpenClaw Gateway (:18789) │ │
│ │ 請求路由 + Agent 工作區管理 │ │
│ ├────────────────────────────────────────────┤ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Agent 1 │ │ Agent 2 │ │ Agent 3 │ ... │ │
│ │ │ 上下文 │ │ 上下文 │ │ 上下文 │ │ │
│ │ │ (隔離) │ │ (隔離) │ │ (隔離) │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ │ │ │
│ ├────────────────────────────────────────────┤ │
│ │ Ollama Server (:11434) │ │
│ │ 單一模型,依序推論 │ │
│ │ ultralab:7b on RTX 3060 Ti CUDA │ │
│ └────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ 62 個腳本(bash + node) │ │
│ │ 資料同步、健康檢查、互動任務 │ │
│ └────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ 19 個情報檔案(.md) │ │
│ │ 預運算上下文,執行時注入 │ │
│ └────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
三層協同運作:
- 排程:systemd 定時器把任務交錯分佈在一天之中
- 閘道:OpenClaw 路由請求到正確的 Agent 工作區
- 推論:Ollama 在 GPU 上一次服務一個請求
第一層:Agent 隔離
每隻 Agent 有自己的工作區 — 一個包含隔離上下文檔案的目錄:
~/.openclaw/agents/
├── main/ # UltraLabTW(CEO)
│ ├── IDENTITY.md
│ ├── STRATEGY.md
│ ├── CUSTOMER-INSIGHTS.md
│ ├── POST-PERFORMANCE.md
│ └── ...(19 個檔案)
├── mindthread/ # MindThreadBot
│ ├── IDENTITY.md
│ ├── MINDTHREAD-DATA.md
│ └── ...(檔案子集)
├── probe/ # UltraProbeBot
│ ├── IDENTITY.md
│ ├── COMPETITOR-INTEL.md
│ └── ...
└── advisor/ # UltraAdvisor
├── IDENTITY.md
└── ...
隔離原則
每個 Agent 工作區只包含與其角色相關的上下文檔案:
- CEO Agent:拿到全部 — 客戶洞察、策略、產品資料、績效指標
- MindThread Agent:拿到 MindThread 產品資料 + 社群表現。沒有客戶洞察。
- Probe Agent:拿到競品情報 + 安全研究。沒有客戶資料。
- Advisor Agent:拿到顧問相關上下文。最少的跨 Agent 資料。
這不只關乎隱私 — 還關乎 token 效率。隔離前,所有 Agent 載入同樣的 19 個檔案(12K tokens 的上下文)。分離上下文後,非 CEO Agent 載入 6-8 個檔案(4K tokens)。上下文大小減少 67%,直接改善推論速度和品質。
第二層:任務排程
25 個 systemd 定時器編排每日工作負載。關鍵洞察:全部交錯。
自動發文排程(UTC+8)
02:00 UltraLabTW autopost #1
03:00 MindThreadBot autopost #1
04:00 UltraProbeBot autopost #1
─── 早間批次完成 ───
08:00 UltraLabTW autopost #2
09:00 MindThreadBot autopost #2
10:00 UltraProbeBot autopost #2
10:15 UltraLabTW engage(互動)
10:30 MindThreadBot engage
10:45 UltraProbeBot engage
─── 互動批次完成 ───
14:00 UltraLabTW autopost #3
15:00 MindThreadBot autopost #3
...
23:00 UltraLabTW daily-reflect(每日反思)
為什麼交錯?
Ollama 一次處理一個推論請求(NUM_PARALLEL=1)。如果兩隻 Agent 同時提交請求,一個排隊等。在 8GB GPU 上,平行推論會 OOM 崩潰。
自動發文間隔 1 小時、互動任務間隔 15 分鐘,保證:
- 任務間最大 GPU 閒置時間(模型透過
KEEP_ALIVE=2h保持載入) - 不會有佇列堆積
- 可預測的執行順序,方便除錯
第三層:情報管線
19 個情報檔案是秘密武器。它們提供預運算的上下文,生成成本為零 LLM token:
資料流
外部來源 腳本(0 LLM 成本) Agent 工作區
───────────── → ─────────────── → ──────────────
Firestore 詢問 sync-customer-insights CUSTOMER-INSIGHTS.md
MindThread Firebase sync-mindthread-data MINDTHREAD-DATA.md
Moltbook API collect-platform-data platform-intel.md
HN / RSS feeds blogwatcher + hn-trending RESEARCH-NOTES.md
Git commit 歷史 dev-to-social recent-commits.md
每個腳本跑在 systemd 定時器上,從外部來源抓資料,寫成結構化 Markdown 檔案。Agent 執行時,工作區檔案被注入為上下文 — LLM 讀到的是即時、真實的資料,不需要任何 API 呼叫。
成本:$0
這很關鍵。情報管線完全跑在 bash 腳本、Node.js API 呼叫、和檔案 I/O 上。不需要 LLM 推論。Agent 免費獲得豐富的上下文。
故障恢復
105 個每日任務,東西一定會壞。我們的恢復架構:
等級 1:Ollama 健康檢查(每 10 分鐘)
curl -sf http://localhost:11434/api/tags > /dev/null || {
systemctl restart ollama
sleep 10 # 等模型重新載入
}
Ollama 偶爾會在連續運行 ~72 小時後掛掉。自動重啟 + 模型重載 ~8 秒。不需要人工介入。
等級 2:Gateway 看門狗(每 2 分鐘)
OpenClaw gateway 有自己的健康檢查。如果崩潰,systemd 透過 Restart=always 自動重啟。
等級 3:任務級錯誤處理
每個 cron job 設定 delivery.mode: "failure-alert" — 任務失敗時發通知到 Discord。成功時靜默。沒收到通知 = 一切正常。
等級 4:速率限制偵測
所有互動腳本偵測 API 速率限制並優雅跳過,而不是把錯誤訊息當貼文發出去:
if echo "$response" | grep -q "RATE_LIMIT\|429\|quota"; then
echo "Rate limited, skipping"
exit 0 # 乾淨退出,不觸發故障警報
fi
擴展模式
模式 1:加更多 Agent(同一張 GPU)
加第 5 隻 Agent 不需要更多 GPU。需要的是:
- 新的工作區目錄,包含角色特定的上下文檔案
- 新的 systemd 定時器,交錯進現有排程的空隙
- OpenClaw 中的新 Agent 設定
GPU 使用率不變 — 任務是依序的,一個 7B 模型處理所有 Agent。
實際上限:目前排程約 ~8 隻 Agent(24 小時 / 每隻 Agent 每天 3 個任務 = ~8 隻有舒適間隔)。
模式 2:加更多 GPU(同樣的 Agent)
加第二張 RTX 卡可以:
NUM_PARALLEL=2:兩個同時推論串流- 不需要交錯 — Agent 可以平行執行
- 或者:主 GPU 跑更大模型(14B),副 GPU 處理溢出
模式 3:混合本地 + 雲端
我們目前的做法:95% 任務跑本地 GPU,5%(複雜分析)送雲端 API。隨工作負載成長自然擴展 — 為例行任務增加 GPU 容量,保留雲端 API 做前沿推理。
我們學到的
1. 上下文隔離 > 模型大小
乾淨、隔離的上下文配 7B 模型,效果比雜亂、共享的上下文配更大模型好。Agent 品質與上下文品質成正比,不是模型大小。
2. 預運算上下文是免費情報
情報管線(19 個 .md 檔案)讓 Agent 有即時感知,成本 $0。這是我們架構中 ROI 最高的投資。
3. 依序處理對 Agent 夠用
Agent 不需要即時推論。社群貼文可以在佇列裡等 30 秒。在單 GPU 上依序處理,對自治 Agent 工作負載完全足夠。
4. systemd > 一切
我們試過 cron、PM2、自製排程器。systemd 定時器搭配 Persistent=true 和自動重啟,是我們用過最可靠的排程系統。30 天零漏掉的任務。
5. 靜默是最好的警報
只設定失敗通知。沒收到警報 = 一切正常。這可以擴展到任何數量的 Agent 而不會產生警報疲勞。
開始動手
如果你想在單張 NVIDIA GPU 上建多 Agent 艦隊:
- 從 1 隻 Agent 開始 — 先讓 Ollama + OpenClaw 跑起來,配一個 cron job
- 加情報檔案 — 預運算上下文帶來最大的品質提升
- 加第 2 隻 Agent — 獨立工作區、交錯定時器、角色特定上下文
- 監控一週 — 檢查 GPU 使用率、任務完成率、故障率
- 謹慎擴展 — 每加一隻 Agent 都增加複雜度;保持上下文隔離
我們完整的架構記錄在開源 repo:
- GitHub: free-tier-agent-fleet
- Agent 艦隊戰情室: ultralab.tw/agent
Ultra Lab 造 AI 產品。我們的 4 隻 Agent 艦隊在 NVIDIA GPU 加速的本地推論上自治運行。了解更多:ultralab.tw