最近在做文本風格轉化,涉及千萬token級別的文本。想用大模型轉寫,在線的模型一來涉及數據隱私,二來又不想先墊錢再找報銷。本地的7-9B小模型又感覺效果有限,正好實驗室給俺配了4卡3090的機子,反正也就是做個推理,也不訓練不微調,就想試試本地72B大模型能不能跑起來。
先上結論:
- 模型:Qwen-72B-Chat-Int4
- 使用2張3090 24G就能跑起來,但是上下文長度在一千漢字左右就會爆顯存OOM
- 使用4張3090 24G也可以跑,上下文長度可以拓展到萬字級別
- 速度:短上下文約10字/s,勉強夠用:
下面講講怎么做的:
?首先,有博主做了雙卡3090部署Qwen2-72B-Int4的教程:
大模型筆記之-Qwen72B-chat-int4部署 |使用雙卡3090成功運行_運行qwen-72b-CSDN博客
筆者也是看著該教程跑起來的,但是完全按照該教程會出現很多的問題:比如剛跑起來的時候,推理速度非常慢,大約1token/s,官方文檔里面同樣模型用A100能做到11.32token/s,完全沒道理的。
整體流程:
1. 下載模型
從魔搭社區下載,不需要梯子
from modelscope.hub.snapshot_download import snapshot_downloadmodel_dir = snapshot_download('qwen/Qwen-72B-Chat-Int4')# 在當前目錄下創建一個名為model_dir的txt文件,里面包含model_dir變量的內容
with open('model_dir.txt', 'w') as f:f.write(model_dir)
2. 配置環境
筆者cuda driver版本(通過nvidia-smi查看)是12.0,使用cuda runtime版本(通過nvcc -V查看)也應為12.0/12.1,否則后面源碼編譯flash-attention時會報ptxas版本錯誤:(以前都是runtime<=driver就行了,現在終于碰見一種情況必須==了)
ptxas *.ptx, line 9; Fatal : Unsupported .version 8.0; current version is ‘7.1’ ptxas fatal
2.1. 基礎conda環境
conda安裝:
python==3.10
pytorch==2.1.0
pytorch-cuda==12.1
由于conda里面 cuda toolkit / cuda runtime 沒有 12.0版本(conda search cudatoolkit最高11.8),所以還得源碼編譯,但是實驗室的服務器咱也沒有root權限,所以參考這篇文章中修改路徑的做法:不用sudo權限安裝cuda10.1_非sudo用戶安裝cuda-CSDN博客
2.2. Qwen pip依賴
接著就是安裝Qwen需要的pip依賴,首先下載Qwen git倉庫
git clone https://github.com/QwenLM/Qwen.git
安裝pip依賴:
#1.切換至項目目錄下
cd Qwen#2.安裝項目依賴
pip install -r requirements.txt
#使用鏡像源加速 pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/#3.使用web_demo.py 還需要安裝web依賴
pip install -r requirements_web_demo.txt
2.3. 安裝量化模塊auto-gptq
因為我們用Int4量化版本,所以需要安裝auto-gptq量化包。在官方指南中,直接使用了pip安裝,事后筆者發現這樣安裝會出現嚴重問題(事實上,這樣子做可能會讓推理速度降至1/10,而且還很難排查),在此我們先給出完美方案(參考Auto-GBTQ源碼編譯):
git clone https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ
pip install numpy gekko pandas
# 有點小久
pip install -vvv --no-build-isolation -e .
2.4. 安裝flash-attention(可選)
flash-attention據悉可以加速模型加載和推理,筆者自己感覺沒什么區別。
注意要安裝的話需要將cuda runtime(nvcc -V)和cuda driver(nvidia-smi)的版本對齊。
git clone https://github.com/Dao-AILab/flash-attention
cd flash-attention && pip install .
# 下方安裝可選,安裝可能比較緩慢。
# pip install csrc/layer_norm
# 如果flash-attn版本高于2.1.1,下方無需安裝。
# pip install csrc/rotary
3. 運行
Qwen git repo中cli_demo和web_demo均可運行
3.1.?修改DEFAULT_CKPT_PATH
修改DEFAULT_CKPT_PATH為前文1.中model_dir(cli_demo 19行,web_demo 18行)
3.2.?修改device_map為多卡配置
(cli_demo 52行,web_demo 48行):
?2卡參考大模型筆記之-Qwen72B-chat-int4部署 |使用雙卡3090成功運行_運行qwen-72b-CSDN博客
4卡:
# 偏向于少分配給卡0,因為在推理時卡0需要承擔高負載
device_map = {'transformer.wte': 0, 'transformer.drop': 0, 'transformer.rotary_emb': 0, 'transformer.h.0': 0,'transformer.h.1': 0, 'transformer.h.2': 0, 'transformer.h.3': 0, 'transformer.h.4': 0,'transformer.h.5': 0, 'transformer.h.6': 0, 'transformer.h.7': 0, 'transformer.h.8': 0,'transformer.h.9': 1, 'transformer.h.10': 1, 'transformer.h.11': 1, 'transformer.h.12': 1,'transformer.h.13': 1, 'transformer.h.14': 1, 'transformer.h.15': 1, 'transformer.h.16': 1,'transformer.h.17': 1, 'transformer.h.18': 1, 'transformer.h.19': 1, 'transformer.h.20': 1,'transformer.h.21': 1, 'transformer.h.22': 1, 'transformer.h.23': 1, 'transformer.h.24': 1,'transformer.h.25': 1, 'transformer.h.26': 1, 'transformer.h.27': 1, 'transformer.h.28': 1,'transformer.h.29': 1, 'transformer.h.30': 1, 'transformer.h.31': 1, 'transformer.h.32': 1,'transformer.h.33': 1, 'transformer.h.34': 1, 'transformer.h.35': 1, 'transformer.h.36': 2,'transformer.h.37': 2, 'transformer.h.38': 2, 'transformer.h.39': 2, 'transformer.h.40': 2,'transformer.h.41': 2, 'transformer.h.42': 2, 'transformer.h.43': 2, 'transformer.h.44': 2,'transformer.h.45': 2, 'transformer.h.46': 2, 'transformer.h.47': 2, 'transformer.h.48': 2,'transformer.h.49': 2, 'transformer.h.50': 2, 'transformer.h.51': 2, 'transformer.h.52': 2,'transformer.h.53': 2, 'transformer.h.54': 2, 'transformer.h.55': 2, 'transformer.h.56': 2,'transformer.h.57': 2, 'transformer.h.58': 2, 'transformer.h.59': 2, 'transformer.h.60': 2,'transformer.h.61': 3, 'transformer.h.62': 3, 'transformer.h.63': 3, 'transformer.h.64': 3,'transformer.h.65': 3, 'transformer.h.66': 3, 'transformer.h.67': 3, 'transformer.h.68': 3,'transformer.h.69': 3, 'transformer.h.70': 3, 'transformer.h.71': 3, 'transformer.h.72': 3,'transformer.h.73': 3, 'transformer.h.74': 3, 'transformer.h.75': 3, 'transformer.h.76': 3,'transformer.h.77': 3, 'transformer.h.78': 3, 'transformer.h.79': 3, 'transformer.ln_f': 3,'lm_head': 3}# 也可以用這個
device_map = 'balanced_low_0'
靜態負載:
3.3. 修改模型加載方式為AutoGPTQ
web_demo 50-55行
cli_demo 54-59行
model = AutoGPTQForCausalLM.from_quantized(args.checkpoint_path,device_map=device_map,trust_remote_code=True,resume_download=True,# use_marlin=True,).eval()
如果用的是gptq v7.0,會讓你用use_marlin:
INFO - You passed a model that is compatible with the Marlin int4*fp16 GPTQ kernel but use_marlin is False. We recommend using `use_marlin=True` to use the optimized Marlin kernels for inference. Example: `model = AutoGPTQForCausalLM.from_quantized(..., use_marlin=True)`.
但是不知道為什么,用了就報錯,所以我注釋掉了。
加載模型速度對比:
# 加載模型612.5322902202606s
model = AutoGPTQForCausalLM.from_quantized(args.checkpoint_path,device_map=device_map,trust_remote_code=True,resume_download=True,use_marlin=False,).eval()# 加載模型612s
model = AutoModelForCausalLM.from_pretrained(args.checkpoint_path,device_map=device_map,trust_remote_code=True,resume_download=True,use_flash_attn=True).eval()
可以看出加載模型GPTQ快20%,官方文檔說GPTQ推理速度也快20%,沒實測,但顯然和上面的觀察結果一致。
3.4. 修改web_demo中的服務器地址,否則局域網無法訪問
33行,改IP為0.0.0.0
parser.add_argument("--server-name", type=str, default="0.0.0.0",help="Demo server name.")
4. 關于我是如何發現并把推理速度提升10倍的
最初按照官方文檔做完之后,雙卡/四卡3090推理速度在1token/s左右,是官方1張A100速度的10%,完全不符合邏輯。本來打算放棄了,突然看到官方文檔里有一句話說用AutoGPTQ加載能快20%,于是我就試了試AutoGPTQForCausalLM而不是AutoModelForCausalLM加載模型
model = AutoGPTQForCausalLM.from_quantized()
但是其中給了我警告(AutoModelForCausalLM沒有給過這個警告):
意思是我的auto-gptq包沒裝好,其中的Exllamav2沒有安裝,這會導致推理顯著變慢。
于是我按著gptq主頁:AutoGPTQ/AutoGPTQ: An easy-to-use LLMs quantization package with user-friendly apis, based on GPTQ algorithm. (github.com)的教程從源碼編譯裝好了,速度就拉滿了。
現在3090多卡速度(10token/s)和官方單張A100速度(10token/s)接近,可以看出其實卡間通訊其實并不是瓶頸。