# [2025李宏毅ML] 助教課:利用多張GPU訓練大型語言模型—從零開始介紹DeepSpeed、Liger Kernel、Flash Attention及Quantization :::success :+1: 筆記全集Book 請至: https://hackmd.io/@4j/r1U_UJ_pye/ ::: :::info 2025生成式AI時代下的機器學習_李宏毅 課程網站 https://speech.ee.ntu.edu.tw/~hylee/ml/2025-spring.php video: https://youtu.be/mpuRca2UZtI?si=GQu-6l4WENr-5zqQ [[Excalidraw]](https://drive.google.com/file/d/1pKgY4EuyXh7SuTbI_r7it1CK5DCFUKYZ/view) ▪ Instructor Hsiu-Hsuan Wang(王秀軒) Find more at https://anthony-wss.github.io/ (20250329) ::: :::spoiler 目錄 [TOC] ::: ![image](https://hackmd.io/_uploads/SkxsXNzJee.png) ## Overview ![image](https://hackmd.io/_uploads/ryN3QEMkgx.png) 在 LLM 時代,一般 pytorch 訓練 NN 的方法會無法訓練 可利用以下 package (場景) 1. **DeepSpeed**: 多張 GPU 平行運算 2. **Liger Kernel, Flash Attention**: 輸入 context 太長 ex: 32k 128k 3. **Quantization**: 如想用 colab 跑作業時 ## Introduction ### 1. Forward & Backward pass ![image](https://hackmd.io/_uploads/r1lC7VGJlx.png) ▪ **LLM訓練為什麼大** ``` cross entropy (output, label)算loss 再 backpropagation 推到輸入 得到 gradient 經由 optimizer 更新 weights ``` 訓練上困難 主要是 **"LLM weights"** 很大! ### 2. Memory needed, assuming LLM is a 8b model ![image](https://hackmd.io/_uploads/HypR7VMkex.png) ▪ **要訓練8B模型** fp32: 一個float=32bit, 就需要 32GB 在訓練時, 常轉成fp16 (nv對fp16也有特別加速) ▪ **adam** 他的設計是每個權重都有個 lr, 故 momentum 跟 variance 大小同 w gradients 作為輸入 更新w ⇒ 儲存空間(不含input)全部加起來為 128GB!!! 但 **input** 才是佔最多的 ### 3. Activations ![image](https://hackmd.io/_uploads/H1ukVVfylg.png) ▪ **activation**: 模型每層對 input 產生的反應 "attention" 在其中佔最大, 空間複雜度為 n平方 ▪ **3.1 Activation recomputation (gradient checkpointion)** 訓練時不把 activation 都存下來, **存重要的就好**, 在 backward 需要時再算(訓練時會慢一點) ### 4. Batch size ![image](https://hackmd.io/_uploads/rkm2LVfkgx.png) Batch size 要夠大才不會有 bias 基本上要 4-60M token (DeepSeek V3: bz=1920) 解法: **Gradient accumulation** 把1920切小批 都過完後再一起合併更新 ### 5. Challenges ![image](https://hackmd.io/_uploads/HyyTI4fJee.png) (紫紅綠) para,grad,opti 在不同輸入長度時的 memory 會是一樣大小 只有 **activations** 會依輸入長度指數型增長 memory ## Part I. parameters, gradients and optimizer states ### 1. How to leverage multiple GPUs? ![image](https://hackmd.io/_uploads/ryrMNVGJge.png) (16/32 bit 對應到前2的圖) 一個GPU放不下, 就分到多個去運算 ### 2. DeepSpeed - Zero Redundancy Optimizer (ZeRO) ![image](https://hackmd.io/_uploads/ryg44VGkee.png) DeepSpeed的套件 他使用 **Zero Redundancy Optimizer (ZeRO)** 演算法 ▪ **3 個 Level** -zero1: opt 佔最大先切分他, 會多一些GPU間的傳輸 -zero2: 再切第二大的部分 grad, LLM -zero3: 再切 LLM (會從32bit 開始切是因為他們 佔體大 且 用到的時間較少) 其實GPU間傳輸是很快的, 如NVLink: 900GB/s ### 3. Memory Reduction ![image](https://hackmd.io/_uploads/BJj4NNGkee.png) DP=8 切八片, 虛線: H100 為 80GB 橘色不會減少, 紫紅綠依序縮小八倍 若使用 zero3, 就可訓練到16k長度的8B模型 :D ▪ **3.1 Traning Speed** 速度還取決於 network bandwidth, model size,...等 但這些都不至於慢太多~ ### 4. Zero - Offload ![image](https://hackmd.io/_uploads/BkmBVNGklg.png) 用了 Zero 還是放不下的話, 借用 CPU 運算 ▪ **4.1 optimizer offload** 把跟 opt 相關的部分都搬到 CPU ▪ **4.2 optimizer + model parameter offload** 全部都搬到 CPU, 要用時再搬過來 GPU 做 但是 CPU GPU間的傳輸是很慢的!! 訓練會變非常慢 ### 5. Simple Experiment on TWCC(國網中心) ![image](https://hackmd.io/_uploads/SkRrVNMygg.png) 實驗有多慢 ``` V100(32G)*4 → 128G input開很小: bz=1, max_len=512 ``` 實測 1GPU 需要 15GB, 1 step 要 74 秒 (非 常 慢) 如果有 8張GPU 就裝得下 不用跑offload, 變 7.3 秒 快了 10 倍 ▪ **結論** 使用 8張V100 是可以做到 fully finetuning 8B的模型, 速度約 7.3 s/step 盡量不要使用 offload 慢 不好用 ## Part II. activations 想改善attention計算的效率 ⇒ 重寫實作的 code ### 1. kernel ![image](https://hackmd.io/_uploads/S1UU4Vfygg.png) Kernel: 跑在 GPU 上的 function ### 2. Flash Attention Algorithm ![image](https://hackmd.io/_uploads/r1lPVEGyll.png) Flash Attention Algorithm (做一個新kernel function) 算得更快 又更少記憶體 (會佔到CPU RAM) ▪ **2.1.1 Fused Kernel** 右圖可發現在attention裡矩陣乘法並不是佔最久的 反而是dropout, softmax,mask ![image](https://hackmd.io/_uploads/SJcv44f1ge.png) ▪ **2.2 Memory** 主要都放在 CPU, 要計算時才放到 GPU ▪ **2.3 Performance** H100上 不同方法實作的速度 ### 3. Liger Kernel ![image](https://hackmd.io/_uploads/rJEd4Nzkll.png) `Liger: [音]賴ger` 是用 Triton 實作的加速套件 用法簡單直接改載入的方式即可 速度記憶體皆有優化 ## Part III. Quantization Quantization 僅用在 inference ### 1. Lossy compression ![image](https://hackmd.io/_uploads/ryGF4EMJxg.png) 壓縮後再還原, 用壓縮過後的儲存, 要計算時再還原 常見的演算法: GGML family,... Q8: 指把每個tensor壓到8 bit儲存 ## Take away You may need packages like DeepSpeed, Flash Attention, or Liger Kernel to train LLM with multiple gpus and limited memory. ### Recommended Reading - https://huggingface.co/spaces/nanotron/ultrascale-playbook - https://huggingface.co/docs/transformers/deepspeed -- END --