完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-10
到目前為止,我們已經建立了:
但這些還只是「零件」。
如果沒有整合,它們看起來就像是一堆可以用的積木,但讀者很難想像整個平台到底是如何運作的。
Day 10 的重點就是:把這些零件串起來,並透過 Docker Compose、序列圖與 log trace,清楚地描述「一個任務從提交到完成」的全過程。
.env
與 .env.example
,避免環境參數散落。docker-compose.yml
全面改為 ${VAR}
引用,確保開發、測試、部署一致。透過 Docker Compose,一次啟動:
Volume 掛載 results/
與 DB,避免容器重啟資料遺失。
這份日誌對應上方序列圖,可以幫助開發者理解每個步驟的發生時機。
[23:45:12] UI | INFO: 使用者提交任務 → 產生臨時 config.yaml
[23:45:12] API | INFO: 收到 /train → 提交 Celery 任務 task_id=f377898e
[23:45:12] Celery | INFO: 任務入隊 f377898e
[23:45:16] Worker | INFO: 開始訓練 → Epoch 1/5, val_acc=0.65
[23:45:36] Worker | INFO: 訓練完成 → acc=0.84, 保存到 results/
[23:45:36] DB | INFO: 寫入實驗記錄 experiment_20250905_234512
[23:45:36] Celery | INFO: 任務完成 SUCCESS
[23:45:38] API | INFO: /task/f377898e → SUCCESS
[23:45:38] UI | INFO: 顯示結果 → 準確率=84%, 耗時=20.2秒
Day 10 的核心在於「整合」。我們第一次把配置、任務排程、UI、資料庫這些零件真正串起來,變成一個能一鍵啟動、從提交到完成都可追蹤的系統。這讓平台從單純的實驗工具,進化為具備清晰互動流程的雛型。
更重要的是,這套設計降低了理解與協作門檻。就算是沒有寫過程式的新成員,也能透過序列圖與 log trace 快速掌握系統運作邏輯。這不僅替未來的 UI 優化、多租戶支援鋪路,也為後續遷移到 Kubernetes、加入監控與自動擴縮建立了基礎。Day 10 是專案真正邁向「平台化」的起點。
📎 AI 協作記錄:今日開發指令
請幫我建立一個 docker-compose.yaml,整合以下服務:
1. Redis:作為 Celery broker/backend。
2. Celery worker:連線到 Redis,執行訓練任務。
3. FastAPI:提供 /train 和 /task/{id} API。
4. Streamlit UI:提供提交任務與追蹤任務的頁面。
需求:
- 所有服務放在同一個 network 下。
- Redis 用官方 image。
- FastAPI、Celery、Streamlit 從本地程式碼 build。
- Volumes:results/ 掛載到本地,方便保存實驗結果。
- 啟動後的訪問路徑:
- API: http://localhost:8000
- UI: http://localhost:8501
- Redis: localhost:6379