版本說明:本文依據 MIT 6.5940 Fall 2024 的 Lab 1 Colab notebook,2026-09-30 下載原始 notebook 逐格核對題號、配分與 setup。存取等級 A3:notebook、預訓練權重、資料集下載都公開;缺的是官方解答與評分回饋(繳交走 MIT Canvas)。本文不寫解答。
系列位置:上一篇 第 4 講:每層剪多少、怎麼 fine-tune、硬體怎麼吃稀疏|下一篇 第 5 講:數字格式、K-means 與線性量化|系列總覽
第 3 講與第 4 講把剪枝講成一套流程:選粒度、選標準、定每層比例、fine-tune、看硬體支不支援。Lab 1 讓你在一個小模型上把整套走一遍,而且刻意拿兩個極端比:一個剪得最細(單一權重),一個剪得最粗(整個 channel)。
notebook 開頭列的目標有五條,最後兩條是重點:對剪枝帶來的效能改善(例如加速)有基本理解,以及理解兩種剪枝方法的差異與取捨。
什麼時候做、要準備什麼
依 Fall 2024 課頁的排程,Lab 1 在 9 月 17 日(第 4 講)發出,9 月 26 日(第 7 講)截止,中間夾著兩講量化。課頁的協作規定是:可以一起討論,但每個人交自己的答案,並註明跟誰合作。
環境方面,notebook 的 setup 會做這些事:
pip install torchprofile(算 MACs 用)。- 檢查
torch.cuda.is_available(),沒有 GPU 就停下來,要你到 Colab 的 Runtime 選單換成 GPU。 - 下載一個在 CIFAR-10 上預訓練好的 VGG(跟 Lab 0 同一個模型),權重從
hanlab18.mit.edu下載;我在 2026-09-30 測試這個網址仍回 HTTP 200。 - 下載 CIFAR-10,batch size 512。
notebook 說明這個模型大約 35 MiB。它拿這個數字開場:只是把 32×32 的圖分成 10 類,模型就這麼大,放到手機或嵌入式裝置上就太重了。
九道題的結構
整本 notebook 共 9 題、100 分,分成兩大段加一題比較:
| 題號 | 配分 | 段落 | 你要做的事 |
|---|---|---|---|
| Q1 | 10 | 細粒度 | 看各層權重分布直方圖,回答共通特徵、以及這些特徵怎麼幫助剪枝 |
| Q2 | 15 | 細粒度 | 實作 fine_grained_prune:算要歸零的數量、用 |W| 當重要性、kthvalue 找門檻、產生 mask |
| Q3 | 5 | 細粒度 | 調 target_sparsity,讓測試張量剪完只剩 10 個非零值 |
| Q4 | 15 | 細粒度 | 看 sensitivity scan 曲線,回答稀疏度與準確率的關係、各層敏感度是否相同、哪層最敏感 |
| Q5 | 10 | 細粒度 | 依敏感度曲線與各層參數量,替每層挑稀疏度 |
| Q6 | 10 | Channel | 實作 get_num_channels_to_keep 與 channel_prune |
| Q7 | 15 | Channel | 實作依 Frobenius norm 算 input channel 重要性、並排序 channel |
| Q8 | 10 | Channel | 解釋為什麼剪 30% channel 大約省一半計算、為什麼延遲下降比計算量下降少一點 |
| Q9 | 10 | 比較 | 兩種方法的優缺點;要讓模型在手機上跑更快,你選哪一種、為什麼 |
程式題只有 Q2、Q3、Q5、Q6、Q7;其餘是看圖或看數字後寫短答。
前半:細粒度剪枝練什麼
Q1–Q3:從權重分布到 mask
notebook 先畫每一層的權重直方圖,再進 magnitude-based pruning。它給的定義跟第 3 講一致:重要性就是 $|W|$,給定目標稀疏度 $s$,用 kthvalue 找出第 $#W \cdot s$ 小的重要性當門檻,大於門檻的留下。Q2 的提示把這拆成四步,連建議用的 PyTorch API 都列了。
Q3 是一個小檢查:你得理解 sparsity 的定義($#\text{zeros} / #W$),才調得出「剛好剩 10 個非零值」的比例。
Q4–Q5:自己當一次 AMC
接著 notebook 把剪枝函式包成 FineGrainedPruner,記住每層的 mask,讓權重更新後還能重新套 mask、保持稀疏。
sensitivity scan 就是第 4 講第 16 頁的流程:一次只剪一層,稀疏度從 0.4 掃到 0.9(步長 0.1),記下準確率。notebook 說這格大約跑 2 分鐘。
Q5 是整份 lab 最像真實工作的一題。notebook 另外畫了每層參數量的分布,要你綜合兩張圖挑 sparsity_dict,而且有明確驗收標準:剪完的模型要是原本大小的 25%,fine-tune 後驗證準確率要高於 92.5。提示只有兩句:參數多的層該剪多一點,敏感的層該剪少一點。
挑完之後跑 fine-tune:5 個 epoch、SGD(lr 0.01、momentum 0.9、weight decay 1e-4)、cosine 學習率排程,notebook 估計約 3 分鐘。這正是第 4 講說的「剪完要 fine-tune 才救得回來」。
後半:Channel pruning 練什麼
Q6–Q7:先亂剪,再學會挑
notebook 說明 channel pruning 的賣點:整個 channel 移除,所以在 GPU 這類既有硬體上就能加速。剪完的權重仍是稠密張量,輸出 channel 數變成原本的 $(1 - \text{sparsity})$ 倍,所以這段改稱 prune ratio。
Q6 故意先用最笨的做法:每層統一剪 30%,只留前面的 channel。notebook 說目標是計算量減半,並請你想想為什麼 30% 大約對應到一半。跑完你會看到準確率掉很多。
Q7 改成先排序:以每個 input channel 對應權重的 Frobenius norm 當重要性,排序後再留前 $k$ 個。notebook 的說法是排序只「稍微」救回準確率,還是要靠 fine-tune(同樣 5 個 epoch)。
Q8:量真正的加速
最後一格比較剪枝前後的模型大小、MACs 與延遲。值得注意的是延遲量測的設定:notebook 把模型移到 CPU,用一張 1×3×32×32 的假輸入,先暖機 20 次再測 100 次。Q8 的兩個問題要你用第 4 講的觀念解釋數字,不是背答案。
Q9:把兩段接起來
Q9.1 要你從壓縮率、準確率、延遲、硬體支援(是否需要專用加速器)比較兩種方法;Q9.2 問手機情境要選哪個。這兩題沒有程式,但要回答好,得把第 4 講 EIE 的優缺點(第 80 頁)和 M:N 稀疏的動機都用上。
校外自學的限制
- 沒有官方解答,也沒有公開的 autograder。notebook 裡的 sanity check(例如
test_fine_grained_prune、channel 排序的檢查)只驗證函式行為,不幫你批短答題。 - 繳交走 MIT Canvas,校外拿不到評分回饋;Piazza 也限修課生。
- Q5 的 92.5% 門檻是你唯一的客觀驗收點。短答題建議對照投影片頁碼寫,寫完回頭看自己有沒有用到講義裡的概念。
Fall 2026 對照
Fall 2026 課頁在同樣的第 4 講(9 月 22 日)發出 Lab 1,但內容是 lab1_gpu_basics.zip,主題變成 GPU 與效率基礎,沒有剪枝。Fall 2026 的 lab 清單是 GPU Basics、Quantization、NAS、Quantization、LLM deployment on laptop。想練剪枝,Fall 2024 這本 notebook 是唯一的官方材料。
讀完可以做的事
- 先做 Q1–Q5,Q5 達標後停下來,把你的
sparsity_dict跟 sensitivity 曲線並排,確認每個數字都說得出理由。 - 做完 Q8 之後,把延遲量測從 CPU 改到 GPU 再跑一次(量測那一格的結尾本來就會把模型移回 CUDA)。比較兩個結果,再回答 Q9.2。
- 今晚就能做的一件事:只跑到 sensitivity scan,截下曲線圖,標出你覺得最敏感的一層,再對照第 4 講第 12 頁「第一層通常較敏感」的說法。
延伸閱讀
- 本 lab 用到的兩講:第 3 講、第 4 講
- PyTorch 與 CNN 基礎:CMU 11-785 導讀、MIT 6.7960 導讀
參考資料
- MIT 6.5940 Fall 2024 Lab 1 Pruning(Colab notebook) — 題號、配分、setup、驗收標準、fine-tune 與延遲量測設定
- MIT 6.5940 Fall 2024 課頁 — 發出與截止日期、協作與遲交規定、Canvas 繳交
- Lec04-Pruning-II.pdf(Fall 2024) — sensitivity analysis 流程(第 16 頁)、EIE 優缺點(第 80 頁)
- MIT 6.5940 Fall 2026 課頁 — Lab 1 改為 GPU Basics、lab 清單
- Han et al., Learning both Weights and Connections for Efficient Neural Networks(NeurIPS 2015) — notebook 引用的 magnitude-based pruning 與敏感度曲線出處
- torchprofile(GitHub) — notebook 用來算 MACs 的套件
Loading...