日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文導論部署 LLaMa 系列模型常用的幾種方案,并作速度測試。包括 Huggingface 自帶的 LLM.int8(),AutoGPTQ, GPTQ-for-LLaMa, exllama, llama.cpp。

總結來看,對 7B 級別的 LLaMa 系列模型,經過 GPTQ 量化后,在 4090 上可以達到 140+ tokens/s 的推理速度。在 3070 上可以達到 40 tokens/s 的推理速度。

LM.int8()

來自論文:LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

LM.int8() 時 Hugingface 集成的量化策略。能夠通過在 .from_pretrAIn() 時候傳遞 load_in_8bit 來實現,針對幾乎所有的 HF Transformers 模型都有效。大致方法是,在矩陣點積計算過程中, 將其中的 outliers 參數找出來(以行或列為單位),然后用類似 absolute maximum (absmax) quantization 的方法,根據行/列對 Regular 參數做量化處理,outlier 參數仍然做 fp16 計算,最后相加。

 

根據 huggingface 的博客 (
https://huggingface.co/blog/hf-bitsandbytes-integration), LLM.INT8() 能夠再模型性能不影響很多的前提下,讓我們能用更少的資源進行 LLM 推理。但 LLM.int8() 普遍的推理速度會比 fp16 慢。博客中指出,對于越小的模型, int8() 會導致更慢的速度。

結合論文中的實驗結果,模型越大,int8() 加速越明顯,個人猜測是由于非 outlier 數量變多了,更多的參數進行了 int8 計算,抵消了額外的量化轉化時間開銷?

 

GPTQ

GPTQ: ACCURATE POST-TRAINING QUANTIZATION FOR GENERATIVE PRE-TRAINED TRANSFORMERS

使用 GPTQ 量化的模型具有很大的速度優勢,與 LLM.int8() 不同,GPTQ 要求對模型進行 post-training quantization,來得到量化權重。GPTQ 主要參考了 Optimal Brain Quanization (OBQ),對OBQ 方法進行了提速改進。有網友在 文章 中對 GPTQ, OBQ, OBS 等量化策略進行了整理,這里就不多贅述了。

以下對幾個 GPTQ 倉庫進行介紹。以下所有測試均在 4090 上進行,模型推理速度采用
oobabooga/text-generation-webui (https://Github.com/oobabooga/text-generation-webui) 提供的 UI。

GPTQ-for-LLaMa

專門針對 LLaMa 提供 GPTQ 量化方案的倉庫,如果考慮 GPU 部署 LLaMa 模型的話,GPTQ-for-LLaMa 是十分指的參考的一個工具。像 http://huggingface.co 上的 Thebloke 很大部分模型都是采用 GPTQ-for-LLaMa 進行量化的。

Post Training Quantization:GPTQ-for-LLaMa 默認采用 C4 (
https://huggingface.co/datasets/allenai/c4) 數據集進行量化訓練(只采用了 C4 中英文數據的一部分進行量化,而非全部 9TB+的數據):

CUDA_VISIBLE_DEVICES=0 Python/ target=_blank class=infotextkey>Python llama.py /models/vicuna-7b c4 
    --wbits 4 
    --true-sequential 
    --groupsize 128 
    --save_safetensors vicuna7b-gptq-4bit-128g.safetensors

由于 GPTQ 是 Layer-Wise Quantization,因此進行量化時對內存和顯存要求會少一點。在 4090 測試,最高峰顯存占用 7000MiB,整個 GPTQ 量化過程需要 10 分鐘。量化后進行 PPL 測試,7b 在沒有 arc_order 量化下,c4 的 ppl 大概會在 5-6 左右:

CUDA_VISIBLE_DEVICES=0 python llama.py /models/vicuna-7b c4 
    --wbits 4 
    --groupsize 128 
    --load vicuna7b-gptq-4bit-128g.safetensors 
    --benchmark 2048 --check

對量化模型在 MMLU 任務上測試(
https://github.com/FranxYao/chain-of-thought-hub/tree/main),量化后 MMLU 為,于 fp16(46.1)稍微有點差距。

Huggingface 上的 TheBloke (
https://huggingface.co/TheBloke) 發布的大部分 LLaMa GPTQ 模型,都是通過以上方式(C4 數據集 + wbit 4 + group 128 + no arc_order + true-sequential)量化的。若由于 GPTQ-for-LLaMa 及 transformers 倉庫不斷更新,Huggingface.co 上發布的模型可能存在無法加載或精度誤差等問題,可以考慮重新量化,并通過優化量化數據集、添加 arc_order 等操作來提高量化精度。

GPTQ-for-LLaMa 的一些坑:

  • 模型加載問題:使用 gptq-for-llama 時,因 transformer 版本不同,可能出現模型加載不上問題。如加載 TheBloke/Wizard-Vicuna-30B-Uncensored-GPTQ(https://huggingface.co/TheBloke/Wizard-Vicuna-30B-Uncensored-GPTQ/discussions/5) 時,用最新版的 GPTQ-for-LLaMa 就會出現權重于模型 registry 名稱不匹配的情況。
  • left-padding 問題:目前 GPTQ-for-LLaMa 的所有分支(triton, old-cuda 或 fastest-inference-int4)都存在該問題。如果模型對存在 left-padding 的輸入進行預測時候,輸出結果是混亂的。這導致了 GPTQ-for-LLaMa 目前無法支持正確的 batch inference。
    • 經過測試,問題存在于 llama.py 中的 quant.make_quant_attn(model)。使用 quant_attn 能夠極大提升模型推理速度。參考這個歷史 ISSUE,估計是 position_id 的推理 cache 在 Attention layer 中的配置存在了問題。left-padding issue(https://github.com/qwopqwop200/GPTQ-for-LLaMa/issues/89)
  • GPTQ-for-LLaMa 版本變動大,如果其他倉庫有使用 GPTQ-for-LLaMa 依賴的話,需要認真檢查以下版本。如 obbabooga fork 了一個單獨的 GPTQ-for-LLaMa 為 oobabooga/text-generation-webui 做支持。最新版的 GPTQ-for-LLaMa 在 text-generation-webui 中使用會有 BUG。

AutoGPTQ

AutoGPTQ 使用起來相對容易,它提供了對大多數 Huggingface LLM 模型的量化方案,如 LLaMa 架構系列模型,bloom,moss,falcon,gpt_bigcode 等。(沒在支持表中看到 ChatGLM 系列模型)。具體可以參考 官方的快速上手(
https://github.com/PanQiWei/AutoGPTQ/blob/main/docs/tutorial/01-Quick-Start.md) 和 進階使用(https://github.com/PanQiWei/AutoGPTQ/blob/main/docs/tutorial/02-Advanced-Model-Loading-and-Best-Practice.md) 來進行量化模型訓練和部署。

AutoGPTQ 可以直接加載 GPTQ-for-LLaMa 的量化模型:

from auto_gptq import AutoGPTQForCausalLM

model = AutoGPTQForCausalLM.from_quantized(
    model_dir,     # 存放模型的文件路徑,里面包含 config.json, tokenizer.json 等模型配置文件
    model_basename="vicuna7b-gptq-4bit-128g.safetensors",
    use_safetensors=True,
    device="cuda:0",
    use_triton=True,    # Batch inference 時候開啟 triton 更快
    max_memory = {0: "20GIB", "cpu": "20GIB"}    # 
)

AutoGPTQ 提供了更多的量化加載選項,如是否采用 fused_attention,配置 CPU offload 等。用 AutoGPTQ 加載權重會省去很多不必要的麻煩,如 AutoGPTQ 并沒有 GPTQ-for-LLaMa 類似的 left-padding bug,對 Huggingface 其他 LLM 模型的兼容性更好。因此如果做 GPTQ-INT4 batch inference 的話,AutoGPTQ 會是首選。

但對于 LLaMa 系列模型,AutoGPTQ 的速度會明顯慢于 GPTQ-for-LLaMa。在 4090 上測試,GPTQ-for-LLaMa 的推理速度會塊差不多 30%。

exllama

exllama 為了讓 LLaMa 的 GPTQ 系列模型在 4090/3090 Ti 顯卡上跑更快,推理平均能達到 140+ tokens/s。當然為了實現那么高的性能加速,exllama 中的模型移除了 HF transformers 模型的大部分依賴,這也導致如果在項目中使用 exllama 模型需要額外的適配工作。text-generation-webui 中對 exllama 進行了 HF 適配,使得我們能夠像使用 HF 模型一樣使用 exllama,代價是犧牲了一些性能,參考 exllama_hf。

gptq

GPTQ 的官方倉庫。以上大部分倉庫都是基于官方倉庫開發的,感謝 GPTQ 的開源,讓單卡 24G 顯存也能跑上 33B 的大模型。

GGML

GGML 是一個機械學習架構,使用 C 編寫,支持 Integer quantization(4-bit, 5-bit, 8-bit) 以及 16-bit float。同時也對部分硬件架構進行了加速優化。本章中討論到的 LLaMa 量化加速方案來源于 LLaMa.cpp 。LLaMa.cpp 有很多周邊產品,如 llama-cpp-python 等,在下文中,我們以 GGML 稱呼這類模型量化方案。

llama.cpp 在一個月前支持了全面 GPU 加速(在推理的時候,可以把整個模型放在 GPU 上推理)。參考后文的測試,LLaMa.cpp 比 AutoGPTQ 有更快的推理速度,但是還是比 exllama 慢很多。

GGML 有不同的量化策略(具體量化類型參考(
https://github.com/ggerganov/llama.cpp%23quantization)),以下使用 Q4_0 對 LLaMa-2-13B-chat-hf 進行量化和測試。

此處采用 Docker with cuda 部署,為方便自定義,先注釋掉
.devops/full-cuda.Dockerfile 中的 EntryPoint。而后構建鏡像:

docker build -t local/llama.cpp:full-cuda -f .devops/full-cuda.Dockerfile .

構建成功后開啟容器(models 映射到模型文件路徑):

docker run -it --name ggml --gpus all -p 8080:8080 -v /home/kevin/models:/models local/llama.cpp:full-cuda bash

參考官方文檔 (
https://github.com/ggerganov/llama.cpp%23prepare-data--run),進行權重轉換即量化:

# 轉換 ggml 權重
python3 convert.py /models/Llama-2-13b-chat-hf/

# 量化
./quantize /models/Llama-2-13b-chat-hf/ggml-model-f16.bin /models/Llama-2-13b-chat-GGML_q4_0/ggml-model-q4_0.bin q4_0

完成后開啟server 測試

./server -m /models/Llama-2-13b-chat-GGML_q4_0/ggml-model-q4_0.bin --host 0.0.0.0 --ctx-size 2048 --n-gpu-layers 128

發送請求測試:

curl --request POST 
    --url http://localhost:8080/completion 
    --header "Content-Type: Application/json" 
    --data '{"prompt": "Once a upon time,","n_predict": 200}'

使用 llama.cpp server 時,具體參數解釋參考官方文檔(
https://github.com/ggerganov/llama.cpp/blob/master/examples/server/README.md)。主要參數有:

  • --ctx-size: 上下文長度。
  • --n-gpu-layers:在 GPU 上放多少模型 layer,我們選擇將整個模型放在 GPU 上。
  • --batch-size:處理 prompt 時候的 batch size。

使用 llama.cpp 部署的請求,速度與 llama-cpp-python 差不多。對于上述例子中,發送 Once a upon time, 并返回 200 個字符,兩者完成時間都在 2400 ms 左右(約 80 tokens/秒)。

推理部署

記得在bert 時代,部署 Pytorch 模型時可能會考慮一些方面,比如動態圖轉靜態圖,將模型導出到 onnx,torch jit 等,混合精度推理,量化,剪枝,蒸餾等。對于這些推理加速方案,我們可能需要自己手動應用到訓練好的模型上。但在 LLaMa 時代,感受到最大的變化就是,一些開源的框架似乎為你做好了一切,只需要把你訓練好的模型權重放上去就能實現比 HF 模型快 n 倍的推理速度。

以下對比這些推理加速方案:HF 官方 float16(基線), vllm,llm.int8(),GPTQ-for-LLaMa,AUTOGPTQ,exllama, llama.cpp。

Model_nametooltokens/svicuna 7bfloat1643.27vicuna 7bload-in-8bit (HF)19.21vicuna 7bload-in-4bit (HF)28.25vicuna7b-gptq-4bit-128gAUTOGPTQ79.8vicuna7b-gptq-4bit-128gGPTQ-for-LLaMa80.0vicuna7b-gptq-4bit-128gexllama143.0Llama-2-7B-Chat-GGML (q4_0)llama.cpp111.25Llama-2-13B-Chat-GGML (q4_0)llama.cpp72.69Wizard-Vicuna-13B-GPTQexllama90Wizard-Vicuna-30B-uncensored-GPTQexllama43.1Wizard-Vicuna-30B-uncensored-GGML (q4_0)llama.cpp34.03Wizard-Vicuna-30B-uncensored-GPTQAUTOGPTQ31

以上所有測試均在 4090 + Inter i9-13900K上進行,模型推理速度采用
oobabooga/text-generation-webui 提供的 UI(text-generation-webui 的推理速度會比實際 API 部署慢一點)。這邊只做速度測試,關于精度測試,可以查看 GPT-for-LLaMa result (https://github.com/qwopqwop200/GPTQ-for-LLaMa%23result) 和 exllama results(https://github.com/turboderp/exllama/tree/master%23new-implementation)。

一些備注

  1. 模型推理的速度受 GPU 即 CPU 的影響最大。有網友指出 link,同樣對于 4090,在 CPU 不同的情況下,7B LLaMa fp16 快的時候有 50 tokens/s,慢的時候能達到 23 tokens/s。
  2. 對于 stable diffusion,torch cuda118 能比 torch cuda 117 速度快上1倍。但對于 LLaMa 來說,cuda 117 和 118 差別不大。
  3. 量化 batch inference 首選 AUTOGPTQ (TRITON),盡管 AutoGPTQ 速度慢點,但目前版本的 GPTQ-for-LLaMa 存在 left-padding 問題,無法使用 batch inference;batch size = 1 時,首選 exllama 或者 GPTQ-for-LLaMa。
  4. vllm 部署 fp16 的模型速度也不錯(80+ tokens/s),同時也做了內存優化;如果設備資源夠的話,可以考慮下 vllm,畢竟采用 GPTQ 還是有一點精度偏差的。
  5. TheBloke 早期發布的一些模型可能無法加載到 exllama 當中,可以使用最新版本的 GPTQ-for-LLaMa 訓練一個新模型。
  6. 當顯卡容量無法加載整個模型時(比如在單卡 4090 上加載 llama-2-70B-chat),llama.cpp 比 GPTQ 速度更快(參考:https://www.reddit.com/r/LocalLLaMA/comments/147z6as/llamacpp_just_got_full_cuda_acceleration_and_now/?rdt=56220)。

分享到:
標簽:LLaMa
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定