iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
生成式 AI

Local LLM infra & Inference 一部曲系列 第 16

Day16 - 模型壓縮之如何玩弄模型PART1:量化

  • 分享至 

  • xImage
  •  

前言

這一章開始進入 模型/參數層面最佳化 (Model-level / Parameter-Level Optimization) 的技術介紹,這邊主要是介紹一些模型壓縮的技術,像是量化 🔢、蒸餾 💧、剪枝 ✂️、稀疏化 🌾等等。

可以對一個模型做這麼多事情,跟壓榨硬體一樣好玩,想想就豪開心(?)

因為量化模型在實作中比較常被使用到,所以與其他的壓縮技術分開來講。

相信大家對量化過後的模型都有一些概念了,像是熟悉的GGUF、AWQ模型。量化就是犧牲一些模型的accuracy 📉,但可以將模型的weights或activations從高精度轉換成低一點的精度,讓模型可以在更小的硬體設備上被執行 💻。

關於LLM模型常用的精度,如果忘記了可以回頭參考Day3

https://ithelp.ithome.com.tw/upload/images/20240916/20168115Do6E1Fa6Ni.jpg
(圖源: medium)


🔍 量化哪些地方呢?

同樣在 Day3 時提到過LLM在推理的兩個階段各自的問題,能被量化的地方也分成了兩種,可以在不同地方被應用:

  • Weight-Activation Quantization

    • 將模型的weightsactivations同時量化,適合在Prefilling Stage使用,加快計算的速度。
  • Weight-Only Quantization

    • 只針對模型的weights進行量化,適合在Decoding Stage使用,減少記憶體讀取時間。

光是這樣看可能不太懂 🤔,可能會想說不是只要下載好量化的模型就可以用了嗎?
讓我們往下看,提到例子的時候就會更了解它們了。


🛠️ Post-Training Quantization (PTQ)

PTQ是在模型訓練完成後進行的一種量化技術,在訓練完畢的模型上直接進行量化,而不需要重新訓練。但也因為量化是在訓練完成後才做的,模型精度可能會受到較大影響。

  • 🔢 weight-only quantization:

    • 我們從HuggingFace下載量化後的模型通常是這類型的!

      • 只要在HuggingFace上搜尋關鍵字就可以找到對應的量化模型。
      • https://ithelp.ithome.com.tw/upload/images/20240917/20168115xaI31Ezfdc.png
    • bitsandbytes - bitsandbytes 提供了8-bit低精度量化方法,整合在HuggingFace Transformers當中。使用時只需加上load_in_8bit=True,即可載入量化後的模型。它還支持進一步的量化技術,如後面會提到的QLoRA。

    • GPTQ (Quantized GPT) - GPTQ是針對大規模語言模型最早期的經典量化技術,GPTQ簡化的量化的順序,避免頻繁更新Hessian矩陣,降低量化的計算需求。

    • AWQ (Activation-Weighted Quantization) - AWQ根據模型中特定部分的重要性來進行量化,特別是對一些影響較大的權重進行精確處理,跟其他量化技術比起來,它在保持模型精度方面有一定的優勢。從它的github頁面可以看到它與未量化模型的速度比較。

    • SqueezeLLM - SqueezeLLM是一種創新的量化方式,透過Dense-and-Sparse Quantization方法將權重矩陣分為兩部分:一個是可以大量量化的密集部分(不影響模型性能),另一個是保留敏感和異常權重的稀疏部分。

    • GGUF / GGML (llama.cpp) - GGUF是Llama.cpp框架中引入的一種新的量化格式,GGUF是對先前的GGML的進一步優化,其中的q幾表示不同的量化方法,例如Q4_0Q4_1Q5_0Q8_0,這些方法根據權重量化的位數不同,平衡了精度和記憶體的使用。它們最特別的地方是能利用llama.cpp在只有CPU的電腦上做推理

https://ithelp.ithome.com.tw/upload/images/20240917/20168115DTY8xXt5QT.jpg
(圖源: 網路,一直都想放但沒機會放這張XD)

  • 🔄 weight-activation quantization:

    • 之前Offload章節提到的FlexGen將weight和KV Cache直接量化為INT4,以減少推理期間的記憶體佔用,也算是這一種方法!
    • vLLM也有支援類似的量化KV Cache到FP8的功能,讓整體推理速度更快速,請參考官方文件,需要先安裝FP8再設定kv_cache_dtype="fp8"

📚 Quantization-Aware Training (QAT)

QAT是在模型訓練過程中模擬量化效果的一種方法,讓模型在訓練時就學會適應量化後的誤差 🎯。在訓練過程中,模型的weight和activation被設定為低精度格式(如 INT8),使模型在訓練時就在於量化誤差之下,讓模型可以自動調整參數來適應低精度運算 🔧,使它在推理階段能夠更好地適應量化後的精度要求 ⚙️✨。

  • QLoRA (Quantized Low-Rank Adaptation)
    • QLoRA是一種基於PEFT(Parameter-Efficient Fine-Tuning)框架的技術,用於在QAT過程中進行Low-Rank Adaptation,能在不完全重新訓練整個模型的情況下,調整部分權重以適應量化。因此可以有效減少訓練成本,同時保留模型的性能。

打開HuggingFace搜尋發現有人做了臺灣證券交易所 💹的QLoRA版本XD
https://huggingface.co/DavidLanz/llama3_8b_taiwan_stock_qlora


章節總結

量化主要被分成了PTQ和QAT兩種。而現在有非常多種不同的量化方法,而一些知名且基礎的量化方法通常都已經被整合到大型的框架像是HuggingFace 🤗或vLLM 🚀當中了,這兩個連結點開來都是各自支持的量化類型表格 📊,當然最主要自己做量化還是要看自己的硬體設備有沒有支援,不過在一個應用角度而非自行量化的人來看,只要知道有哪些類型的量化模型就好了XD

看survey論文裡面還有提到很多其他的量化方法,像是OBQ、OWQ,放在一起超像是表情符號的ψ(`∇´)ψ

🔍 最後簡單總結一下量化技術:

  1. 犧牲一些精度 📉
  2. 減少記憶體消耗 💾
  3. 增加推理速度 ⚡

這張內容跟昨天比起來有點少,筆者只能多放幾張梗圖壓壓驚。

https://ithelp.ithome.com.tw/upload/images/20240917/201681154pgyCTsL3f.jpg
(圖源: x看我量化你的量化)


參考資料

A Survey on Efficient Inference for Large Language Models
https://arxiv.org/abs/2404.14294
一樣是GPT4o各種QA


上一篇
Day15 - 這次應該是壓榨讀者的腦袋:FlashAttention
下一篇
Day17 - 模型壓縮之如何玩弄模型PART2:蒸餾/剪枝/稀疏化
系列文
Local LLM infra & Inference 一部曲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言