大模型部署調用(vLLM+LangChain) 原創
前言
在上一章【???大模型三階段訓練方法(LLaMa Factory)??】內容中主要了解一個大模型的訓練過程,無論是第三方的大模型還是自研的大模型,都需要部署到服務端,提供對應API接口供上層應用使用。所以,本章將主要了解vLLm + langchain的基本使用方法。
大模型應用框架
一般來說,大模型應用的整體結構可以劃分為幾個層次:
- 模型層:
功能:負責處理輸入數據并生成輸出。
代表:BERT、GPT、Qwen2等等
- 推理層:
- 功能:將大模型部署到服務端,暴露API。(行業普遍規范是OpenAI compatible API)
- 代表:vLLM
- API層:
- 功能:將語言模型與其他數據源、API 和服務集成,方便上層應用開發。
- 代表:LangChain
- 應用層:
- 功能:醫療、教育、金融、法律等垂類應用的具體支撐系統
基于以上的層次信息,我們接下來初步了解行業目前普遍使用的:??vLLM + LangChain?
?。
vLLM
簡介: ??vLLM?
?? 是一個專為大語言模型??(LLMs)?
?設計的高效推理庫,旨在優化推理速度和內存使用。它通過動態計算圖和先進的內存管理技術,幫助開發者在資源有限的情況下高效地運行大型模型。vLLM 支持多種流行的語言模型,使得用戶能夠快速切換和比較不同的模型,適用于實時應用場景。
網址:https://docs.vllm.ai/en/latest/index.html
作用:
- 把大模型部署到服務端,暴露OpenAI compatible API
- 提升性能: 使得大模型在推理時更加快速和高效。
- 降低成本: 減少計算資源需求,降低云計算和硬件成本。
LangChain
簡介: ??LangChain?
? 是一個開源框架,旨在幫助開發者構建基于語言模型的應用。它通過提供一系列工具和組件,簡化了語言模型與其他數據源、API 和服務的集成過程。??LangChain?
? 允許用戶構建復雜的工作流,增強了語言模型的功能和靈活性,適用于多種應用場景。
網址:https://www.langchain.com/langchain
作用:
- 簡化開發: 提供高層次的抽象,降低技術門檻。
- 增強功能: 擴展語言模型的能力,處理更復雜的任務。
部署方法
準備模型
由于上一章中訓練的醫療大模型 隨著容器的關閉已經被清理,所以本次實踐選擇了??Qwen2-0.5B-Instruct?
?。
git clone https://www.modelscope.cn/qwen/Qwen2-0.5B-Instruct.git
安裝vLLM
pip install vllm
安裝完畢后,可以通過如下命令查看安裝情況
pip show vllm
運行結果:
Name: vllm
Version:0.5.1
Summary: A high-throughput and memory-efficient inference and serving engine forLLMs
Home-page: https://github.com/vllm-project/vllm
Author: vLLM Team
Author-email:
License:Apache2.0
Location:/usr/local/lib/python3.10/site-packages
Requires: aiohttp, cmake, fastapi, filelock, lm-format-enforcer, ninja, numpy, nvidia-ml-py, openai, outlines, pillow, prometheus-client, prometheus-fastapi-instrumentator, psutil, py-cpuinfo, pydantic, ray, requests, sentencepiece, tiktoken, tokenizers, torch, torchvision, tqdm, transformers, typing-extensions, uvicorn, vllm-flash-attn, xformers
Required-by:
部署vLLM
python -m vllm.entrypoints.openai.api_server --model Qwen2-0.5B-Instruct --host 0.0.0.0 --port 8000
??
?Qwen2-0.5B-Instruct?
? 對應模型的文件夾名字,由于Linux下文件路徑大小寫敏感,所以此處需要保持大小寫一致。
成功部署后顯示:
INFO: Started server process [1657]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
我們使用OpenAI compatible API接口測試部署情況:
from openai importOpenAI
# Set OpenAI's API key and API base to use vLLM's API server.
openai_api_key ="EMPTY"
openai_api_base ="http://localhost:8000/v1"
client =OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
chat_response = client.chat.completions.create(
model="Qwen2-0.5B-Instruct",
messages=[
{"role":"system","content":"你是一個很有用的助手。"},
{"role":"user","content":"中華人民共和國的首都是哪里?"},
]
)
print("Chat response:", chat_response)
運行結果:
上述的Python代碼僅是測試vLLm的部署情況,實際應用中,需要使用?
?LangChain?
?進行進一步封裝。
使用??nvidia-smi?
?查看顯存,可以看到顯存已經被占用19G。
root@dsw-624205-75f5bf5ffb-cm59j:/mnt/workspace# nvidia-smi
ThuAug1517:29:212024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.103.01DriverVersion:470.103.01 CUDA Version:12.1|
|-------------------------------+----------------------+----------------------+
| GPU NamePersistence-M|Bus-IdDisp.A |VolatileUncorr. ECC |
|FanTempPerfPwr:Usage/Cap|Memory-Usage| GPU-UtilCompute M.|
||| MIG M.|
|===============================+======================+======================|
|0 NVIDIA A10 On|00000000:00:07.0Off|0|
|0%53C P0 61W/150W|19874MiB/22731MiB|0%Default|
||| N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
|Processes:|
| GPU GI CI PID TypeProcess name GPU Memory|
| ID ID Usage|
|=============================================================================|
+-----------------------------------------------------------------------------+
安裝LangChain
pip install langchain-openai
使用LangChain
# 引入 OpenAI 支持庫
from langchain_openai importChatOpenAI
# 連接信息
base_url ="http://localhost:8000/v1"
api_key ="EMPTY"
model_id ="Qwen2-0.5B-Instruct"
# 連接大模型
llm =ChatOpenAI(
base_url=base_url,
api_key=api_key,
model=model_id
)
# 大模型調用
llm.invoke(input="你是誰?")
運行結果:
AIMessage(cnotallow='我是來自阿里云的大規模語言模型,我叫通義千問。',
additional_kwargs={
'refusal':None}, response_metadata={'token_usage':
{'completion_tokens':17,'prompt_tokens':22,'total_tokens':39},
'model_name':'Qwen2-0.5B-Instruct',
'system_fingerprint':None,
'finish_reason':'stop',
'logprobs':None},
id='run-ca1584a6-0ff5-4d49-bfb2-ad932231e762-0',
usage_metadata={'input_tokens':22,'output_tokens':17,'total_tokens':39})
返回信息
如果使用??result = llm.invoke(input= "你是誰?")?
?,然后查看result信息,可以查看更多信息。
- result.content?
?'我是來自阿里云的大規模語言模型,我叫通義千問。'?
? - result.response_metadata?
?{'token_usage':{'completion_tokens':17,'prompt_tokens':22,'total_tokens':39},'model_name':'Qwen2-0.5B-Instruct','system_fingerprint':None,'finish_reason':'stop','logprobs':None}?
?說明: - ?
?completion_tokens?
??: 生成的文本中使用的令牌數。在這個例子中,生成的文本包含 ??17?
? 個令牌(token)。 - ?
?prompt_tokens?
??: 輸入提示中使用的令牌數。在這個例子中,輸入的提示包含 ??22?
? 個令牌。 - ?
?total_tokens?
??: 總令牌數,即 ??completion_tokens?
?? 和 ??prompt_tokens?
? 的總和。在這個例子中,總令牌數為 39。 - ?
?finish_reason?
??: 表示生成文本的結束原因。在這個例子中,??finish_reason ?
??的值為 ??stop?
?,意味著文本生成在達到預定條件后正常結束。 - ?
?logprobs?
?: 該字段通常用于提供生成過程中每個令牌的對數概率。在這個例子中,它的值為 None,表示沒有提供這些信息。
補充內容
模型類型
模型常規情況下有兩種類型:Base類型 和 Chat類型。
- ?
?Qwen2-0.5B?
?: 代表Qwen2-0.5B的Base類型模型。 - ?
?Qwen2-0.5B-Instruct?
?: 代表Qwen2-0.5B的Chat類型模型。
調用方式
由于模型的類型不同,那么在LangChain中調用方式也不同。
from langchain_openai import OpenAI
base_url = "http://localhost:8000/v1"
api_key = "EMPTY"
model_id = "Qwen2-0.5B-Instruct"
# Base方式調用了一個Chat類型模型
model = OpenAI(base_url=base_url, api_key=api_key, model=model_id)
print(model.invoke(input="你是誰"))
運行結果:
可以看到:
- 同樣的模型,同樣的問題,調用方式的不同,調用的結果卻千差萬別。
- 第一種使用?
?from langchain_openai import ChatOpenAI?
?,即Chat方式調用一個Instruct類型模型,結果是正常的。 - 第二種使用?
?from langchain_openai import OpenAI?
?,即Base方式調用一個Instruct類型模型,結果是有問題的。 - Chat方式返回的信息是一個AIMessage,而Base方式返回的是一個字符串。
內容小結
- ?
?vLLM?
?? 是一個專為大語言模型??(LLMs)?
?設計的高效推理庫,旨在優化推理速度和內存使用。 - ?
?LangChain?
? 是一個開源框架,旨在幫助開發者構建基于語言模型的應用。 - ?
?vLLM?
?? 和 ??LangChain?
? 都可以使用pip install安裝。 - 模型有嵌入類型和常規類型;常規類型下有?
?Base類型?
? 和??Chat類型?
? 兩種類型。 - 不同類型的模型調用方式不同,如果模型類型與調用方式沒有對應,可能會出現結果異常。
?
本文轉載自公眾號一起AI技術 作者:熱情的Dongming
