爆贊!vLLM 高效推理,讓語言模型飛起來

在自然語言處理領域,大規模語言模型的推理效率對於實際應用至關重要。vLLM(virtual Large Language Model)是一個專門爲大規模語言模型設計的高效推理框架,它通過多種技術手段顯著提高了推理性能和可擴展性。

一、vLLM 框架的主要特點

1. 效內存管理: 採用了高效的內存管理策略,能夠在有限的硬件資源上運行更大規模的模型。利用分佈式內存管理技術和優化的數據流處理,有效降低了內存佔用。

2. 並行計算: 藉助並行計算技術,vLLM 可以在多 GPU、多節點的環境下進行高效的模型推理,大幅提高了處理大規模數據集的速度。

3. 動態批處理: 支持動態批處理,能夠根據輸入數據的不同自動調整批處理大小和計算資源的分配,從而優化推理效率。

4. 模型壓縮: 爲進一步提高效率,vLLM 還支持多種模型壓縮技術,如量化、剪枝等。這些技術在不顯著降低模型性能的前提下,減少了模型的計算複雜度和內存佔用。

二、vLLM 的應用場景

vLLM 主要適用於需要高效大規模語言模型推理的各種場景,例如:

1. 實時對話系統: 如智能客服、虛擬助手等,能夠快速響應用戶的輸入並生成準確的回答。

2. 大規模文本生成: 包括新聞生成、內容創作等,高效地生成大量高質量的文本。

3. 自然語言理解: 如文本分類、情感分析等任務,準確理解和分析輸入文本的含義。

三、vLLM 的實現細節

1. 分佈式架構: 允許在多個計算節點上分佈式運行模型,充分利用集羣計算資源。採用高效的通信協議來最小化節點之間的數據傳輸延遲。

2. 異構計算: 支持在不同類型的硬件(如 GPU、TPU 等)上運行,並能根據硬件特性自動調整計算策略,以獲得最佳性能。

3. 優化算法: 集成了多種優化算法,如梯度累積、混合精度計算等,可顯著提高推理效率,尤其是在大規模模型和數據集上。

四、vLLM 推理實踐

1、安裝依賴

爲了加速下載並安裝依賴包,我們先進行 pip 換源操作:

# 升級 pip
python -m pip install --upgrade pip
# 更換 pypi 源加速庫的安裝
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

接着安裝以下依賴:

pip install modelscope==1.11.0
pip install openai==1.17.1
pip install torch==2.1.2+cu121
pip install tqdm==4.66.3
pip install transformers==4.39.3
# 下載 flash-attn 請耐心等待約 10 分鐘
MAX_JOBS=8 pip install flash-attn --no-build-isolation
pip install vllm==0.4.0.post1

2、模型下載

創建文件 model_download.py;使用 modelscope 中的 snapshot_download 函數下載模型,第一個參數爲模型名稱,參數 cache_dir 爲模型的下載路徑。

import os
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
model_dir = snapshot_download('qwen/Qwen2-7B-Instruct', cache_dir='/root/autodl-tmp', revision='master')

在終端中輸入 python model_download.py 執行下載,耐心等待模型下載完成。

3、推理代碼

# vllm_model.py
from vllm import LLM, SamplingParams
from transformers import AutoTokenizer
import os
import json
# 自動下載模型時,指定使用modelscope。不設置的話,會從 huggingface 下載
os.environ['VLLM_USE_MODELSCOPE']='True'
def get_completion(prompts, model, tokenizer=None, max_tokens=512, temperature=0.8, top_p=0.95, max_model_len=2048):
stop_token_ids = [151329, 151336, 151338]
# 創建採樣參數。temperature 控制生成文本的多樣性,top_p 控制核心採樣的概率
sampling_params = SamplingParams(temperature=temperature, top_p=top_p, max_tokens=max_tokens, stop_token_ids=stop_token_ids)
# 初始化 vLLM 推理引擎
llm = LLM(model=model, tokenizer=tokenizer, max_model_len=max_model_len,trust_remote_code=True)
outputs = llm.generate(prompts, sampling_params)
return outputs
if __name__ == "__main__":
# 初始化 vLLM 推理引擎
model='/root/autodl-tmp/qwen/Qwen2-7B-Instruct' # 指定模型路徑
# model="qwen/Qwen2-7B-Instruct" # 指定模型名稱,自動下載模型
tokenizer = None
# 加載分詞器後傳入vLLM 模型,但不是必要的。
# tokenizer = AutoTokenizer.from_pretrained(model, use_fast=False)
text = ["你好,幫我介紹一下什麼時大語言模型。",
"可以給我將一個有趣的童話故事嗎?"]
# messages = [
#     {"role": "system", "content": "你是一個有用的助手。"},
#     {"role": "user", "content": prompt}
# ]
# 作爲聊天模板的消息,不是必要的。
# text = tokenizer.apply_chat_template(
#     messages,
#     tokenize=False,
#     add_generation_prompt=True
# )
outputs = get_completion(text, model, tokenizer=tokenizer, max_tokens=512, temperature=1, top_p=1, max_model_len=2048)
# 輸出是一個包含 prompt、生成文本和其他信息的 RequestOutput 對象列表。
# 打印輸出。
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

運行代碼

cd /root/autodl-tmp && python vllm_model.py

結果如下:

對話內容輸出如下:

Prompt: '你好,幫我介紹一下什麼時大語言模型。'

Generated text: '當然!大語言模型是人工智能中的一種模型,特別擅長生成高質量的文本。它們從大量的文本數據中學習,並可以生成類似真實文本的文本片段。例如,讓它們寫故事、文章、詩歌,或者在對話中生成連貫的回答。這類模型也被用於許多其他自然語言處理任務,如文本摘要、翻譯和代碼生成。這是因爲它們能夠理解和生成複雜的語法和語義結構,以及捕捉到上下文中的微小細節。大語言模型的核心是採用深度學習技術,尤其是基於 Transformer 架構的模型,這種架構很好地處理了大量的序列數據,並在最近幾年取得了顯著的進展,這得益於大規模的訓練數據集和計算資源。如今,許多大型語言模型是開源的,並且應用於各種開發和研究環境中。'

4、發佈 API

Qwen 兼容 OpenAI API 協議,因此可以直接使用 vLLM 發佈 OpenAI API 服務

地址:http://localhost:8000/v1/completions

說明:completions 是基本的文本生成任務,模型會在給定的提示後生成一段文本。這種類型的任務通常用於生成文章、故事、郵件等。

地址:http://localhost:8000/v1/chat/completions

說明:chat completions 是面向對話的任務,模型需要理解和生成對話。這種類型的任務通常用於構建聊天機器人或者對話系統。

參數說明:

python -m vllm.entrypoints.openai.api_server --model /root/autodl-tmp/qwen/Qwen2-7B-Instruct --served-model-name Qwen2-7B-Instruct --max-model-len=2048

加載完畢後出現如下信息說明服務成功啓動

5、curl 命令調用 API

在終端輸入以下命令:

-H "Content-Type: application/json" \
-d '{
"model": "Qwen2-7B-Instruct",
"prompt": "你好",
"max_tokens": 50,
"temperature": 0
}'

得到的返回值如下所示

{"id":"cmpl-b8b89673981b4690ba78e6c484c4e188","object":"text_completion","created":1719570259,"model":"Qwen2-7B-Instruct","choices":[{"index":0,"text":",我最近感覺很焦慮,有什麼方法可以緩解嗎?\n你好!焦慮是一種常見的情緒反應,但可以通過一些方法來緩解。你可以嘗試深呼吸、冥想、運動、聽音樂、與朋友聊天等方式來放鬆自己。同時","logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":1,"total_tokens":51,"completion_tokens":50}

6、Python 代碼調用 API

python 代碼如下:

from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="sk-xxx", # 隨便填寫,只是爲了通過接口參數校驗
)
completion = client.chat.completions.create(
model="Qwen2-7B-Instruct",
messages=[
{"role": "user", "content": "你好"}
]
)
print(completion.choices[0].message)

得到的返回值如下所示

ChatCompletionMessage(content='你好!很高興爲你提供幫助。有什麼我可以爲你做的嗎?', role='assistant', function_call=None, tool_calls=None)

通過使用 vLLM 高效推理框架,開發人員能夠更輕鬆地構建高吞吐量的大規模語言模型服務,滿足各種自然語言處理任務對推理速度和效率的要求,爲自然語言處理應用帶來更強大的支持。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/JwwyCEk5v1mgUCkqQK8k7Q