前言
就在今天,文心4.5模型開源了,不是一個,而是整個系列模型正式開源。很突然,我都震驚了。文心4.5系列開源模型共10款,涵蓋了激活參數規模分別為47B 和3B 的混合專家(MoE)模型(最大的模型總參數量為424B),以及0.3B 的稠密參數模型。下面我們就介紹如何快速使用文心4.5模型推理,以及部署接口給Android、微信小程序等客戶端調用,注意這里只接受文本類型的模型,實際文心4.5也有多模態的模型。
環境:
- PaddlePaddle 3.1.0
- CUDA 12.6
- Ubuntu 22.04
搭建環境
- 首先安裝PaddlePaddle,如果安裝了,可以跳過。
python -m pip install paddlepaddle-gpu==3.1.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/
- 然后安裝fastdeploy工具。
python -m pip install fastdeploy-gpu -i https://www.paddlepaddle.org.cn/packages/stable/fastdeploy-gpu-86_89/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
- 安裝aistudio-sdk,用于下載模型。
pip install --upgrade aistudio-sdk
快速使用
通過使用下面Python代碼,可以快速實現對話。我使用了最小的一個模型作為開始使用,實際還有更多更大的模型,如下:
- ERNIE-4.5-0.3B-Paddle
- ERNIE-4.5-21B-A3B-Paddle
- ERNIE-4.5-300B-A47B-Paddle
執行下面代碼,會自動下載模型,然后開始在終端對話。
from aistudio_sdk.snapshot_download import snapshot_download
from fastdeploy import LLM, SamplingParams# 模型名稱
model_name = "PaddlePaddle/ERNIE-4.5-0.3B-Paddle"
save_path = "./models/ERNIE-4.5-0.3B-Paddle/"
# 下載模型
res = snapshot_download(repo_id=model_name, revision='master', local_dir=save_path)
# 對話參數
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
# 加載模型
llm = LLM(model=save_path, max_model_len=32768)messages = []while True:prompt = input("請輸入問題:")if prompt == 'exit':breakmessages.append({"role": "user", "content": prompt})outputs = llm.chat(messages, sampling_params)print(outputs)
輸出日志如下:
部署接口
首先下載模型,這里可以隨時替換你需要的模型。
aistudio download --model PaddlePaddle/ERNIE-4.5-0.3B-Paddle --local_dir ./models/ERNIE-4.5-0.3B-Paddle/
下載模型之后,執行下面命令開始啟動服務,端口號是8180,max-model-len
是指定推理支持的最大上下文長度,max-num-seqs
是解碼階段的最大并發數。更多的參數文檔可以查看:https://paddlepaddle.github.io/FastDeploy/parameters/
python -m fastdeploy.entrypoints.openai.api_server \--model ./models/ERNIE-4.5-0.3B-Paddle/ \--port 8180 \--max-model-len 32768 \--max-num-seqs 32
輸出日志如下:
調用接口
它是兼容OpenAI的API,所以如果使用Python調用的話,可以使用openai庫來調用,不需要指定模型名稱和api_key。
import openai
host = "192.168.0.100"
port = "8180"
client = openai.Client(base_url=f"http://{host}:{port}/v1", api_key="null")messages = []while True:prompt = input("請輸入問題:")if prompt == 'exit':breakmessages.append({"role": "user", "content": prompt})response = client.chat.completions.create(model="null",messages=messages,stream=True,)for chunk in response:if chunk.choices[0].delta:print(chunk.choices[0].delta.content, end='')
輸出如下:
后面再補充使用Android調用該接口。