Skip to content

MIT 6.5940 Lab 4+Lab 5:用 AWQ 量化 LLM,再把 LLaMA2-7B 跑在自己的筆電上

2026年9月30日1 分鐘
TL;DRLab 4 是 Colab notebook,用 OPT-1.3B 一步步重做 AWQ:先看 3-bit 量化後 perplexity 變多差,再保留 1% 重要 channel(Q1),最後改用縮放保護它們並搜尋最佳縮放(Q2),兩題各 50 分,另有依 perplexity 計分的 bonus。Lab 5 換到 C++:用 TinyChatEngine 在自己的電腦上跑 4-bit 的 LLaMA2-7B-chat,替 W4A8 線性層 kernel 依序寫 loop unrolling、multithreading、SIMD、multithreading+unrolling、全部組合五個版本,每個 20 分,另有最多 20 分的效能 bonus。本文整理兩份作業的題目、配分、環境與校外限制,不附解答。

🌏 English version

本文依據 MIT 6.5940 Fall 2024。 這是 MIT 6.5940 導讀系列第 16 篇,把第 13 講:LLM 部署的 AWQ 與 TinyChat,以及第 11 講:TinyEngine 與平行運算的 kernel 優化落到程式碼。

系列位置:上一篇 L13 LLM 部署|下一篇 Fall 2026 Lab 1 補充:Roofline、Profiling 與 FlashAttention|系列總覽

官方材料:

  • Lab 4 Colab notebook:Fall 2024 課程頁上 10 月 22 日(第 13 講)發布,10 月 31 日(第 16 講)截止。
  • Lab 5 Google Drive 資料夾:兩份 docx,一份是作業說明「6.5940 Fall 2024 Lab 5: Optimize LLM on Edge Devices」,一份是報告模板。10 月 31 日發布,11 月 12 日(第 19 講)截止。
  • tinychat-tutorial:Lab 5 的 starter repo。

以下題號、配分與敘述都照 notebook 與 docx 本身,2026-09-30 核對。

存取等級 A3,但有缺口:notebook、docx、starter repo 都公開,模型與資料集由程式自動下載。拿不到的是評分:作業走 MIT 的 Canvas 繳交,沒有公開解答,Lab 5 的 bonus 還要助教驗證。這篇不寫解答,只說每題在問什麼、對應課堂哪一段。

Fall 2026 對照:Fall 2026 課程頁的 lab 清單寫 Lab 4「Quantization」、Lab 5「LLM deployment on laptop」,排程上 Lab 4 在 10 月 27 日發布、Lab 5 在 11 月 5 日發布。截至 2026-09-30 兩者都還沒有連結。Lab 4 的標籤和 Lab 2 重複,內容是否仍是 AWQ 要等放出才知道。

兩份 lab 怎麼接起來

第 13 講說過,量化只省空間,要變快還得有推論引擎。這兩份 lab 剛好是這句話的兩半:

Lab 4Lab 5
做什麼在 Python 裡重做 AWQ 演算法,看 perplexity 怎麼變在 C++ 裡優化量化模型的線性層 kernel,看速度怎麼變
模型OPT-1.3B(facebook/opt-1.3b)LLaMA2-7B-chat(4-bit,從課程 model zoo 下載)
環境Colab GPU(notebook metadata 指定 T4)你自己的電腦(x86 或 ARM CPU)
衡量什麼wikitext-2 的 perplexitykernel 的 GOPs,以及能不能真的聊天
配分100 分+bonus100 分+最多 20 分 bonus

Lab 4:LLM Quantization with AWQ

起點與設定

notebook 開頭先講為什麼要做只量化權重:以 LLaMA-65B 單一 batch 的 decode 為例,每一步是 $[1, 8192] \times [8192, 8192]$ 的 GEMV。用 A100 的 FP16 算力與約 2000 GB/s 頻寬算下來,GEMV 的運算強度比 A100 的平衡點低了約兩個數量級,是非常嚴重的 memory-bound。這就是第 13 講第 19–20 頁那個論點的算術版。

環境設定:

  • 套件:transformers==4.31.0、accelerate==0.21.0、datasets==2.15.0 等版本都寫死在第一格 pip install。
  • 評估:wikitext-2 測試集,取 40 段、每段 2048 個 token 算 perplexity。
  • 校準資料:mit-han-lab/pile-val-backup 取 256 筆樣本,切成長度 512 的區塊,用 forward hook 收集每個線性層輸入的平均絕對值。
  • 量化方式:全程用 pseudo quantization,量化成整數後立刻還原成浮點,只模擬誤差,不寫真正的 4-bit kernel。
  • 位元數:notebook 標題說的是 4-bit,但實際題目都用 3-bit、group size 128,讓差異更明顯。

notebook 先跑 FP32 基準,再跑最直接的 3-bit 量化,結論是「模型變小了,perplexity 明顯變差」。後面每題都在想辦法把這個差距拉回來。

Question 1(50 分):保留 1% 重要權重

這段對應第 13 講第 22–24 頁的兩個觀察:權重不是一樣重要,重要性要看 activation。

題號配分在問什麼notebook 給的目標
1.120依校準得到的 activation 大小挑出 1% 的 channel,量化前備份、量化後還原成 FP16perplexity 17.15
1.215對照實驗:改成隨機挑 1% channel 保留perplexity 超過 100
1.315文字題:為什麼這些 channel 這麼重要—

1.1 與 1.2 放在一起看才有意義:同樣保留 1%,挑對和亂挑的差距就是「activation-aware」這個名字的全部理由。

有一點要提醒:2026-09-30 下載時,公開 notebook 的 1.1 與 1.2 程式格裡已經有人填了程式碼,1.3 與後面的題目仍是空白。自學時建議先把那兩格清掉自己寫,不然 Question 1 等於沒練到。

Question 2(50 分):用縮放取代混合精度

保留 FP16 是混合精度,硬體不好實作。notebook 引用第 13 講第 26 頁的誤差推導:把重要 channel 乘上 $s$、activation 除以 $s$,只要 group 裡的最大值不變,量化誤差就大約縮小 $s$ 倍。notebook 還用一個 3-bit 的小例子手算:某個權重的誤差從 2.4 降到放大 2 倍後的 0.6。

題號配分在問什麼notebook 給的目標
2.120找出 1% 重要 channel,放大後量化,再縮回來perplexity 18.93(scale factor 2)
2.215試 scale factor 1、2、3、4,觀察 perplexity 是否先降後升,並用前面的原理解釋—
2.315實作縮放搜尋:$s = s_X^{\alpha}$,在預先定義的範圍裡找讓區塊輸出誤差最小的 $\alpha$perplexity 17.92

2.3 的骨架大部分已經寫好。auto_scale_block 會對 OPT decoder layer 的四個位置搜尋縮放:attention 輸入(q/k/v proj)、attention 輸出(out_proj)、fc1、fc2,再用 scale_ln_fcs 與 scale_fc_fc 把縮放併進前一層的 LayerNorm 或線性層。你要填的是搜尋迴圈裡「算 scale、放大、量化、縮回」那幾步。

2.2 是這份 lab 最值得花時間的一題。它就是第 13 講第 25 頁那張表(RTN 43.16 → ×2 14.07 → ×4 14.42)的親手版,只是模型換成 OPT-1.3B。

Bonus

不用混合精度,任何能再壓低 perplexity 的方法都可以。若做到 perplexity $x$,得分是 $\max(0, (17.92 - x) \times 10)$,也就是比 Q2.3 的目標每低 0.1 得 1 分。

Lab 5:Optimize LLM on Edge Devices

目標與環境

docx 列的學習目標有三個:用 TinyChatEngine 在自己電腦上部署 LLaMA2-7B-chat、替線性層 kernel 實作 loop unrolling、multithreading、SIMD 三種優化、觀察每種優化帶來的端到端延遲改善。

  • 先修:基本 C/C++,docx 推薦 6.S096,以及一份平行運算教學。
  • 最低需求:macOS、Linux 或 Windows;x86(Intel/AMD)或 ARM(Apple M1/M2)處理器;8 GB 記憶體、5 GB 可用儲存空間。
  • 安裝:macOS 用 Homebrew 裝 boost 與 llvm;Windows 要 g++、make、unzip、git、Python,建議用 MSYS2。
  • 下載:git clone --recursive starter repo,再用 transformer/download_model.py 依 CPU 類型下載 QM_x86 或 QM_ARM 版的模型。

電腦不夠的 MIT 學生可以用 Athena 或圖書館電腦,docx 也直說那些電腦不好用、不推薦。校外讀者只能靠自己的機器。

背景:4-bit 權重為什麼要先重排

這段對應第 13 講第 36 頁的 hardware-aware packing。TinyChatEngine 在轉換模型時就離線重排 4-bit 權重,省掉執行時的重排開銷:

  • QM_ARM:128-bit 向量裡的 32 個 4-bit 權重 $[w_0, \dots, w_{31}]$ 重排成 $[w_0, w_{16}, w_1, w_{17}, \dots, w_{15}, w_{31}]$,前後半交錯。這樣用一次 128-bit 的 AND 與位移就能解開兩半。
  • QM_x86:256-bit 向量裡的 64 個權重重排成 $[w_0, w_{32}, w_1, w_{33}, \dots]$,配合 AVX2 的 256-bit SIMD。

讀 starter code 之前先把這兩條看懂,SIMD 那題才知道拿到的 bit 是怎麼排的。

五個實作檔與配分

要優化的是 W4A8 線性層 kernel,量化 group size 是 32。注意這和 Lab 4 的 3-bit、group 128 不同:Lab 5 的 activation 也是 8-bit 整數。

所有 starter code 在 kernels/starter_code/,reference.cc 是用普通 for 迴圈寫的基準版。docx 建議照下面順序做,每個檔案只要寫你那台電腦的 ISA(x86 或 ARM):

順序檔案技術配分
1loop_unrolling.cc迴圈展開20
2multithreading.cc多執行緒20
3simd_programming.ccSIMD 指令20
4multithreading_loop_unrolling.cc多執行緒+展開20
5all_techniques.cc全部組合20
Bonus自選比 TinyChatEngine 內建的優化 kernel 更快最多 20

每個 20 分拆成兩塊:正確性 15 分(看評估腳本的輸出)、效能報告 5 分(在你的電腦上量到多少 GOPs,並解釋為什麼變快)。docx 寫總分 120 分,也就是 100 分加 20 分 bonus。

這三種技術在第 11 講都有對應段落:loop optimization、multithreading、SIMD programming。docx 在每個技術後面都標了對應的課堂段落,寫不下去時回頭看第 11 講。

怎麼驗證

transformer/evaluate.sh 會編譯、執行,並和基準版比對正確性,印出 GOPs:

  • ./evaluate.sh:測全部實作。
  • ./evaluate.sh loop_unrolling:只測一個,同時產生執行檔 chat,執行 ./chat 就能用這個版本的 kernel 跟本機聊天機器人對話。

docx 附了 ./evaluate.sh reference 的範例輸出:reference 跑 100 次、平均 15.1 ms、約 17.3 GOPs。docx 沒寫這是在什麼機器上量的,拿來對照數量級就好。它也建議動手前先跑一次 reference,確認依賴都裝好、編得起來。

繳交與 bonus

  • 報告:用 報告模板 貼上每個檔案的實作,並回答「和 reference 比 GOPs 差多少、為什麼」。
  • 程式碼:用 git diff 產生 patch,命名為 {studentID}-{ISA}.patch,ISA 填 x86 或 ARM。
  • Bonus:比 TinyChatEngine 內建的優化 kernel 每快 1% 得 1 分,上限 20 分。報告模板補充:要對 repo 發 pull request,並由助教驗證。

報告模板裡寫的路徑是 kernel/template/,docx 與 repo 實際是 kernels/starter_code/,以 repo 為準。

校外自學的限制

  • 沒有解答、沒有評分。Lab 4 有 notebook 給的目標 perplexity 可以對,Lab 5 有 evaluate.sh 的正確性檢查,這是唯二的自動回饋。文字題與效能報告只能自己對照投影片檢查。
  • Lab 4 的套件版本是 2023 年的。transformers==4.31.0 在較新的 Colab 環境能不能順利裝起來,本文沒有實測。
  • Lab 5 的模型下載依賴課程的 model zoo。docx 寫的是用 download_model.py 下載,這個下載來源在 2026 年是否仍可用,本文沒有實測。starter repo 最後一次 push 是 2024-11-05。
  • Lab 5 的 bonus 需要助教驗證 PR,校外讀者只能自己量、自己比。

自學怎麼做

  1. 先讀第 13 講第 19–28 頁再開 Lab 4。Q1 對應第 22–24 頁,Q2 對應第 25–28 頁,notebook 的推導幾乎是逐頁搬過來的。
  2. Lab 4 的 Q2.2 一定要跑滿四個 scale factor,把 perplexity 畫成一條線。先降後升的轉折點就是「放太大會撐大 group 最大值」的證據。
  3. Lab 5 先跑 ./evaluate.sh reference,再照順序做。loop unrolling 最容易,SIMD 最需要看懂前面的權重排列。
  4. 每做完一版就跑 ./chat,感受 GOPs 的差距在聊天時變成什麼體感。

今晚可以做的一件事:clone tinychat-tutorial,只跑到 ./evaluate.sh reference 那一步,記下你電腦的 GOPs。後面每個版本都拿它比。

延伸閱讀

參考資料