20251108筆記 內容可能有錯誤,請參考原始影片 [李宏毅【生成式AI時代下的機器學習(2025)】](https://www.youtube.com/playlist?list=PLJV_el3uVTsNZEFAdQsDeOdzAaHTca2Gi) [【生成式AI時代下的機器學習(2025)】助教課:利用多張GPU訓練大型語言模型—從零開始介紹DeepSpeed、Liger Kernel、Flash Attention及Quantization](https://www.youtube.com/watch?v=mpuRca2UZtI&list=PLJV_el3uVTsNZEFAdQsDeOdzAaHTca2Gi&index=6) ### 【生成式AI時代下的機器學習(2025)】助教課:利用多張GPU訓練大型語言模型—從零開始介紹DeepSpeed、Liger Kernel、Flash Attention及Quantization 大綱 今天助教課主要探討在生成式 AI 時代,訓練大型語言模型 (LLMs) 所面臨的硬體和軟體挑戰,並介紹用於解決這些挑戰的四個核心工具:DeepSpeed、Flash Attention、Liger Kernel 與 Quantization。 **I. 訓練 LLMs 的核心挑戰:記憶體限制** * **問題概述:** LLM 模型權重、梯度、優化器狀態與 activations 佔用過多 GPU 記憶體。 * **解決方案面向:** 針對參數/梯度/優化器狀態 (Part 1) 和 Activations (Part 2) 進行優化,並討論推論時的量化 (Part 3)。 **II. Part 1:優化參數、梯度與優化器狀態 (DeepSpeed/Zero)** * **核心工具:** DeepSpeed (Zero Redundancy Optimizer)。 * **Zero 策略:** 通過將模型狀態切分到多張 GPU 上實現平行運算。 * Zero 1:切分 Optimizer States (佔用空間最大)。 * Zero 2:切分 Optimizer States + Gradients。 * Zero 3:切分所有模型狀態 (Optimizer, Gradients, Parameters)。 * **額外技術:** 使用 CPU RAM 進行 Offload (但傳輸速度慢)。 **III. Part 2:優化 Activations 記憶體 (Liger Kernel & Flash Attention)** * **核心挑戰:** 長輸入序列導致 Attention activations 佔用 $N^2$ 級別的記憶體。 * **通用技術:** Activation Recomputation (Gradient Checkpointing)。 * **加速技術 (Kernel Optimization):** * Flash Attention:透過重寫 Attention 運算的核心功能 (Fused Kernel) 來加速計算並減少記憶體使用。 * Liger Kernel:使用 Triton 實作的 Kernel 函式,用於加速 LLM 常用運算並節省記憶體。 **IV. Part 3:量化技術 (Quantization)** * **目的:** 通過有損壓縮 (Lossy Compression) 減少模型儲存時所需的位元數 (如從 32-bit 降至 8-bit 或 4-bit),主要用於推論 (Inference)。 --- ### I. 訓練 LLMs 的核心挑戰:記憶體與資源 (The Challenges) #### A. 訓練 LLM 的困難點:巨大的記憶體需求 訓練 LLM 困難的主因是模型本身太大。 1. **記憶體佔用計算 (以 8B 模型為例):** * 假設訓練一個 8 億(8B)參數的模型。 * **權重 (Parameters):** 權重通常以 32-bit 浮點數儲存。8B 參數 $\times$ 32 bit (4 bytes) = **32 GB**。 * **FP16 權重 (訓練用):** 由於 NVIDIA GPU 對 16-bit 格式有加速,訓練時通常會轉為 FP16 格式,儲存空間減半。 * **梯度 (Gradients):** 每個權重都有一個梯度,與 LM 權重大小一樣,約 **32 GB**。 * **Optimizer States (Adam):** Adam 優化器要求每個權重儲存一個 momentum (m) 和一個 variance (v)。這兩個狀態都以 FP32 儲存,因此需要 2 倍的 32 GB,約 **64 GB**。 * **總計(非 Activations 部分):** 權重 (32G, FP32) + 梯度 (32G) + Optimizer States (64G) $\approx$ **128 GB**。 * 此 128 GB 已超過目前幾乎所有單張 GPU 的儲存容量。 2. **Activation 帶來的挑戰:長度與 $N^2$ 複雜度** * Activation 是模型每一層對輸入產生的反應(輸出),在 Back Propagation 時需要儲存。 * Attention 機制的 Activation 佔用空間最大,因為它計算序列間的方形矩陣,空間複雜度從 $O(N)$ 變成 $O(N^2)$(N 是輸入序列長度)。 * 對於 8B 模型,當輸入長度達到 32k tokens 時,Attention 的 Activation 佔用空間可達到 **1.35 TB** 這麼誇張的數字。 * 在訓練長輸入 (例如 16k 或更長) 的模型時,Activation 是限制記憶體的主要因素。 3. **Batch Size 的要求:** * 訓練 LLM 需要非常穩定的梯度,因此要求 Batch Size 必須很大,通常需要 4 到 60 個 Million tokens。 * 例如,訓練 32k context 時,Batch Size 可能需要 1920,總共約 61M tokens。 #### B. 解決 Batch Size 挑戰的技術 * **梯度累積 (Gradient Accumulation):** 當無法使用足夠大的 Batch Size 時,可將 Global Batch Size 切分成若干 Mini Batch。 * GPU 每次只處理 Mini Batch,計算梯度但不更新模型,直到累積到足夠的 Mini Batch 數量後,才統一進行一次 Optimizer 更新。 ### II. Part 1:優化參數、梯度與優化器狀態 (DeepSpeed/Zero) Part 1 旨在優化模型參數、梯度和 Optimizer States 等(圖表中橘色 Activation 以外的部分)所需的記憶體。 #### A. DeepSpeed 與 Zero 演算法 DeepSpeed 是由 Microsoft 開發的軟體套件,主要用於發揮多張 GPU 的平行運算能力。其核心技術是 **Zero Redundancy Optimizer (Zero)**。Zero 的精神是將訓練所需的組件(128GB 的模型狀態)切成小片,分裝到多張 GPU 中。 Zero 演算法依據節省的記憶體量分為三個等級: | Level | 切分內容 (Partitioned Components) | 節省記憶體 | 傳輸 overhead | 選擇依據 | | :---: | :---: | :---: | :---: | :---: | | **Zero 1** | Optimizer States (佔用 64G) | 最大 | 較少 | Optimizer 雖然大但使用頻率低(只在 Global Step 更新時才用到)。 | | **Zero 2** | Optimizer States + Gradients (32G) | 更多 | 增加 (中) | | | **Zero 3** | 所有模型狀態 (Parameters + Gradients + Optimizer States) | 最多 | 增加 (高) | 能夠將訓練大小切到最小。| * **平行化考量:** 一旦將模型狀態切分,GPU 之間就會產生額外的傳輸 (transfer) overhead。 * **傳輸速度:** NVIDIA GPU 使用 NVLink 技術,傳輸速度可達每秒 900 GB,速度非常快。DeepSpeed 還會針對傳輸進行排程 (scheduling),盡量避免延遲訓練。 * **實例效果:** 使用 Zero 3,即使是 80GB VRAM 的 H100 也能夠訓練 16k 長度的 8B 模型。 #### B. CPU Offload 技術 如果 GPU 記憶體真的很小,連 Zero 切分後都裝不下,可以將一部分訓練組件搬到 CPU 的 RAM 中儲存。 1. **Optimizer Offload:** 將與 Optimizer 相關的組件搬到 CPU。GPU 上只保留 LLM 的權重。 2. **Parameter Offload:** 甚至將模型權重也放到 CPU。 3. **缺點:** CPU 與 GPU 之間的傳輸速度比 GPU 之間的速度慢一個數量級。 * 實測顯示,使用 Offload (V100, B=1, 長度 512) 進行一個 Step 需要 74 秒,速度極慢。 * **結論:** 除非目標是做極大模型的實驗,否則不建議使用 Offload 技術,因為它會讓訓練變慢十倍以上。 ### III. Part 2:優化 Activations 記憶體 (Liger Kernel & Flash Attention) Part 2 專注於解決長 Context 訓練時 Activation 佔用記憶體過大的問題。 #### A. Activation Recomputation / Gradient Checkpointing 這是一種解決 Activation 記憶體問題的直觀方法。 * **原理:** 在 Forward Pass 時,只儲存少量必要的 Activation。 * 在 Backward Pass 需要時,再逐層重新計算所需的 Activation。 * **代價:** 雖然節省了極大的儲存空間,但會增加計算 (computation) overhead,導致訓練速度稍微變慢。 #### B. Kernel Optimization 基礎 由於 Attention 運算在 GPU 上執行,優化方式是重寫 Attention 實作的程式碼 (Kernel) 讓它跑得更快。 * **Kernel 的定義:** 跑在 GPU 上的 Function。 * **Kernel 開發工具 (從高階到低階):** 1. **PyTorch:** 方便但相對較慢。 2. **Torch Compile:** PyTorch 的 decorator,能無痛加速程式碼,它會編譯計算圖 (graph) 並做記憶體調度和預取 (prefetch)。 3. **Triton:** OpenAI 開發的 Python 介面,可用 Python 寫 CUDA 函式,比 PyTorch 靈活。 4. **CUDA:** NVIDIA 開發的 C/C++ 套件,最低階,速度最快,但學習曲線較陡峭。 #### C. Flash Attention Flash Attention 的目標是加速 Attention 的計算,同時使用更少的記憶體。 1. **加速原理 (Fused Kernel):** * 標準 Attention 涉及矩陣乘法、Scale、Softmax 等四五個複雜函式。 * Flash Attention 將這些複雜操作壓成一個單一的 Kernel 函式(稱為 **Fused Kernel**)。 * 實務上,GPU 對矩陣乘法已做特殊加速,反而是 Softmax 或 Masking 等運算耗時較長。Fused Kernel 針對這些環節進行優化。 * **結果:** 計算速度大幅提升,尤其在長 Context 下比 CUDA 實作的 Attention 更快。 2. **記憶體優化原理:** * Flash Attention 透過將大部分資料(如 QKV 矩陣)先放於 CPU RAM (或速度較慢的記憶體),只在需要計算時將其 Flash 到 GPU 上運算,藉此大幅降低記憶體需求,達到接近線性的記憶體空間。 #### D. Liger Kernel Liger Kernel 是一套使用 Triton 實作的 Kernel 集合,用於封裝 LLM 運算中常用的功能。 * **特點:** 它可以讓 LLM 算得更快,且使用更少的記憶體。 * **使用方式:** 載入模型時,只需將 `AutoModelForCausalLM` 替換為 `AutoLigerKernelForCausalLM` 即可。 * **效益:** 不論在速度還是記憶體使用上,Liger Kernel 都有顯著的優勢,允許訓練更長的 Context 模型。 ### IV. Part 3:量化技術 (Quantization) 量化 (Quantization) 是一種有損壓縮 (lossy compression) 技術。 * **目的:** 將模型權重儲存的浮點數精度降低。 * **方法:** 將 32-bit 的資料壓縮成 8-bit、4-bit,甚至 1-bit。 * **機制:** 壓縮後的 Tensor 儲存空間較小,需要計算時再還原 (Dequantization)。 * **應用場景:** Quantization 主要用於**推論** (Inference),以減少模型載入記憶體時的空間需求。 * **實例:** 在 Colab 上,免費 GPU (T4, 15GB VRAM) 可載入 8B 參數的模型。這通常是通過 GGML 家族的 Quantization 演算法實現的,例如 Q8 (8-bit 量化),只需約 8GB 記憶體即可載入 8B 模型。 ### V. 總結與建議 * 訓練 LLM 需要大量的 GPU 記憶體,但透過 DeepSpeed (Zero)、Flash Attention 和 Liger Kernel 等開源工具,可以有效將模型塞入並進行訓練。 * **DeepSpeed 建議:** 官方 API 較難使用,建議透過 Hugging Face `transformer` 的 Trainer 介面,使用 JSON 檔案來開啟 DeepSpeed 的功能。 * **CPU Offload 警告:** 雖然 Offload 可以讓極大的模型在有限的 GPU 資源下訓練,但由於 GPU 與 CPU 之間的傳輸速度太慢,會極大地拖慢訓練速度,實際實驗中並不實用。
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.