Skip to content

MIT 6.5940 Lab 1 怎麼做:Fine-grained 與 Channel Pruning 的九道題

2026年9月30日1 分鐘
TL;DRMIT 6.5940 Fall 2024 的 Lab 1 是一本 Colab notebook,9 題共 100 分:前 5 題在 CIFAR-10 的 VGG 上做 magnitude-based 細粒度剪枝與 sensitivity scan,要求剪到原大小 25% 且 fine-tune 後準確率高於 92.5%;第 6–8 題做 channel pruning、用 Frobenius norm 排序 channel、量測實際加速;第 9 題比較兩者。Fall 2026 沒有 pruning lab。

🌏 English version

版本說明:本文依據 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 分,分成兩大段加一題比較:

題號配分段落你要做的事
Q110細粒度看各層權重分布直方圖,回答共通特徵、以及這些特徵怎麼幫助剪枝
Q215細粒度實作 fine_grained_prune:算要歸零的數量、用 |W| 當重要性、kthvalue 找門檻、產生 mask
Q35細粒度調 target_sparsity,讓測試張量剪完只剩 10 個非零值
Q415細粒度看 sensitivity scan 曲線,回答稀疏度與準確率的關係、各層敏感度是否相同、哪層最敏感
Q510細粒度依敏感度曲線與各層參數量,替每層挑稀疏度
Q610Channel實作 get_num_channels_to_keep 與 channel_prune
Q715Channel實作依 Frobenius norm 算 input channel 重要性、並排序 channel
Q810Channel解釋為什麼剪 30% channel 大約省一半計算、為什麼延遲下降比計算量下降少一點
Q910比較兩種方法的優缺點;要讓模型在手機上跑更快,你選哪一種、為什麼

程式題只有 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 是唯一的官方材料。

讀完可以做的事

  1. 先做 Q1–Q5,Q5 達標後停下來,把你的 sparsity_dict 跟 sensitivity 曲線並排,確認每個數字都說得出理由。
  2. 做完 Q8 之後,把延遲量測從 CPU 改到 GPU 再跑一次(量測那一格的結尾本來就會把模型移回 CUDA)。比較兩個結果,再回答 Q9.2。
  3. 今晚就能做的一件事:只跑到 sensitivity scan,截下曲線圖,標出你覺得最敏感的一層,再對照第 4 講第 12 頁「第一層通常較敏感」的說法。

延伸閱讀

參考資料