AI時代系列(2) 機器學習三部曲: 🔹 第二部:《深度學習 —— 神經網路的革命》
92/100 第十週:📌 部署、壓縮與邊緣 AI 應用(Edge AI & Deployment)📦
92.使用 ONNX 與 TensorRT 壓縮模型 📦 讓大模型變得可攜又快!
________________________________________
🎯 單元導讀:
深度學習模型雖強,但訓練後模型往往體積龐大、運算緩慢,難以直接應用於行動裝置、嵌入式設備或即時任務中。
本課介紹兩大高效工具:
✅ ONNX:跨平台通用模型格式
✅ TensorRT:NVIDIA 的極速推理引擎
學會它們,你就能把模型「壓縮成小、轉換成快、部署成廣」!
________________________________________
📦 一、ONNX:Open Neural Network Exchange
📌 ONNX 是什麼?
ONNX 是由 Microsoft 和 Facebook 推出的 深度學習模型的中間表示格式,支援多數主流框架:
🔗 官方管網資訊(ONNX 官網):
網址:
🌐 https://onnx.ai
ONNX 支援多種主流機器學習與深度學習框架,使模型在不同平台間轉換與部署變得高效便利:PyTorch 可透過 torch.onnx.export() 將模型導出為 ONNX 格式;TensorFlow 則可透過 tf2onnx 工具進行轉換;此外,像是 scikit-learn、XGBoost 等傳統機器學習模型也能轉為 ONNX 格式,方便部署至支援 ONNX Runtime 的裝置或系統,實現跨框架、跨平台的高度相容性與靈活性。
________________________________________
✅ ONNX 優勢:
• 模型 可攜性強,一次訓練,多平台使用
• 支援 C/C++、Java、Python 等部署語言
• 可用 ONNX Runtime 加速推論,支援 CPU、GPU、OpenVINO、DirectML
________________________________________
🧪 PyTorch → ONNX 示範:
python
import torch
import torchvision.models as models
model = models.resnet18(pretrained=True)
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy_input, "resnet18.onnx", opset_version=11)
這段程式碼將 PyTorch 預訓練的 ResNet-18 模型透過 torch.onnx.export() 匯出為 ONNX 格式檔案 resnet18.onnx,其中使用一個模擬輸入來定義模型的輸入形狀,並指定 opset_version=11 以確保操作相容性。這樣匯出的模型可部署於 ONNX Runtime、TensorRT、OpenVINO 等跨平台推論環境,有助於實現高效、靈活的模型落地應用。
________________________________________
🚀 二、TensorRT:NVIDIA 的推理加速器
🌐 官方網站
NVIDIA TensorRT 官網:
🔗 https://developer.nvidia.com/tensorrt
🚀 TensorRT 是什麼?
TensorRT 是由 NVIDIA 開發的高性能深度學習推論引擎,專為 NVIDIA GPU 優化,可顯著加速神經網路在邊緣設備與伺服器上的推理速度。
________________________________________
✅ TensorRT 優點:
TensorRT 透過多項關鍵優化技術大幅提升深度學習推論效能,包括將多個運算層進行層融合以減少記憶體存取次數、使用動態 Tensor 編譯根據實際輸入自動調整最佳記憶體與計算策略,並支援 INT8 / FP16 低精度運算,在精度可接受的情況下大幅提升速度與節能效率。這些優化讓 TensorRT 在影像辨識、目標偵測等推論密集任務中最高可實現數十倍的加速效果,是部署 AI 模型至 NVIDIA GPU 的強效工具。
________________________________________
🔁 ONNX + TensorRT 工作流程:
[PyTorch / TF2 模型]
↓(export)
.onnx 檔案
↓(trtexec / TensorRT API)
.engine 推論引擎
↓
於 Jetson / GPU 上高速執行
ONNX + TensorRT 的部署流程通常從已訓練好的 PyTorch 或 TensorFlow 2 模型開始,先透過 export 將其轉換為通用的 .onnx 格式,接著使用 trtexec 工具或 TensorRT API 將 ONNX 模型編譯為 .engine 推論引擎,最後部署至 Jetson 或 NVIDIA GPU 平台上進行高效推論。這種流程結合了 ONNX 的跨框架可攜性與 TensorRT 的極致推理加速,實現模型在邊緣與伺服器端的最佳效能落地。
________________________________________
🛠️ 實作步驟:ONNX → TensorRT
# 安裝 TensorRT + trtexec(建議在 Jetson 或 Linux CUDA 環境中)
trtexec --onnx=resnet18.onnx --saveEngine=resnet18.engine --fp16
✅ 加入 --fp16 或 --int8 可進行低精度加速
________________________________________
📐 模型壓縮比較:ONNX + TensorRT vs 原始模型
從模型壓縮與推論效能角度比較,原始 PyTorch 模型大小約 45MB,僅能在 PyTorch 環境中執行,推論延遲約為 100ms;轉換為 ONNX 格式後雖然大小不變,但可跨平台部署並將延遲降低至約 70ms;進一步透過 TensorRT 優化為 FP16 精度後,模型大小可縮小至約 12MB,推論延遲大幅降低至 10ms,效能提升顯著,適合部署於 NVIDIA GPU 或 Jetson 裝置,是高效能應用中常見的最佳化選擇。
________________________________________
💡 組合應用情境範例
情境 建議策略
Web 推理服務 PyTorch → ONNX → ONNXRuntime(CPU/GPU)部署
APP 輕量推理 PyTorch → TorchScript 或 TFLite
邊緣設備(Jetson) PyTorch → ONNX → TensorRT(int8/fp16)最佳化
________________________________________
📚 六、小結與實務建議:
✅ ONNX 適合模型格式中介與通用部署
✅ TensorRT 適合 NVIDIA 平台的極速推理與節能優化
✅ ONNX + TensorRT 是企業常見的高效部署組合
✅ 建議與剪枝、量化、知識蒸餾等技術搭配實現最大壓縮效益
________________________________________
💬 問題挑戰與思考:
💬 1. 模型壓縮後精度下降怎麼辦?怎麼做效能與準確率的折衷?
模型壓縮(如量化、剪枝、知識蒸餾)在提高推論效率的同時,可能導致精度下降。為了平衡效能與準確率,可以採用以下策略:
✅ 折衷方法:
• 量化感知訓練(QAT):在訓練過程中模擬低精度運算,讓模型適應精度變化,比純後處理量化更能維持準確率。
• 混合精度推論:針對敏感層保留 FP32,其餘使用 FP16 或 INT8,達到速度與精度的平衡。
• 知識蒸餾:用大模型教小模型,讓壓縮後的小模型更接近原始模型的預測行為。
• 後壓縮驗證:壓縮後重新跑驗證集,視應用容忍範圍選擇最合適壓縮策略。
________________________________________
💬 2. ONNX 的可攜性是否意味它可以直接在手機上跑?為何不行?
ONNX 本身的「跨平台可攜性」並不代表能直接在手機上執行,原因如下:
❌ 限制說明:
• ONNX 是中間格式,並非手機端推論框架,手機並沒有原生支援 ONNX Runtime。
• 行動裝置需使用專門優化的格式與推論引擎,如:
o Android:使用 .tflite(TensorFlow Lite)
o iOS:使用 .mlmodel(CoreML)
• 若要在手機上執行 ONNX 模型,需經過額外轉換或搭配特定推論引擎(如 ONNX.js 或 NCNN)。
✅ 解法建議:
• 可先將 .onnx 轉為對應平台支援的格式再部署。
• 或在手機 App 中採用 Web API 呼叫雲端 ONNX Runtime 推論服務。
________________________________________
💬 3. 在資源受限環境(如 Jetson Nano)上,TensorRT 的優勢是什麼?
在 Jetson Nano 等低功耗邊緣設備上,TensorRT 能發揮關鍵優勢,包含:
🚀 TensorRT 優勢總結:
• 極致效能:支援 INT8/FP16,搭配層融合與記憶體最佳化,推論速度遠超原生 PyTorch 或 TensorFlow。
• 資源節省:能顯著減少推論所需的 RAM 與儲存空間,適合記憶體受限的裝置。
• 靈活精度控制:可依任務需求選擇 FP32、FP16 或 INT8 精度,調整效能與準確率的權衡。
• 與 Jetson 平台深度整合:官方支援 CUDA/cuDNN,原生支援 JetPack 套件,可無縫部署模型。
✅ 在 Jetson Nano 上使用 TensorRT,能讓邊緣 AI 應用如影像辨識、目標追蹤、智慧監控等實現低功耗、高效能的即時推論。
________________________________________
🔚 一句話總結:
模型壓縮雖可能影響精度,但可透過量化感知訓練與混合精度等手段平衡效能與準確率;ONNX 雖具跨框架可攜性,仍需透過適配工具或轉換方能部署至手機;而在資源有限的 Jetson Nano 上,TensorRT 則是實現高效能邊緣推論的關鍵加速引擎。












