AI時代系列(2) 機器學習三部曲: 🔹 第二部:《深度學習 —— 神經網路的革命》
93/100 第十週:📌 部署、壓縮與邊緣 AI 應用(Edge AI & Deployment)📦
93.量化(Quantization)與剪枝(Pruning)✂ 壓縮不等於犧牲表現!.
_______________________________________
🎯 單元導讀:
當模型從實驗室走向真實世界,「效能」與「部署可行性」才是落地關鍵。
但大模型常有數千萬參數、幾百 MB 體積,要應用在手機、IoT 或嵌入式設備上:
✅ 必須「壓縮」
→ 量化(Quantization):減少位元精度
→ 剪枝(Pruning):移除不必要的神經元或連結
本課帶你全面理解這兩大技術與實務應用!
________________________________________
✳ 一、為什麼要壓縮模型?
原因 解釋
⏱️ 降低延遲 輕量模型計算快、反應快
📦 減少儲存與傳輸成本 模型變小,可部署於低記憶體裝置(IoT、手機)
⚡ 節省能耗 輕量模型省電、延長電池壽命
✅ 加速部署與載入 模型下載時間與初始化更快速
________________________________________
🧮 二、量化(Quantization):從 32-bit 到 8-bit!
➤ 什麼是量化?
將模型中的浮點參數(FP32)轉為較低精度(如 INT8、FP16),降低儲存與計算需求。
________________________________________
✅ 常見量化方式:
常見的模型量化方式包括三大類型:Post-Training Quantization(PTQ) 是在模型訓練完成後,直接將權重與運算轉為低精度格式,實作簡單但可能影響準確率;
Quantization-Aware Training(QAT) 則在訓練過程中模擬低精度行為,讓模型學會適應量化誤差,通常可維持較高準確度;而 動態與靜態量化 的差別在於是否於推論時再進行轉換(動態)或事先量測校準參數並固定轉換比例(靜態),靜態量化通常能達到更好的效能與穩定性。
這些量化策略有助於大幅減少模型體積與加快推論速度,是部署在邊緣裝置時常見的優化手段。
________________________________________
🧪 PyTorch 靜態量化範例:
python
import torch.quantization
model.eval()
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')
torch.quantization.prepare(model, inplace=True)
torch.quantization.convert(model, inplace=True)
這段程式碼示範了使用 PyTorch 進行 Post-Training Static Quantization(靜態後訓練量化) 的流程:先將模型切換為 eval() 模式,接著設定量化配置為 'fbgemm'(適用於 x86 架構的高效量化後端),透過 prepare() 將模型插入觀測器以收集激活資訊,最後使用 convert() 將模型中的浮點權重與運算轉換為整數(INT8)格式,完成量化,能有效縮小模型體積並加速 CPU 上的推論執行。
________________________________________
✂ 三、剪枝(Pruning):把沒用的連結砍掉!
➤ 什麼是剪枝?
從訓練好的模型中移除「權重接近零」的參數或神經元連結,降低模型複雜度。
________________________________________
✅ 剪枝方式分類:
類型 說明
結構式剪枝(Structured) 移除整個神經元 / filter(對硬體友好)
非結構剪枝(Unstructured) 隨機移除稀疏權重(剪得更多但難部署)
動態剪枝 訓練中定期剪枝,逐步收斂
________________________________________
🧪 PyTorch 剪枝簡單示範:
python
import torch.nn.utils.prune as prune
prune.l1_unstructured(model.fc, name="weight", amount=0.3)
這行程式碼使用 PyTorch 的 torch.nn.utils.prune 模組,對模型的最後全連接層 model.fc 進行 L1 非結構化剪枝(L1 unstructured pruning),其作用是將 fc 層中 權重張量(weight)中 L1 範數最小的 30% 元素設為 0,以減少參數量並提高模型壓縮效果。
________________________________________
🧪 四、壓縮成效比較
· 原始 ResNet18:模型大小 45MB,推論時間 100ms,精度 71.5%
· INT8 量化版:模型大小 11MB,推論時間 20ms,精度 70.2%(下降 -1.3%)
· 剪枝+量化版:模型大小 7.5MB,推論時間 18ms,精度 69.8%(下降 -1.7%)
✅ 精度略降,但部署效率大幅提升!
________________________________________
🚀 五、搭配部署平台的壓縮策略建議
應用平台 建議策略
📱 行動裝置 優先使用 QAT + 結構剪枝 + TFLite
🤖 邊緣設備 搭配 TensorRT INT8 + Filter 剪枝
🌐 Web API 使用 ONNX + 模型壓縮工具(如 NeuralMagic)
☁ 雲端部署 可允許較大模型,但仍建議剪枝加速推論
________________________________________
📚 六、小結與啟示:
✅ 模型壓縮 ≠ 模型退化,反而讓 AI 更能落地應用
✅ 量化讓模型更小、推論更快,尤其適合低功耗設備
✅ 剪枝能減少運算與記憶體使用量,搭配硬體可顯著加速
✅ 最佳實踐:量化 + 剪枝 + ONNX + TensorRT
________________________________________
💬 1. 若你需要部署模型在 STM32 等微控制器上,你會優先選擇剪枝還是量化?為什麼?
✅ 優先選擇量化。
因為 STM32 等微控制器資源極為有限(如記憶體只有幾百 KB,無浮點硬體加速),而 量化(尤其是 INT8)可將模型從 float32 壓縮為 1/4 大小,且能大幅減少運算與能耗,是實際部署在 MCU 上最直接有效的方法。
🔍 原因:
• 剪枝(Pruning)產生的是「稀疏矩陣」,但大部分微控制器 不具備稀疏矩陣乘法加速器,反而可能增加存取開銷。
• 相較之下,量化後模型格式(如 TFLite Micro)原生支援 INT8 運算,配合 CMSIS-NN 等庫可直接加速推理。
________________________________________
💬 2. 為什麼 Post-Training Quantization(PTQ)有時會導致精度下降?有什麼方法改善?
❌ PTQ 精度下降的原因:
• 無校準資料:PTQ 直接將 float32 → INT8,若缺乏代表性的輸入範例,縮放比例計算不準,導致訊號失真。
• 量化誤差:部分層(如 attention, batchnorm)對低精度非常敏感,容易影響最終輸出。
• 整數限制:INT8 無法表現浮點數的動態範圍,對小值與極端值特別不友善。
✅ 改善方式:
• 靜態量化 + 校準集:收集代表性輸入樣本,利用統計資訊計算每層的最佳量化參數。
• Quantization-Aware Training(QAT):在訓練時模擬量化誤差,讓模型自己學會「適應失真」。
• 混合精度量化:對精度敏感的層保留 FP32,其餘使用 INT8。
________________________________________
💬 3. 剪枝時如何評估剪掉哪些參數才是「不重要的」?
✅ 評估「不重要參數」的方法通常根據 參數的貢獻度或影響力,以下是常見策略:
模型剪枝常見的方法主要依據權重的重要性進行判斷:
L1/L2 Magnitude Pruning 透過權重的絕對值或平方大小排序,將數值較小者視為不重要,是最常見也最直接的做法;敏感度分析則透過模擬移除參數後對模型性能的影響,找出對準確率影響最小的部分進行剪除;梯度導向剪枝(如 SNIP)則根據每個參數對損失函數的貢獻度(如 ∂L/∂w × w)來衡量其重要性;而結構化剪枝以 channel 或 filter 為單位進行剪除,利於實際硬體部署與加速,較適合需要推論效能最佳化的場景。這些方法可依應用需求與平台限制靈活選用。
🎯 **總結關鍵:**不重要 ≠ 值小,而是「移除後不影響模型表現」,需搭配實驗或準確率驗證評估整體剪枝策略。