[AIML] 深度學習模型的封裝: ONNX
ONNX (Open Neural Network Exchange) 是一個開放格式,
用來表示深度學習模型與傳統機器學習模型的計算圖結構,
讓不同的深度學習框架 (如 PyTorch、TensorFlow、Scikit-learn) 之間可以互通,
使模型的部署與交換更加方便.
- 模型跨平台轉換與交換
- 可將模型從 PyTorch、TensorFlow、Scikit-learn 等框架導出為 ONNX 格式
- 便於在不同工具或設備之間共享與重用模型
- 跨硬體部署 (CPU、GPU、FPGA、NPU)
- ONNX 模型可以在多種硬體平台執行,不需重新訓練
- 搭配 ONNX Runtime、TensorRT、OpenVINO 等工具,實現高效推理
- 推理優化與加速
- 可結合 TensorRT、ONNX Runtime 等進行圖優化 (Graph Optimization) 與推理加速
- 適用於邊緣設備、嵌入式系統、高性能伺服器等場景
- 多模型整合與模組化設計
- 可將多個子模型整合為一個 ONNX 模型,便於部署與管理
- 適合構建複雜管線 (例如預處理 → 模型 A → 模型 B → 後處理)
在計算圖中, 包含了以下 4 種角色:
- node: 每個節點代表一個操作 (如: matmul、relu、add)
- input: 圖的輸入 (例如: 影像、感測器資料)
- output: 圖的輸出 (例如: 分類結果、控制訊號)
- initializer: 模型的參數 (例如: 權重、bias 等)
轉化成 Directed Acyclic Graph (DAG), 再放到不同計算平台進行運算.
然而, 也是由於計算圖 (GraphProto) 的原因, ONNX 有以下限制:
1. 無法封裝任意 Python 程式邏輯
ONNX 只能表示靜態的計算圖 (computational graph),
不支援像 Python 中的 if/else, for 迴圈, try/except, 字串操作等動態邏輯.
2. 操作 (operator) 支援有限
ONNX 有一套固定的運算符集 (operator set),
若模型使用了不在其中的運算 (例如: PyTorch 中的 grid_sample),
將無法轉換或執行.
3. 不支援狀態儲存與循環記憶 (如: RNN 狀態)
ONNX 推理是無狀態 (stateless) 的, 模型每次輸入資料時不會記得前一次的狀態,
對於需要持續記憶的 RNN / LSTM 應用需要特別處理.
4. 無法直接支援多模型邏輯或模型切換
ONNX 一個檔案只能包含一個主計算圖,
無法封裝"多個獨立模型"或"模型動態選擇"的邏輯判斷
留言
張貼留言