Day 17 講完 Container 之後,我開始遇到另一個問題。
Container 可以把 Application 打包起來,那 Model 要放哪裡?
一開始其實很簡單。
例如 ECU-2200 上面有一個:
/models
person.onnx
AI Application 啟動之後去讀這個 Model,就可以跑了。
如果今天只有一台設備,我根本不需要什麼 Model Registry。
但如果今天變成 50 台、100 台設備,問題就來了。
有些設備跑:
Person Model v1.0
有些跑:
Person Model v2.0
甚至不同的 Model 可能還對應不同的:
這時候我開始覺得,Model 不能只是一個檔案。
我先從最基本的開始。
例如:
Model Name: Person Detection
Version: 2.1
Task: Object Detection
這個其實就是最基本的版本管理。
因為之後一定會遇到:
v1.0
v1.1
v2.0
v2.1
不能只看檔名猜版本。
例如:
Format: ONNX
Input: 640 × 640
Data Type: INT8
Output: Bounding Box / Class / Score
另外還要記:
Pre-processing
Post-processing
因為 Model 下載下來,不代表 Application 就知道怎麼用。
這個對 Edge AI 特別重要。
例如:
Hardware: QCS6490
Runtime: QNN
Accelerator: HTP
Precision: INT8
因為不是看到一個 ONNX,就可以直接說:
「這個可以跑。」
可能 Model 本身沒有問題,但:
都有可能。
例如:
QCS6490
QNN
INT8
→ Validated
或者:
QCS6490
QNN
→ Not Validated
甚至:
QCS6490
QNN
→ Incompatible
我覺得這三個狀態要分清楚。
沒測過,不代表不能跑。
這在第三方 Model 特別重要。
這就進到 Validation。
我會想像 EdgeHub 裡面有一個:
Validate Model
按下去之後,不是 Cloud 自己跑。
而是:
EdgeHub
↓
建立 Validation Job
↓
Validation Device
↓
QCS6490
↓
QNN / HTP
↓
跑 Model
↓
回傳結果
先確認 Model 能不能 Load。
再確認 inference 有沒有正常。
最後才看:
FPS
Latency
CPU
HTP
Memory
這樣才比較有意義。
因為它不是單純:
「把 Model 放在雲端。」
而是讓我們知道:
這個 Model 是誰、哪個版本、可以跑在哪裡、測過沒有、測出來多少,以及現在被哪些設備使用。
例如:
Person Detection v2.1
QCS6490
QNN
INT8
Validation: PASS
FPS: 28.5
Used by:
ECU-001
ECU-002
ECU-003
這就比:
person_v2.1.onnx
有用很多。
這時候我又想到:
這些東西為什麼不能全部丟 Harbor?
因為 Harbor 本來就是我們存 Container Image 的地方。
例如:
Harbor
frontend:v1.0
backend:v1.2
ai-runtime:v2.0
而 Model Registry 管:
Person Detection:v2.1
Pose:v1.0
Helmet:v3.2
所以我現在會把它分成兩個東西:
Harbor
→ 管 Container Image
Model Registry
→ 管 AI Model
兩個都在管 Artifact,但管的是不同東西。
Cloud
│
┌──────────┴──────────┐
│ │
Application Model
Management Registry
│ │
↓ ↓
Harbor Model Storage
│ │
└──────────┬──────────┘
↓
Deployment
↓
ECU-2200
所以到這裡,我的想法其實很簡單:
Container 解決 Application 怎麼打包,Model Registry 解決 Model 怎麼管理。
而真正讓這兩個東西串起來的,還是 Cloud 的 Deployment。
同時我又想到一個很實際的問題:
既然 Harbor 也能存東西,那 Model Registry 跟 Harbor 到底差在哪?