大模型部署調(diào)用(vLLM+LangChain) 原創(chuàng)
前言
在上一章【???大模型三階段訓(xùn)練方法(LLaMa Factory)??】?jī)?nèi)容中主要了解一個(gè)大模型的訓(xùn)練過(guò)程,無(wú)論是第三方的大模型還是自研的大模型,都需要部署到服務(wù)端,提供對(duì)應(yīng)API接口供上層應(yīng)用使用。所以,本章將主要了解vLLm + langchain的基本使用方法。
大模型應(yīng)用框架
一般來(lái)說(shuō),大模型應(yīng)用的整體結(jié)構(gòu)可以劃分為幾個(gè)層次:
- 模型層:
功能:負(fù)責(zé)處理輸入數(shù)據(jù)并生成輸出。
代表:BERT、GPT、Qwen2等等
- 推理層:
- 功能:將大模型部署到服務(wù)端,暴露API。(行業(yè)普遍規(guī)范是OpenAI compatible API)
- 代表:vLLM
- API層:
- 功能:將語(yǔ)言模型與其他數(shù)據(jù)源、API 和服務(wù)集成,方便上層應(yīng)用開發(fā)。
- 代表:LangChain
- 應(yīng)用層:
- 功能:醫(yī)療、教育、金融、法律等垂類應(yīng)用的具體支撐系統(tǒng)
基于以上的層次信息,我們接下來(lái)初步了解行業(yè)目前普遍使用的:??vLLM + LangChain?
?。
vLLM
簡(jiǎn)介: ??vLLM?
?? 是一個(gè)專為大語(yǔ)言模型??(LLMs)?
?設(shè)計(jì)的高效推理庫(kù),旨在優(yōu)化推理速度和內(nèi)存使用。它通過(guò)動(dòng)態(tài)計(jì)算圖和先進(jìn)的內(nèi)存管理技術(shù),幫助開發(fā)者在資源有限的情況下高效地運(yùn)行大型模型。vLLM 支持多種流行的語(yǔ)言模型,使得用戶能夠快速切換和比較不同的模型,適用于實(shí)時(shí)應(yīng)用場(chǎng)景。
網(wǎng)址:https://docs.vllm.ai/en/latest/index.html
作用:
- 把大模型部署到服務(wù)端,暴露OpenAI compatible API
- 提升性能: 使得大模型在推理時(shí)更加快速和高效。
- 降低成本: 減少計(jì)算資源需求,降低云計(jì)算和硬件成本。
LangChain
簡(jiǎn)介: ??LangChain?
? 是一個(gè)開源框架,旨在幫助開發(fā)者構(gòu)建基于語(yǔ)言模型的應(yīng)用。它通過(guò)提供一系列工具和組件,簡(jiǎn)化了語(yǔ)言模型與其他數(shù)據(jù)源、API 和服務(wù)的集成過(guò)程。??LangChain?
? 允許用戶構(gòu)建復(fù)雜的工作流,增強(qiáng)了語(yǔ)言模型的功能和靈活性,適用于多種應(yīng)用場(chǎng)景。
網(wǎng)址:https://www.langchain.com/langchain
作用:
- 簡(jiǎn)化開發(fā): 提供高層次的抽象,降低技術(shù)門檻。
- 增強(qiáng)功能: 擴(kuò)展語(yǔ)言模型的能力,處理更復(fù)雜的任務(wù)。
部署方法
準(zhǔn)備模型
由于上一章中訓(xùn)練的醫(yī)療大模型 隨著容器的關(guān)閉已經(jīng)被清理,所以本次實(shí)踐選擇了??Qwen2-0.5B-Instruct?
?。
git clone https://www.modelscope.cn/qwen/Qwen2-0.5B-Instruct.git
安裝vLLM
pip install vllm
安裝完畢后,可以通過(guò)如下命令查看安裝情況
pip show vllm
運(yùn)行結(jié)果:
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?
? 對(duì)應(yīng)模型的文件夾名字,由于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接口測(cè)試部署情況:
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":"你是一個(gè)很有用的助手。"},
{"role":"user","content":"中華人民共和國(guó)的首都是哪里?"},
]
)
print("Chat response:", chat_response)
運(yùn)行結(jié)果:
上述的Python代碼僅是測(cè)試vLLm的部署情況,實(shí)際應(yīng)用中,需要使用?
?LangChain?
?進(jìn)行進(jìn)一步封裝。
使用??nvidia-smi?
?查看顯存,可以看到顯存已經(jīng)被占用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 支持庫(kù)
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
)
# 大模型調(diào)用
llm.invoke(input="你是誰(shuí)?")
運(yùn)行結(jié)果:
AIMessage(cnotallow='我是來(lái)自阿里云的大規(guī)模語(yǔ)言模型,我叫通義千問。',
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= "你是誰(shuí)?")?
?,然后查看result信息,可以查看更多信息。
- result.content?
?'我是來(lái)自阿里云的大規(guī)模語(yǔ)言模型,我叫通義千問。'?
? - 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}?
?說(shuō)明: - ?
?completion_tokens?
??: 生成的文本中使用的令牌數(shù)。在這個(gè)例子中,生成的文本包含 ??17?
? 個(gè)令牌(token)。 - ?
?prompt_tokens?
??: 輸入提示中使用的令牌數(shù)。在這個(gè)例子中,輸入的提示包含 ??22?
? 個(gè)令牌。 - ?
?total_tokens?
??: 總令牌數(shù),即 ??completion_tokens?
?? 和 ??prompt_tokens?
? 的總和。在這個(gè)例子中,總令牌數(shù)為 39。 - ?
?finish_reason?
??: 表示生成文本的結(jié)束原因。在這個(gè)例子中,??finish_reason ?
??的值為 ??stop?
?,意味著文本生成在達(dá)到預(yù)定條件后正常結(jié)束。 - ?
?logprobs?
?: 該字段通常用于提供生成過(guò)程中每個(gè)令牌的對(duì)數(shù)概率。在這個(gè)例子中,它的值為 None,表示沒有提供這些信息。
補(bǔ)充內(nèi)容
模型類型
模型常規(guī)情況下有兩種類型:Base類型 和 Chat類型。
- ?
?Qwen2-0.5B?
?: 代表Qwen2-0.5B的Base類型模型。 - ?
?Qwen2-0.5B-Instruct?
?: 代表Qwen2-0.5B的Chat類型模型。
調(diào)用方式
由于模型的類型不同,那么在LangChain中調(diào)用方式也不同。
from langchain_openai import OpenAI
base_url = "http://localhost:8000/v1"
api_key = "EMPTY"
model_id = "Qwen2-0.5B-Instruct"
# Base方式調(diào)用了一個(gè)Chat類型模型
model = OpenAI(base_url=base_url, api_key=api_key, model=model_id)
print(model.invoke(input="你是誰(shuí)"))
運(yùn)行結(jié)果:
可以看到:
- 同樣的模型,同樣的問題,調(diào)用方式的不同,調(diào)用的結(jié)果卻千差萬(wàn)別。
- 第一種使用?
?from langchain_openai import ChatOpenAI?
?,即Chat方式調(diào)用一個(gè)Instruct類型模型,結(jié)果是正常的。 - 第二種使用?
?from langchain_openai import OpenAI?
?,即Base方式調(diào)用一個(gè)Instruct類型模型,結(jié)果是有問題的。 - Chat方式返回的信息是一個(gè)AIMessage,而Base方式返回的是一個(gè)字符串。
內(nèi)容小結(jié)
- ?
?vLLM?
?? 是一個(gè)專為大語(yǔ)言模型??(LLMs)?
?設(shè)計(jì)的高效推理庫(kù),旨在優(yōu)化推理速度和內(nèi)存使用。 - ?
?LangChain?
? 是一個(gè)開源框架,旨在幫助開發(fā)者構(gòu)建基于語(yǔ)言模型的應(yīng)用。 - ?
?vLLM?
?? 和 ??LangChain?
? 都可以使用pip install安裝。 - 模型有嵌入類型和常規(guī)類型;常規(guī)類型下有?
?Base類型?
? 和??Chat類型?
? 兩種類型。 - 不同類型的模型調(diào)用方式不同,如果模型類型與調(diào)用方式?jīng)]有對(duì)應(yīng),可能會(huì)出現(xiàn)結(jié)果異常。
?
本文轉(zhuǎn)載自公眾號(hào)一起AI技術(shù) 作者:熱情的Dongming
