您的位置:首頁(yè) > 軟件教程 > 教程 > LLM 大模型學(xué)習(xí)必知必會(huì)系列(十二):VLLM性能飛躍部署實(shí)踐:從推理加速到高效部署的全方位優(yōu)化[更多內(nèi)容:XInference/FastChat等框架]
LLM 大模型學(xué)習(xí)必知必會(huì)系列(十二):VLLM性能飛躍部署實(shí)踐:從推理加速到高效部署的全方位優(yōu)化[更多內(nèi)容:XInference/FastChat等框架]
訓(xùn)練后的模型會(huì)用于推理或者部署。推理即使用模型用輸入獲得輸出的過(guò)程,部署是將模型發(fā)布到恒定運(yùn)行的環(huán)境中推理的過(guò)程。一般來(lái)說(shuō),LLM的推理可以直接使用PyTorch代碼、使用 VLLM / XInference / FastChat 等框架,也可以使用 llama.cpp / chatglm.cpp / qwen.cpp 等c++推理框架。
do_sample:布爾類(lèi)型。是否使用隨機(jī)采樣方式運(yùn)行推理,如果設(shè)置為False,則使用beam_search方式
temperature:大于等于零的浮點(diǎn)數(shù)。公式為:
$$
q_i=\frac{\exp(z_i/T)}{\sum_{j}\exp(z_j/T)}\
$$
從公式可以看出,如果T取值為0,則效果類(lèi)似argmax,此時(shí)推理幾乎沒(méi)有隨機(jī)性;取值為正無(wú)窮時(shí)接近于取平均。一般temperature取值介于[0, 1]之間。取值越高輸出效果越隨機(jī)。
如果該問(wèn)答只存在確定性答案,則T值設(shè)置為0。反之設(shè)置為大于0。
top_k:大于0的正整數(shù)。從k個(gè)概率最大的結(jié)果中進(jìn)行采樣。k越大多樣性越強(qiáng),越小確定性越強(qiáng)。一般設(shè)置為20~100之間。
top_p:大于0的浮點(diǎn)數(shù)。使所有被考慮的結(jié)果的概率和大于p值,p值越大多樣性越強(qiáng),越小確定性越強(qiáng)。一般設(shè)置0.7~0.95之間。
repetition_penalty: 大于等于1.0的浮點(diǎn)數(shù)。如何懲罰重復(fù)token,默認(rèn)1.0代表沒(méi)有懲罰。
上面我們講過(guò),自回歸模型的推理是將新的token不斷填入序列生成下一個(gè)token的過(guò)程。那么,前面token已經(jīng)生成的中間計(jì)算結(jié)果是可以直接利用的。具體以Attention結(jié)構(gòu)來(lái)說(shuō):
$$
\text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V
$$
推理時(shí)的Q是單token tensor,但K和V都是包含了所有歷史token tensor的長(zhǎng)序列,因此KV是可以使用前序計(jì)算的中間結(jié)果的,這部分的緩存就是KVCache,其顯存占用非常巨大。
網(wǎng)址: https://github.com/vllm-project/vllm
vLLM是一個(gè)開(kāi)源的大模型推理加速框架,通過(guò)PagedAttention高效地管理attention中緩存的張量,實(shí)現(xiàn)了比HuggingFace Transformers高14-24倍的吞吐量。
PagedAttention 是 vLLM 的核心技術(shù),它解決了LLM服務(wù)中內(nèi)存的瓶頸問(wèn)題。傳統(tǒng)的注意力算法在自回歸解碼過(guò)程中,需要將所有輸入Token的注意力鍵和值張量存儲(chǔ)在GPU內(nèi)存中,以生成下一個(gè)Token。這些緩存的鍵和值張量通常被稱(chēng)為KV緩存。
VLLM支持絕大多數(shù)LLM模型的推理加速。它使用如下的方案大幅提升推理速度:
Continuous batching
在實(shí)際推理過(guò)程中,一個(gè)批次多個(gè)句子的輸入的token長(zhǎng)度可能相差很大,最后生成的模型輸出token長(zhǎng)度相差也很大。在python樸素推理中,最短的序列會(huì)等待最長(zhǎng)序列生成完成后一并返回,這意味著本來(lái)可以處理更多token的GPU算力在對(duì)齊過(guò)程中產(chǎn)生了浪費(fèi)。continous batching的方式就是在每個(gè)句子序列輸出結(jié)束后馬上填充下一個(gè)句子的token,做到高效利用算力。
PagedAttention
值得注意的是,VLLM會(huì)默認(rèn)將顯卡的全部顯存預(yù)先申請(qǐng)以提高緩存大小和推理速度,用戶可以通過(guò)參數(shù)
gpu_memory_utilization
控制緩存大小。
首先安裝VLLM:
pip install vllm
import os
os.environ['VLLM_USE_MODELSCOPE'] = 'True'
from vllm import LLM, SamplingParams
prompts = [
"Hello, my name is",
"The president of the United States is",
"The capital of France is",
"The future of AI is",
]
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
llm = LLM(model="qwen/Qwen-1_8B", trust_remote_code=True)
outputs = llm.generate(prompts, sampling_params)
#Print the outputs.
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
注意,截止到本文檔編寫(xiě)完成,VLLM對(duì)Chat模型的推理支持(模板和結(jié)束符)存在問(wèn)題,在實(shí)際進(jìn)行部署時(shí)請(qǐng)考慮使用SWIFT或者FastChat。
LLM的generate方法支持直接輸入拼接好的tokens(prompt_token_ids參數(shù),此時(shí)不要傳入prompts參數(shù)),所以外部可以按照自己的模板進(jìn)行拼接后傳入VLLM,SWIFT就是使用了這種方法
在量化章節(jié)中我們講解了 AWQ量化 ,VLLM直接支持傳入量化后的模型進(jìn)行推理:
from vllm import LLM, SamplingParams
import os
import torch
os.environ['VLLM_USE_MODELSCOPE'] = 'True'
#Sample prompts.
prompts = [
"Hello, my name is",
"The president of the United States is",
"The capital of France is",
"The future of AI is",
]
#Create a sampling params object.
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
#Create an LLM.
llm = LLM(model="ticoAg/Qwen-1_8B-Chat-Int4-awq", quantization="AWQ", dtype=torch.float16, trust_remote_code=True)
#Generate texts from the prompts. The output is a list of RequestOutput objects
#that contain the prompt, generated text, and other information.
outputs = llm.generate(prompts, sampling_params)
#Print the outputs.
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
VLLM官方文檔可以查看 這里 。
網(wǎng)址: https://github.com/modelscope/swift/tree/main
SWIFT(Scalable lightWeight Infrastructure for Fine-Tuning)是基于PyTorch的輕量級(jí)、開(kāi)箱即用的模型微調(diào)、推理框架。它不僅集成了各類(lèi)開(kāi)源tuners,如LoRA、QLoRA、Adapter等,并且融合了ModelScope獨(dú)立自研的特有tuner ResTuning,得益于此,各個(gè)模態(tài)的開(kāi)發(fā)者均可以找到適合自己模型的開(kāi)發(fā)方式。
SWIFT的tuners不僅適配于所有Transformer結(jié)構(gòu)的模型,也適配于其他結(jié)構(gòu)的深度學(xué)習(xí)模型,做到一行代碼創(chuàng)建可微調(diào)模型,實(shí)現(xiàn)參數(shù)高效、內(nèi)存高效和時(shí)間高效的訓(xùn)練流程。
SWIFT可以無(wú)縫集成到ModelScope生態(tài)系統(tǒng)中,打通數(shù)據(jù)集讀取、模型下載、模型訓(xùn)練、模型推理、模型上傳等流程。此外,SWIFT與PEFT完全兼容, 熟悉PEFT的用戶可以使用SWIFT能力結(jié)合ModelScope的模型進(jìn)行便捷地訓(xùn)練推理。
作為ModelScope獨(dú)立自研的開(kāi)源輕量級(jí)tuner ResTuning,該技術(shù)在cv、多模態(tài)等領(lǐng)域均經(jīng)過(guò)了系列驗(yàn)證,在訓(xùn)練效果和其他微調(diào)方法相當(dāng)?shù)那闆r下,可以做到顯存節(jié)省30%~60%,為cv、多模態(tài)模型的訓(xùn)練提供了新的范式,在未來(lái)會(huì)應(yīng)用在越來(lái)越多的場(chǎng)景上。
在SWIFT中,我們支持了VLLM的推理加速手段。
pip install ms-swift[llm] openai
只需要運(yùn)行下面的命令就可以使用VLLM加速推理:
swift infer --model_id_or_path qwen/Qwen-1_8B-Chat --max_new_tokens 128 --temperature 0.3 --top_p 0.7 --repetition_penalty 1.05 --do_sample true
也支持在部署中使用VLLM:
swift deploy --model_id_or_path qwen/Qwen-1_8B-Chat --max_new_tokens 128 --temperature 0.3 --top_p 0.7 --repetition_penalty 1.05 --do_sample true
調(diào)用:
from openai import OpenAI
client = OpenAI(
api_key='EMPTY',
base_url='http://localhost:8000/v1',
)
model_type = client.models.list().data[0].id
print(f'model_type: {model_type}')
query = '浙江的省會(huì)在哪里?'
messages = [{
'role': 'user',
'content': query
}]
resp = client.chat.completions.create(
model=model_type,
messages=messages,
seed=42)
response = resp.choices[0].message.content
print(f'query: {query}')
print(f'response: {response}')
#流式
messages.append({'role': 'assistant', 'content': response})
query = '這有什么好吃的?'
messages.append({'role': 'user', 'content': query})
stream_resp = client.chat.completions.create(
model=model_type,
messages=messages,
stream=True,
seed=42)
print(f'query: {query}')
print('response: ', end='')
for chunk in stream_resp:
print(chunk.choices[0].delta.content, end='', flush=True)
print()
"""Out[0]
model_type: qwen-7b-chat
query: 浙江的省會(huì)在哪里?
response: 浙江省的省會(huì)是杭州市。
query: 這有什么好吃的?
response: 杭州有許多美食,例如西湖醋魚(yú)、東坡肉、龍井蝦仁、叫化童子雞等。此外,杭州還有許多特色小吃,如西湖藕粉、杭州小籠包、杭州油條等。
"""
llama.cpp是使用c++語(yǔ)言編寫(xiě)的對(duì)llama系列模型進(jìn)行高效推理或量化推理的開(kāi)源庫(kù)。該庫(kù)使用了ggml底層計(jì)算庫(kù)進(jìn)行推理。在使用之前需要額外將python的weights轉(zhuǎn)為ggml格式或gguf格式方可使用。和llama.cpp類(lèi)似,還有兼容ChatGLM模型的chatglm.cpp和兼容qwen模型的qwen.cpp和mistral的mistral.cpp。
安裝依賴(lài):
pip install modelscope
git clone --recursive https://github.com/QwenLM/qwen.cpp && cd qwen.cpp
cmake -B build
cmake --build build -j --config Release
下載模型:
from modelscope import snapshot_download
print(snapshot_download('qwen/Qwen-1_8B-Chat'))
#/mnt/workspace/.cache/modelscope/qwen/Qwen-1_8B-Chat
將原始模型轉(zhuǎn)換為ggml支持的格式:
python3 qwen_cpp/convert.py -i /mnt/workspace/.cache/modelscope/qwen/Qwen-1_8B-Chat -t q4_0 -o qwen1_8b-ggml.bin
./build/bin/main -m qwen1_8b-ggml.bin --tiktoken /mnt/workspace/.cache/modelscope/qwen/Qwen-1_8B-Chat/qwen.tiktoken -p 你好
#你好!有什么我可以幫助你的嗎?
量化章節(jié)中我們介紹,GGML庫(kù)適合于CPU運(yùn)行,因此推薦用戶在CPU環(huán)境中或邊緣計(jì)算中考慮cpp庫(kù)進(jìn)行推理。
FastChat Github地址:
https://github.com/lm-sys/FastChat
FastChat架構(gòu):
https://github.com/lm-sys/FastChat/blob/main/docs/server_arch.md
FastChat是一個(gè)開(kāi)源推理庫(kù),側(cè)重于模型的分布式部署實(shí)現(xiàn),并提供了OpenAI樣式的RESTFul API。是一個(gè)開(kāi)放平臺(tái),用于訓(xùn)練、服務(wù)和評(píng)估基于大型語(yǔ)言模型的聊天機(jī)器人。
pip3 install "fschat[model_worker,webui]"
python3 -m fastchat.serve.controller
在新的terminal中啟動(dòng):
FASTCHAT_USE_MODELSCOPE=true python3 -m fastchat.serve.model_worker --model-path qwen/Qwen-1_8B-Chat --revision v1.0.0
之后在新的terminal中可以運(yùn)行界面進(jìn)行推理:
python3 -m fastchat.serve.gradio_web_server
網(wǎng)址: https://github.com/microsoft/DeepSpeed
網(wǎng)址: https://www.deepspeed.ai/training/
Deepspeed并行框架介紹
:
https://github.com/wzzzd/LLM_Learning_Note/blob/main/Parallel/deepspeed.md
Deepspeed是微軟推出的一個(gè)開(kāi)源分布式工具,其集合了分布式訓(xùn)練、推斷、壓縮等高效模塊。 該工具旨在提高大規(guī)模模型訓(xùn)練的效率和可擴(kuò)展性。它通過(guò)多種技術(shù)手段來(lái)加速訓(xùn)練,包括模型并行化、梯度累積、動(dòng)態(tài)精度縮放、本地模式混合精度等。DeepSpeed還提供了一些輔助工具,如分布式訓(xùn)練管理、內(nèi)存優(yōu)化和模型壓縮等,以幫助開(kāi)發(fā)者更好地管理和優(yōu)化大規(guī)模深度學(xué)習(xí)訓(xùn)練任務(wù)。此外,deepspeed基于pytorch構(gòu)建,只需要簡(jiǎn)單修改即可遷移。 DeepSpeed已經(jīng)在許多大規(guī)模深度學(xué)習(xí)項(xiàng)目中得到了應(yīng)用,包括語(yǔ)言模型、圖像分類(lèi)、目標(biāo)檢測(cè)等。
DeepSpeed是由Microsoft提供的分布式訓(xùn)練工具,旨在支持更大規(guī)模的模型和提供更多的優(yōu)化策略和工具。與其他框架相比,DeepSpeed支持更大規(guī)模的模型和提供更多的優(yōu)化策略和工具。其中,主要優(yōu)勢(shì)在于支持更大規(guī)模的模型、提供了更多的優(yōu)化策略和工具(例如 ZeRO 和 Offload 等)
推理框架小結(jié)
更多優(yōu)質(zhì)內(nèi)容請(qǐng)關(guān)注公號(hào):汀丶人工智能;會(huì)提供一些相關(guān)的資源和優(yōu)質(zhì)文章,免費(fèi)獲取閱讀。
機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對(duì)象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀升訊威在線客服與營(yíng)銷(xiāo)系統(tǒng)介紹
閱讀基于鴻蒙NEXT的血型遺傳計(jì)算器開(kāi)發(fā)案例
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比分析
閱讀Win11筆記本“自動(dòng)管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)