前言
就在今天,文心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调用该接口。