我開始思考一件事情:
我們怎麼知道一個 Model,真的可以交給客戶使用?
這時候又出現另一個很現實的問題。
如果今天客戶跟我說:
「我們公司已經有自己的 AI Model,可以直接放到 Cloud 裡面嗎?」
我的第一個反應可能是:
可以啊,Upload 上去不就好了?
但仔細想想,好像沒有這麼簡單。
假設客戶丟給我們一個:
customer_person_detection.onnx
看起來很簡單。
我們是不是只要:
Upload
↓
Save
↓
Deploy
就好了?
其實風險很高。
因為我們根本不知道這個 Model:
所以我後來覺得:
Upload 跟 Deploy,中間一定要多一道流程。
這是我在設計 Model Registry 時,覺得很重要的一個觀念。
使用者把 Model 上傳進來,只代表:
「我有一個 Model。」
不代表:
「這個 Model 可以在這台 Edge Device 上正常運作。」
所以流程應該變成:
Customer Model
↓
Upload
↓
Model Registry
↓
Compatibility Check
↓
Validation
↓
Approval
↓
Deploy
這樣 Model Registry 才不是單純的「檔案倉庫」。
它其實是 Model 從「被上傳」到「可以被部署」之間的管理機制。
Model 上傳之後,第一件事情不是直接跑。
而是先問:
這個 Model 到底是不是我們的平台能處理的?
例如我們現在主要跑在 Qualcomm QCS6490。
那至少要確認:
例如:
ONNX
QNN
TFLite
例如:
Input
└─ 640 × 640 × 3
Output
└─ Detection Boxes
└─ Class
└─ Score
有沒有使用 QNN / QCS6490 不支援的 Operator?
如果有:
Model
↓
QNN Conversion
↓
Unsupported Operator
↓
FAIL
那就不應該讓它進入 Deployment。
一開始很容易想:
「那就叫客戶把所有資訊填完整。」
例如 Upload Model 的時候,要求客戶填:
Model Name
Version
Framework
Input Size
Input Format
Output Format
Quantization
QNN Backend
HTP Version
Pre-processing
Post-processing
...
看起來很完整。
但實際上我覺得這不是一個好的 Product Design。
因為客戶可能根本不知道:
「HTP Version 是什麼?」
更不應該要求客戶理解 Qualcomm SDK 裡面的所有細節。
所以我會把它分成兩種資訊。
例如:
就讓 Platform 自己解析。
例如:
才讓使用者補充。
這樣比較符合產品設計的原則:
不要把 Platform 的複雜度,直接丟給使用者。
這是 Day 23 我覺得最重要的地方。
假設:
Model Format ✓
QNN Conversion ✓
Operator ✓
QCS6490 ✓
HTP ✓
是不是就可以 Deploy?
還是不行。
因為「可以跑」跟「可以交付」是兩件事情。
例如:
客戶要求:
1080p Video
至少 20 FPS
結果我們測出來:
Model Conversion ✓
QCS6490 ✓
Inference ✓
FPS 8
技術上它可以跑。
但是產品上:
不能交付。
我會比較傾向把 Model Validation 分成:
能不能跑?
Format
Operator
Runtime
Hardware
Accelerator
跑得夠不夠快?
例如:
Target:20 FPS
Actual:31 FPS
PASS
或者:
Target:20 FPS
Actual:8 FPS
FAIL
不是只跑 30 秒。
而是要確認:
1 hour
4 hours
8 hours
24 hours
是否會:
因為 Demo 跑得動,跟產品穩定運作,是完全不同的事情。
這個其實又是另一個容易被忽略的問題。
假設 Model 的 FPS 很漂亮:
31 FPS
但客戶真正要的是:
「偵測人員有沒有進入禁區。」
結果實際測試:
Person Detection
↓
Geofence
↓
Event
發現誤報很多。
那這個 Model 即使效能很好,
還是不能算是一個合格的 Product Model。
所以最後應該驗證的是:
Model 能不能解決 Use Case,而不只是能不能跑。
做到這裡,我才發現:
如果 Model Registry 只是:
Model Name
Model File
Version
其實是不夠的。
比較完整的概念會是:
Model
│
├── Model Version
│
├── Original Model
│
├── Model Artifact
│ └── QCS6490 / QNN / HTP
│
├── Input / Output
│
├── Runtime
│
├── Pre/Post Processing
│
├── Validation Result
│
├── Performance
│
├── Stability
│
└── Approval Status
也就是:
Model Registry 管的不是一個
.onnx檔案,而是一個 Model 可以被部署的完整資訊。
當所有 Validation 都完成之後,才進入:
Validation
↓
PASS
↓
Approval
↓
Available for Deployment
例如:
Customer Person Detection
Version: v1.2
Format: ONNX
Target: QCS6490
Runtime: QNN
Backend: HTP
Compatibility: PASS
Performance: 31 FPS
Stability: PASS
Use Case: PASS
Status:
Approved
這時候 Cloud 才可以讓這個 Model 出現在:
Available Models
裡面。
客戶看到的不是:
「這是一個 ONNX File。」
而是:
「這是一個已經驗證,可以部署到我的 Edge Device 的 Model。」
假設今天客戶的 Model:
Person Detection v1.2
已經通過所有驗證。
結果客戶過了一個月跟我說:
「我們 Model 更新了,現在是 v1.3,幫我換掉。」
我可能又會直覺想:
「那就把舊的檔案換掉啊。」
但等等。
Model 換掉,Application 還一定跑得起來嗎?
如果:
v1.2
Output = 3 tensors
變成:
v1.3
Output = 6 tensors
那原本的 Detection、Post-processing、Event Rule,甚至 Application Logic 都可能受到影響。
所以我開始發現:
Model Version,其實不只是 Model 自己的事情。
它可能會影響整個 Application。