iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0

完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-8


在 Day 7,我們用 Celery + Redis 解決了「訓練會卡住」的問題,讓任務能以非同步方式在背景執行。
使用者只需要呼叫 API,就能提交訓練請求並用 task_id 查詢狀態。

不過這裡有個痛點:

  • API 回傳的其實只是 JSON
  • 需要使用者手動輸入 curl 指令或 Postman 測試
  • 如果不是工程師,這樣的操作體驗幾乎不可接受

因此,Day 8 的目標是提供一個 最小化的網頁 UI,讓人能「提交任務、輸入 task_id 查詢狀態」,而且不用寫任何前端程式碼。


本日新增功能

1. 提交任務

在 UI 的「提交任務」頁籤,使用者可以:

  • 輸入實驗名稱
  • 設定參數(例如 epochs, learning_rate
  • 點擊「提交任務」

系統會呼叫 FastAPI /train API,並立刻回傳一個 task_id


2. 追蹤任務

在「追蹤進度」頁籤,使用者可以輸入剛拿到的 task_id

UI 會每隔 2 秒呼叫 /task/{id} API,並把任務狀態以 Stepper 流程 顯示:

  1. PENDING → 任務已提交,尚未開始
  2. STARTED → 訓練進行中
  3. SUCCESS / FAILURE → 任務完成或失敗

架構流程圖

[ 使用者 (UI) ]
     │
     ▼
 Streamlit 介面 ── 提交任務 ──▶ FastAPI (/train)
     │                                │
     │                                ▼
     │                     Celery Broker (Redis DB0)
     │                                │
     │                                ▼
     │                        Celery Worker 執行訓練
     │                                │
     │                                ▼
     │                     結果存入 Redis Backend (DB1)
     │                                │
     └── 查詢進度 ◀──── FastAPI (/task/{id}) ◀──────

這個流程圖讓人一眼就能理解:UI 只是最外層,背後仍然是 FastAPI + Celery + Redis 的協作。


使用方式

  1. 啟動四個服務:
make start-services   # Redis
make start-worker     # Celery worker
make start-api        # FastAPI
make start-ui         # Streamlit UI
  1. 打開瀏覽器 → http://localhost:8501
  • 提交任務:表單輸入參數 → 點擊 → 拿到 task_id
  • 追蹤進度:輸入 task_id → 即時刷新進度

這次的改動雖然簡單,但卻大幅降低了使用門檻。過去需要打 API、操作 JSON 的流程,如今只要打開瀏覽器,就能直接提交與追蹤訓練任務。這讓系統不再只是「工程師能用」,而是任何人都能快速上手。

更重要的是,這個 UI 是一個最小可行產品(MVP),為後續的完整前端整合鋪路。隨著任務日誌、進度條、甚至多用戶介面的加入,這套平台將逐步走向更完整、更友好的產品形態。


📎 AI 協作記錄:今日開發指令

請幫我新增一個 Python 版的 Stepper UI,放在 `app/stepper_ui.py`。

需求:
1. 使用 **Streamlit**(首選),或 Gradio(備選)。
2. UI 流程:
   - 提供一個輸入框輸入 task_id
   - 點擊「查詢」按鈕後,定期呼叫 FastAPI `/task/{id}` API
   - 把回傳的狀態(PENDING, STARTED, SUCCESS, FAILURE)顯示成 Stepper 流程
3. Stepper 規則:
   - Step 1: PENDING
   - Step 2: STARTED
   - Step 3: SUCCESS / FAILURE
4. UI 要能自動刷新(例如每隔 2 秒輪詢一次)。
5. 執行方式:`streamlit run app/stepper_ui.py`

目標:
- 讓使用者可以在瀏覽器中輸入 task_id,清楚看到訓練任務的進度。
- 這是一個最小化的 Demo,不需要做美化,只要能用即可。

上一篇
[Day 7] 任務排程基礎:Celery + Redis 的非同步訓練
系列文
打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言