您的位置:首頁 > 軟件教程 > 教程 > LLM 大模型學習必知必會系列(十二):VLLM性能飛躍部署實踐:從推理加速到高效部署的全方位優(yōu)化[更多內(nèi)容:XInference/FastChat等框架]
LLM 大模型學習必知必會系列(十二):VLLM性能飛躍部署實踐:從推理加速到高效部署的全方位優(yōu)化[更多內(nèi)容:XInference/FastChat等框架]
訓練后的模型會用于推理或者部署。推理即使用模型用輸入獲得輸出的過程,部署是將模型發(fā)布到恒定運行的環(huán)境中推理的過程。一般來說,LLM的推理可以直接使用PyTorch代碼、使用 VLLM / XInference / FastChat 等框架,也可以使用 llama.cpp / chatglm.cpp / qwen.cpp 等c++推理框架。
do_sample:布爾類型。是否使用隨機采樣方式運行推理,如果設置為False,則使用beam_search方式
temperature:大于等于零的浮點數(shù)。公式為:
$$
q_i=\frac{\exp(z_i/T)}{\sum_{j}\exp(z_j/T)}\
$$
從公式可以看出,如果T取值為0,則效果類似argmax,此時推理幾乎沒有隨機性;取值為正無窮時接近于取平均。一般temperature取值介于[0, 1]之間。取值越高輸出效果越隨機。
如果該問答只存在確定性答案,則T值設置為0。反之設置為大于0。
top_k:大于0的正整數(shù)。從k個概率最大的結果中進行采樣。k越大多樣性越強,越小確定性越強。一般設置為20~100之間。
top_p:大于0的浮點數(shù)。使所有被考慮的結果的概率和大于p值,p值越大多樣性越強,越小確定性越強。一般設置0.7~0.95之間。
repetition_penalty: 大于等于1.0的浮點數(shù)。如何懲罰重復token,默認1.0代表沒有懲罰。
上面我們講過,自回歸模型的推理是將新的token不斷填入序列生成下一個token的過程。那么,前面token已經(jīng)生成的中間計算結果是可以直接利用的。具體以Attention結構來說:
$$
\text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V
$$
推理時的Q是單token tensor,但K和V都是包含了所有歷史token tensor的長序列,因此KV是可以使用前序計算的中間結果的,這部分的緩存就是KVCache,其顯存占用非常巨大。
網(wǎng)址: https://github.com/vllm-project/vllm
vLLM是一個開源的大模型推理加速框架,通過PagedAttention高效地管理attention中緩存的張量,實現(xiàn)了比HuggingFace Transformers高14-24倍的吞吐量。
PagedAttention 是 vLLM 的核心技術,它解決了LLM服務中內(nèi)存的瓶頸問題。傳統(tǒng)的注意力算法在自回歸解碼過程中,需要將所有輸入Token的注意力鍵和值張量存儲在GPU內(nèi)存中,以生成下一個Token。這些緩存的鍵和值張量通常被稱為KV緩存。
VLLM支持絕大多數(shù)LLM模型的推理加速。它使用如下的方案大幅提升推理速度:
Continuous batching
在實際推理過程中,一個批次多個句子的輸入的token長度可能相差很大,最后生成的模型輸出token長度相差也很大。在python樸素推理中,最短的序列會等待最長序列生成完成后一并返回,這意味著本來可以處理更多token的GPU算力在對齊過程中產(chǎn)生了浪費。continous batching的方式就是在每個句子序列輸出結束后馬上填充下一個句子的token,做到高效利用算力。
PagedAttention
值得注意的是,VLLM會默認將顯卡的全部顯存預先申請以提高緩存大小和推理速度,用戶可以通過參數(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}")
注意,截止到本文檔編寫完成,VLLM對Chat模型的推理支持(模板和結束符)存在問題,在實際進行部署時請考慮使用SWIFT或者FastChat。
LLM的generate方法支持直接輸入拼接好的tokens(prompt_token_ids參數(shù),此時不要傳入prompts參數(shù)),所以外部可以按照自己的模板進行拼接后傳入VLLM,SWIFT就是使用了這種方法
在量化章節(jié)中我們講解了 AWQ量化 ,VLLM直接支持傳入量化后的模型進行推理:
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的輕量級、開箱即用的模型微調(diào)、推理框架。它不僅集成了各類開源tuners,如LoRA、QLoRA、Adapter等,并且融合了ModelScope獨立自研的特有tuner ResTuning,得益于此,各個模態(tài)的開發(fā)者均可以找到適合自己模型的開發(fā)方式。
SWIFT的tuners不僅適配于所有Transformer結構的模型,也適配于其他結構的深度學習模型,做到一行代碼創(chuàng)建可微調(diào)模型,實現(xiàn)參數(shù)高效、內(nèi)存高效和時間高效的訓練流程。
SWIFT可以無縫集成到ModelScope生態(tài)系統(tǒng)中,打通數(shù)據(jù)集讀取、模型下載、模型訓練、模型推理、模型上傳等流程。此外,SWIFT與PEFT完全兼容, 熟悉PEFT的用戶可以使用SWIFT能力結合ModelScope的模型進行便捷地訓練推理。
作為ModelScope獨立自研的開源輕量級tuner ResTuning,該技術在cv、多模態(tài)等領域均經(jīng)過了系列驗證,在訓練效果和其他微調(diào)方法相當?shù)那闆r下,可以做到顯存節(jié)省30%~60%,為cv、多模態(tài)模型的訓練提供了新的范式,在未來會應用在越來越多的場景上。
在SWIFT中,我們支持了VLLM的推理加速手段。
pip install ms-swift[llm] openai
只需要運行下面的命令就可以使用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 = '浙江的省會在哪里?'
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: 浙江的省會在哪里?
response: 浙江省的省會是杭州市。
query: 這有什么好吃的?
response: 杭州有許多美食,例如西湖醋魚、東坡肉、龍井蝦仁、叫化童子雞等。此外,杭州還有許多特色小吃,如西湖藕粉、杭州小籠包、杭州油條等。
"""
llama.cpp是使用c++語言編寫的對llama系列模型進行高效推理或量化推理的開源庫。該庫使用了ggml底層計算庫進行推理。在使用之前需要額外將python的weights轉(zhuǎn)為ggml格式或gguf格式方可使用。和llama.cpp類似,還有兼容ChatGLM模型的chatglm.cpp和兼容qwen模型的qwen.cpp和mistral的mistral.cpp。
安裝依賴:
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庫適合于CPU運行,因此推薦用戶在CPU環(huán)境中或邊緣計算中考慮cpp庫進行推理。
FastChat Github地址:
https://github.com/lm-sys/FastChat
FastChat架構:
https://github.com/lm-sys/FastChat/blob/main/docs/server_arch.md
FastChat是一個開源推理庫,側重于模型的分布式部署實現(xiàn),并提供了OpenAI樣式的RESTFul API。是一個開放平臺,用于訓練、服務和評估基于大型語言模型的聊天機器人。
pip3 install "fschat[model_worker,webui]"
python3 -m fastchat.serve.controller
在新的terminal中啟動:
FASTCHAT_USE_MODELSCOPE=true python3 -m fastchat.serve.model_worker --model-path qwen/Qwen-1_8B-Chat --revision v1.0.0
之后在新的terminal中可以運行界面進行推理:
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是微軟推出的一個開源分布式工具,其集合了分布式訓練、推斷、壓縮等高效模塊。 該工具旨在提高大規(guī)模模型訓練的效率和可擴展性。它通過多種技術手段來加速訓練,包括模型并行化、梯度累積、動態(tài)精度縮放、本地模式混合精度等。DeepSpeed還提供了一些輔助工具,如分布式訓練管理、內(nèi)存優(yōu)化和模型壓縮等,以幫助開發(fā)者更好地管理和優(yōu)化大規(guī)模深度學習訓練任務。此外,deepspeed基于pytorch構建,只需要簡單修改即可遷移。 DeepSpeed已經(jīng)在許多大規(guī)模深度學習項目中得到了應用,包括語言模型、圖像分類、目標檢測等。
DeepSpeed是由Microsoft提供的分布式訓練工具,旨在支持更大規(guī)模的模型和提供更多的優(yōu)化策略和工具。與其他框架相比,DeepSpeed支持更大規(guī)模的模型和提供更多的優(yōu)化策略和工具。其中,主要優(yōu)勢在于支持更大規(guī)模的模型、提供了更多的優(yōu)化策略和工具(例如 ZeRO 和 Offload 等)
推理框架小結
更多優(yōu)質(zhì)內(nèi)容請關注公號:汀丶人工智能;會提供一些相關的資源和優(yōu)質(zhì)文章,免費獲取閱讀。
本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權,請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)