[AIML] 深度學習模型的封裝: ONNX

 ONNX (Open Neural Network Exchange) 是一個開放格式,
用來表示深度學習模型與傳統機器學習模型的計算圖結構,
讓不同的深度學習框架 (如 PyTorch、TensorFlow、Scikit-learn) 之間可以互通,
使模型的部署與交換更加方便.


透過 ONNX, 我們可以完成以下的目標:
  • 模型跨平台轉換與交換
    • 可將模型從 PyTorch、TensorFlow、Scikit-learn 等框架導出為 ONNX 格式
    • 便於在不同工具或設備之間共享與重用模型
  • 跨硬體部署 (CPU、GPU、FPGA、NPU)
    • ONNX 模型可以在多種硬體平台執行,不需重新訓練
    • 搭配 ONNX Runtime、TensorRT、OpenVINO 等工具,實現高效推理
  • 推理優化與加速
    • 可結合 TensorRT、ONNX Runtime 等進行圖優化 (Graph Optimization) 與推理加速
    • 適用於邊緣設備、嵌入式系統、高性能伺服器等場景
  • 多模型整合與模組化設計
    • 可將多個子模型整合為一個 ONNX 模型,便於部署與管理
    • 適合構建複雜管線 (例如預處理 → 模型 A → 模型 B → 後處理)
在 ONNX 架構中, 事實上是把模型拆解成計算圖 (GraphProto),
在計算圖中, 包含了以下 4 種角色:
  • node: 每個節點代表一個操作 (如: matmul、relu、add)
  • input: 圖的輸入 (例如: 影像、感測器資料)
  • output: 圖的輸出 (例如: 分類結果、控制訊號)
  • initializer: 模型的參數 (例如: 權重、bias 等)

透過上述運算子, ONNX 可以把原有的運算,
轉化成 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 一個檔案只能包含一個主計算圖, 
無法封裝"多個獨立模型"或"模型動態選擇"的邏輯判斷

留言

熱門文章

LTE筆記: RSRP, RSSI and RSRQ

[WiFi] WiFi 網路的識別: BSS, ESS, SSID, ESSID, BSSID

LTE筆記: 5G NR Measurement Events