第五節(jié)

LMDeploy 量化部署 LLM&VLM 實(shí)踐

一苔悦、理論基礎(chǔ)

大模型部署面臨的挑戰(zhàn):

  • 計(jì)算量巨大


  • 內(nèi)存開銷巨大


  • 訪存瓶頸:硬件計(jì)算速度遠(yuǎn)快于顯存帶寬

  • 動(dòng)態(tài)請(qǐng)求:請(qǐng)求量不確定蟋座,請(qǐng)求時(shí)間不確定诸狭,Token逐個(gè)生成驯遇,生成數(shù)量不確定双吆。

大模型部署方法

模型剪枝

知識(shí)蒸餾 Distillation


先訓(xùn)練一個(gè)參數(shù)量大的教師網(wǎng)絡(luò),再用它訓(xùn)練一個(gè)參數(shù)量較小的學(xué)生網(wǎng)絡(luò)。

量化


僅在存儲(chǔ)時(shí)量化降低精度,計(jì)算時(shí)還要進(jìn)行反量化

二淳蔼、運(yùn)行實(shí)戰(zhàn)

2.1 環(huán)境部署

安裝虛擬環(huán)境 lmdeploy


安裝成功!

隨后激活環(huán)境

2.2 LMDeploy 模型對(duì)話(chat)

  • HuggingFace:托管在 HuggingFace 社區(qū)的模型通常采用 HuggingFace 格式存儲(chǔ),簡(jiǎn)寫為HF格式泡仗。
  • 國(guó)內(nèi)的阿里巴巴 MindScope 社區(qū)與上海AILab的 OpenXLab社區(qū),上面托管的模型通常也是HF格式
  • TurboMind:LMDeploy 團(tuán)隊(duì)開發(fā)的一款關(guān)于LLM推理的高效引擎,僅支持 TurboMind 格式的模型。因此會(huì)自動(dòng)把HF 格式轉(zhuǎn)換為 TurboMind 格式
    • TurboMind與LMDeploy的關(guān)系:LMDeploy是涵蓋了LLM 任務(wù)全套輕量化颖系、部署和服務(wù)解決方案的集成功能包,TurboMind是LMDeploy的一個(gè)推理引擎,是一個(gè)子模塊不傅。LMDeploy也可以使用pytorch作為推理引擎。
    • TurboMind與TurboMind模型的關(guān)系:TurboMind是推理引擎的名字称龙,TurboMind模型是一種模型存儲(chǔ)格式,TurboMind引擎只能推理TurboMind格式的模型。
  1. 下載模型:使用軟拷貝,拷貝到根目錄


    模型
  2. 使用Transformer庫(kù)運(yùn)行模型
    編寫 pipeline_transoformer.py 文件
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加載分詞器
tokenizer = AutoTokenizer.from_pretrained("/root/internlm2-chat-1_8b", trust_remote_code=True)

# Set `torch_dtype=torch.float16` to load model in float16, otherwise it will be loaded as float32 and cause OOM Error.
# 加載模型,設(shè)置為評(píng)估模式
model = AutoModelForCausalLM.from_pretrained("/root/internlm2-chat-1_8b", torch_dtype=torch.float16, trust_remote_code=True).cuda()
model = model.eval()
# 用戶輸入文本"hello",通過model.chat函數(shù)使用模型和tokenizer生成回應(yīng)。
# 這里假設(shè)model.chat是一個(gè)擴(kuò)展或自定義的方法震檩,用于處理交互式聊天。
# history=[]表示當(dāng)前沒有歷史對(duì)話記錄霜旧。
inp = "hello"
print("[INPUT]", inp)
response, history = model.chat(tokenizer, inp, history=[])
print("[OUTPUT]", response)

inp = "please provide three suggestions about time management"
print("[INPUT]", inp)
response, history = model.chat(tokenizer, inp, history=history)
print("[OUTPUT]", response)

  1. 運(yùn)行代碼
python /root/pipeline_transformer.py
運(yùn)行結(jié)果

成功輸出回答,運(yùn)行時(shí)間兩分鐘掷倔。

  1. 使用 LMDeploy 與模型對(duì)話
lmdeploy chat /root/internlm2-chat-1_8b

加載模型成功,僅用時(shí)1分鐘

用它來(lái)講故事



答案輸出速度非常快

2.3 LMDeploy 模型量化(lite)

2.3.1 概念

量化是一種以參數(shù)或計(jì)算中間結(jié)果精度下降換取空間節(jié)省(以及同時(shí)帶來(lái)的性能提升)的策略。

  • 計(jì)算密集:推理時(shí),絕大部分時(shí)間消耗在數(shù)值計(jì)算上该面。可以通過使用更快的硬件計(jì)算單元來(lái)提升計(jì)算速度。
  • 訪存密集:推理時(shí)牵触,絕大部分時(shí)間消耗在數(shù)據(jù)讀取上《ず梗可以通過減少訪存次數(shù)酒来、提高計(jì)算訪存比或降低訪存量來(lái)優(yōu)化伟墙。

常見的 LLM 模型由于 Decoder Only 架構(gòu)的特性远荠,實(shí)際推理時(shí)大多數(shù)的時(shí)間都消耗在了逐 Token 生成階段(Decoding 階段),是典型的訪存密集型場(chǎng)景。

  • KV8量化:將逐 Token(Decoding)生成過程中的上下文 K 和 V 中間結(jié)果進(jìn)行 INT8 量化(計(jì)算時(shí)再反量化)浦妄,以降低生成過程中的顯存占用剂娄。
  • W4A16量化:將 FP16 的模型權(quán)重量化為 INT4徘铝,Kernel 計(jì)算時(shí)怕午,訪存量直接降為 FP16 模型的 1/4,大幅降低了訪存成本兆蕉。
  • WeightOnly:指僅量化權(quán)重半醉,數(shù)值計(jì)算依然采用 FP16(需要將 INT4 權(quán)重反量化)呆奕。

2.3.2 設(shè)置最大KV Cache緩存大小

KV Cache是一種緩存技術(shù),通過存儲(chǔ)鍵值對(duì)的形式來(lái)復(fù)用計(jì)算結(jié)果,以達(dá)到提高性能和降低內(nèi)存消耗的目的。在大規(guī)模訓(xùn)練和推理中方咆,KV Cache可以顯著減少重復(fù)計(jì)算量,從而提升模型的推理速度妓肢。理想情況下,KV Cache全部存儲(chǔ)于顯存,以加快訪存速度操禀。當(dāng)顯存空間不足時(shí)耿焊,也可以將KV Cache放在內(nèi)存器腋,通過緩存管理器控制將當(dāng)前需要使用的數(shù)據(jù)放入顯存诊县。

模型在運(yùn)行時(shí),占用的顯存可大致分為三部分:模型參數(shù)本身占用的顯存、KV Cache占用的顯存缴渊,以及中間運(yùn)算結(jié)果占用的顯存昔瞧。LMDeploy的KV Cache管理器可以通過設(shè)置--cache-max-entry-count參數(shù)凝化,控制KV緩存占用剩余顯存的最大比例。默認(rèn)的比例為0.8枪向。

運(yùn)行模型傍衡,查看顯存占用:

lmdeploy chat /root/internlm2-chat-1_8b

占用7816MB

改變參數(shù)

lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.5

降低到了6600MB

2.3.3 使用W4A16量化

LMDeploy使用AWQ算法绣的,實(shí)現(xiàn)模型4bit權(quán)重量化燎悍。推理引擎TurboMind提供了非常高效的4bit推理cuda kernel,性能是FP16的2.4倍以上。

  1. 安裝依賴庫(kù)einops
  2. 執(zhí)行命令完成量化
lmdeploy lite auto_awq \
   /root/internlm2-chat-1_8b \
  --calib-dataset 'ptb' \
  --calib-samples 128 \
  --calib-seqlen 1024 \
  --w-bits 4 \
  --w-group-size 128 \
  --work-dir /root/internlm2-chat-1_8b-4bit

再次使用0.5的--cache-max-entry-count,查看內(nèi)存占用



這次僅有5572MB玷或,低于之前的6600MB蔬胯。

2.4 LMDeploy 服務(wù)(serve)

我們將大模型封裝為API接口服務(wù)。


架構(gòu)圖
  • 模型推理/服務(wù)。主要提供模型本身的推理,一般來(lái)說(shuō)可以和具體業(yè)務(wù)解耦重归,專注模型推理本身性能的優(yōu)化较鼓。可以以模塊、API等多種方式提供馍惹。
  • API Server慎框。中間協(xié)議層薪丁,把后端推理/服務(wù)通過HTTP,gRPC或其他形式的接口,供前端調(diào)用称近。
  • Client忆畅〖铱可以理解為前端,與用戶交互的地方掂之。通過通過網(wǎng)頁(yè)端/命令行去調(diào)用API接口槽卫,獲取模型推理/服務(wù)。

2.4.1 啟動(dòng) API 服務(wù)器

lmdeploy serve api_server \
    /root/internlm2-chat-1_8b \
    --model-format hf \
    --quant-policy 0 \
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1

0.0.0.0的23333號(hào)端口喷好。
這一步由于Server在遠(yuǎn)程服務(wù)器上,所以本地需要做一下ssh轉(zhuǎn)發(fā)才能直接訪問。

ssh -CNg -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p 你的ssh端口號(hào)

在瀏覽器中打開本地的23333端口掘托。


2.4.2 命令行客戶端連接API服務(wù)器

運(yùn)行命令行客戶端

lmdeploy serve api_client http://localhost:23333

在命令行中即可與大模型交互。



此時(shí)的價(jià)格


2.4.3 網(wǎng)頁(yè)客戶端連接API服務(wù)器

使用Gradio作為前端,啟用網(wǎng)頁(yè)客戶端异赫,6006端口

lmdeploy serve gradio http://localhost:23333 \
    --server-name 0.0.0.0 \
    --server-port 6006

此時(shí)的架構(gòu):


2.5 Python 代碼集成

2.5.1 Python代碼集成運(yùn)行1.8B模型

編寫python腳本

from lmdeploy import pipeline

pipe = pipeline('/root/internlm2-chat-1_8b')
response = pipe(['Hi, pls intro yourself', '上海是'])
print(response)

代碼解讀:
第1行塔拳,引入lmdeploy的pipeline模塊
第3行靠抑,從目錄“./internlm2-chat-1_8b”加載HF模型
第4行澎胡,運(yùn)行pipeline,這里采用了批處理的方式稚伍,用一個(gè)列表包含兩個(gè)輸入个曙,lmdeploy同時(shí)推理兩個(gè)輸入,產(chǎn)生兩個(gè)輸出結(jié)果,結(jié)果返回給response
第5行对雪,輸出response


2.5.2 向TurboMind后端傳遞參數(shù)

在Python代碼中瑟捣,可以通過創(chuàng)建TurbomindEngineConfig栅干,向lmdeploy傳遞參數(shù)碱鳞。

from lmdeploy import pipeline, TurbomindEngineConfig

# 調(diào)低 k/v cache內(nèi)存占比調(diào)整為總顯存的 20%
backend_config = TurbomindEngineConfig(cache_max_entry_count=0.2)

pipe = pipeline('/root/internlm2-chat-1_8b',
                backend_config=backend_config)
response = pipe(['Hi, pls intro yourself', '上海是'])
print(response)

2.6 拓展部分

三窿给、作業(yè)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末填大,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子圈浇,更是在濱河造成了極大的恐慌靴寂,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐隆,死亡現(xiàn)場(chǎng)離奇詭異庶弃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)固惯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門葬毫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屡穗,“玉大人村砂,你說(shuō)我怎么就攤上這事≡雌恚” “怎么了色迂?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)锋拖。 經(jīng)常有香客問我兽埃,道長(zhǎng),這世上最難降的妖魔是什么舷夺? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任给猾,我火速辦了婚禮颂跨,結(jié)果婚禮上恒削,老公的妹妹穿的比我還像新娘尾序。我一直安慰自己躯砰,他們只是感情好弃揽,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布矿微。 她就那樣靜靜地躺著,像睡著了一般掖举。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娜庇,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天塔次,我揣著相機(jī)與錄音,去河邊找鬼名秀。 笑死励负,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匕得。 我是一名探鬼主播继榆,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼略吨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起考阱,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤翠忠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后乞榨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秽之,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年姜凄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了政溃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡态秧,死狀恐怖董虱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤愤诱,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布云头,位于F島的核電站,受9級(jí)特大地震影響淫半,放射性物質(zhì)發(fā)生泄漏溃槐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一科吭、第九天 我趴在偏房一處隱蔽的房頂上張望昏滴。 院中可真熱鬧,春花似錦对人、人聲如沸谣殊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姻几。三九已至,卻和暖如春势告,著一層夾襖步出監(jiān)牢的瞬間蛇捌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工咱台, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留络拌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓吵护,卻偏偏與公主長(zhǎng)得像盒音,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馅而,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容