文章目录
背景
文心大模型全面开源!
作为备受关注的文心大模型,历经发展与积淀,如今迎来重要一步——全面开源并免费开放下载体验!
我们相信,开放协作、集思广益,是推动大模型技术长远发展和释放其真正价值的关键。此次开源,正是迈出了坚实的一步。
我亲身体验后,整体感受超出预期!现将详细的体验流程整理如下,供大家参考:
操作流程
开源模型选择
今天搞这个模型:
ERNIE-4.5-VL-28B-A3B-PT
ERNIE-4.5-VL-28B-A3B 是一个多模态 MoE 聊天模型,拥有 28B 总参数和每个标记激活的 3B 参数。
操作文档在这里:
https://gitcode.com/paddlepaddle/ERNIE-4.5-VL-28B-A3B-PT
咱们使用单卡部署,至少需要80G的内存,咱们直接使用A100,那么哪里可以搞到物美价廉的A100呢?
算力服务器平台开通
经过我的多方折腾,发现有个地方还是很不错的,推荐给大家:
猛戳这里!——优云智算
没错,就是这个平台,上去实名认证之后,就可以获得10元券,然后就可以跑咱们这次要搞的文心一言的开源大模型ERNIE-4.5-VL-28B-A3B-PT 啦
部署一个算力服务器
在优云智算平台上,点击部署GPU实例,选择平台镜像,然后选择pytorch + ubutu ,然后在实例配置中的更多型号里,选择A100,我们选择豪华的A100(正好80G显存)来跑今天的模型,具体的配置参照下图,PyTouch的相关版本选择如下,大家别搞错了
在实例配置中,选择A100。
然后点击立即部署即可(这里我们选择按量计费,该计费类型支持关机不收费,磁盘、镜像关机正常计费)这种方式更友好一些,有事了就先关机,回来了就开机继续搞,这里的10元代金券可以直接抵扣,只要操作不失误应该是够用的,如果对自己没信心,也别担心,这是后付费的,在系统给出回收的提示之前付清费用,服务器都是会保留的。(一般只留24小时)
选好之后,点击立即部署,服务器就会将相应的环境部署好。
这里的状态变为已运行的时候,就说明已经部署好了,就可以进行登录使用了。
现在已经是运行中了,代表服务器环境已经部署好了!
登录GPU算力服务器进行模型的部署
咱们点击登录,进入到这个服务器中开始部署模型(或者直接复制相应的ssh代码和密码,自己进入终端或者其他工具中进行登录都可以)。
复制这里的密码,然后进行远程登录
登陆成功之后界面如下:
FastDeploy 快速部署服务
咱们这次主要使用官方推荐的FastDeploy 快速部署服务
其中用到了 FastDeploy 快速部署服务,
https://github.com/PaddlePaddle/FastDeploy
咱们这次用的A100的部署,详细部署信息可以查看:
https://github.com/PaddlePaddle/FastDeploy/blob/develop/docs/get_started/installation/nvidia_gpu.md
如果不想看文档嫌麻烦的,也可以直接按照本文进行操作即可。
咱们本次实际的操作步骤总结如下图:
安装paddlepaddle-gpu
1.先运行安装 paddlepaddle-gpu(此处大约花费15分钟时间)
python -m pip install paddlepaddle-gpu==3.1.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/
这里安装完毕会报错,
这是因为:
- 版本不匹配:PyTorch 2.4.0+cu124 明确要求特定版本的 CUDA 工具链(如 nvidia-cublas-cu1212.4.2.65、nvidia-cudnn-cu129.1.0.70 等),但你的环境中安装的是更新的版本(如 12.6.4.1、9.5.1.17 等)。
- 依赖解析限制:pip 的依赖解析器在安装时可能未考虑所有已安装包的兼容性,导致不兼容的版本被安装。
然后进行解决
1. 降级冲突的库版本
根据 PyTorch 的要求,手动降级所有 CUDA 相关库至指定版本:
pip install nvidia-cublas-cu12==12.4.2.65 \
nvidia-cuda-cupti-cu12==12.4.99 \
nvidia-cuda-nvrtc-cu12==12.4.99 \
nvidia-cuda-runtime-cu12==12.4.99 \
nvidia-cudnn-cu12==9.1.0.70 \
nvidia-cufft-cu12==11.2.0.44 \
nvidia-curand-cu12==10.3.5.119 \
nvidia-cusolver-cu12==11.6.0.99 \
nvidia-cusparse-cu12==12.3.0.142 \
nvidia-nccl-cu12==2.20.5 \
nvidia-nvjitlink-cu12==12.4.99 \
nvidia-nvtx-cu12==12.4.99 \
triton==3.0.0
解决完毕后验证环境:
import torch
print(torch.__version__) # 输出: 2.4.0+cu124
print(torch.cuda.is_available()) # 应输出 True
安装fastdeploy
此处花费时间不超过1分钟。
注意,此处咱们只安装这个 stable release即可,不用按照教程安装latest Nightly build
python -m pip install fastdeploy-gpu -i https://www.paddlepaddle.org.cn/packages/stable/fastdeploy-gpu-80_90/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
这是安装完毕的图片,看起来好像有一些报错,咱们先不管,继续往下执行即可。
直接部署模型(此处大约花费15分钟时间)
python -m fastdeploy.entrypoints.openai.api_server \
--model baidu/ERNIE-4.5-VL-28B-A3B-Paddle \
--port 8180 \
--metrics-port 8181 \
--engine-worker-queue-port 8182 \
--max-model-len 32768 \
--enable-mm \
--reasoning-parser ernie-45-vl \
--max-num-seqs 32
报错了
报错的原因显示:
表明 Python 在尝试加载 PaddlePaddle 的核心库时,找不到 GCC 的 OpenMP 运行时库。
既然缺失了,那咱们马上就安装,安排,解决!
执行以下代码进行解决:
apt-get update
apt-get install -y libgomp1
解决完毕之后,继续执行部署模型:
可以看到,已经开始部署了,说明环境已经正常了,等待模型部署完毕,我们进行调用即可。
放行服务端口供公网访问
此处需要将8180的端口在防火墙放行,这样在公网才能访问我们部署好的模型:
在云服务器实例的操作页面,选择更多操作——配置防火墙,然后在其中放行 8180端口。
点击编辑防火墙规则:
点击添加规则,然后填写相应的信息:
放行成功后效果如下
最后一个错误,马上部署成功
模型部署完了,但是最后果然又报错了:
这个错误是由于系统无法解析主机名(hostname)对应的 IP 地址导致的,具体来说,这行代码尝试通过主机名获取 IP 地址时失败了(错误 [Errno -2] Name or service not known
表示名称解析失败)。
解决方案:
1. 手动配置 /etc/hosts
文件
通过修改 /etc/hosts
,将主机名映射到本地 IP(通常是 127.0.0.1
或内网 IP):
步骤:
- 查看当前主机名:bash
hostname
# 假设输出为:eb1879bc7658(你的容器ID或主机名)
- 编辑
/etc/hosts
文件:bash
vi /etc/hosts
- 在文件中添加一行,将主机名映射到
127.0.0.1
:****
(如果已有 127.0.0.1 localhost
,直接在后面加上主机名即可)
- 保存退出(vi 中按
Esc
,输入:wq
回车)。
然后又重新跑一下(跑一次大概15分钟左右)
出现图中显示的Uvicorn running on http://0.0.0.0:8180
的时候就代表服务已经部署成功了!咱们现在就将文心一言开源大模型 拥有 28B 总参数的多模态 MoE 聊天模型ERNIE-4.5-VL-28B-A3B 在自己的服务器上部署成功了!
调用大模型服务
接下来可以进行相关的调用来试一下模型的表现了。
官方demo调用
以下是官方给的demo,是让模型识别一个图片链接,然后输出图片描述的。
我改造了一个python调用的版本,代码如下:
使用python代码访问已经部署的模型:
import requests
import json
# 定义 API 接口的 URL
url = "http://你的服务器公网IP:8180/v1/chat/completions"
# 定义请求头
headers = {
"Content-Type": "application/json"
}
# 定义请求体
payload = {
"messages": [
{"role": "user", "content": [
{"type": "image_url", "image_url": {"url": "https://paddlenlp.bj.bcebos.com/datasets/paddlemix/demo_images/example2.jpg"}},
{"type": "text", "text": "Descript this image"}
]}
],
"metadata": {"enable_thinking": False}
}
# 发送 POST 请求
try:
response = requests.post(url, headers=headers, data=json.dumps(payload))
# 检查响应状态码
response.raise_for_status() # 抛出 HTTPError 异常,如果状态码不是 200-299
# 解析 JSON 响应
response_json = response.json()
# 打印响应结果
print(json.dumps(response_json, indent=2, ensure_ascii=False)) # 美化输出,支持中文
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
except json.JSONDecodeError as e:
print(f"JSON 解析错误: {e}")
except Exception as e:
print(f"发生其他错误: {e}")
注意使用的时候把你的服务器公网IP替换进去
可以看到模型已经可以正常返回了。
文字交互demo
接下来,咱们给他发送文字,让模型进行正常的回复:
代码如下:
import requests
import json
# 定义 API 接口的 URL
url = "http://你的服务器公网IP/v1/chat/completions"
# 定义请求头
headers = {
"Content-Type": "application/json"
}
# 定义请求体 - 文本聊天
def generate_text_chat_payload(user_message):
"""""" """
生成文本聊天请求的 payload。
Args:
user_message: 用户发送的文本消息 (string)。
Returns:
一个 Python 字典,代表请求体。
"""
payload = {
"messages": [
{"role": "user", "content": user_message}
],
"metadata": {} # 可以包含其他元数据,比如 {"enable_thinking": False}
}
return payload
# 设置用户消息
user_message = "你好,你现在是一个人工智能助手。随便聊一些事情。"
# 生成请求体 payload
payload = generate_text_chat_payload(user_message)
# 发送 POST 请求
try:
response = requests.post(url, headers=headers, data=json.dumps(payload))
# 检查响应状态码
response.raise_for_status() # 抛出 HTTPError 异常,如果状态码不是 200-299
# 解析 JSON 响应
response_json = response.json()
# 打印响应结果
print("响应:")
print(json.dumps(response_json, indent=2, ensure_ascii=False)) # 美化输出,支持中文
# 提取模型回复内容 (如果 API 响应结构不同,你需要相应地修改这部分)
try:
model_response = response_json["choices"][0]["message"]["content"]
print("\n模型回复:")
print(model_response)
except (KeyError, IndexError) as e:
print(f"\n无法提取模型回复: {e}")
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
except json.JSONDecodeError as e:
print(f"JSON 解析错误: {e}")
except Exception as e:
print(f"发生其他错误: {e}")
文+图+连续对话版本(python代码)
好吧,合并在一起,并且可以连续对话的版本应运而生:
import requests
import json
import io
from PIL import Image
# 定义 API 接口的 URL
url = "http://你的服务器公网IP:8180/v1/chat/completions"
# 请求头
headers = {
"Content-Type": "application/json"
}
def display_image_from_url(image_url):
"""从 URL 显示图片"""
try:
response = requests.get(image_url, stream=True)
response.raise_for_status()
img = Image.open(io.BytesIO(response.content))
img.show()
except requests.exceptions.RequestException as e:
print(f"无法从 URL 获取图片: {e}")
except Exception as e:
print(f"显示图片时发生错误: {e}")
def generate_chat_payload(messages, metadata={}):
"""
生成聊天请求的 payload。
Args:
messages (list): 包含对话消息的列表,每个消息是一个字典。
metadata (dict, optional): 元数据字典。 默认为 {}.
Returns:
dict: 聊天请求的 payload。
"""
payload = {
"messages": messages,
"metadata": metadata # 可以添加 enable_thinking: False 等
}
return payload
conversation_history = []
def main():
global conversation_history
while True:
user_input_type = input("请输入 (1: 文字, 2: 图片URL): ")
if user_input_type == "1":
user_text = input("请输入文字: ")
user_message = {"role": "user", "content": user_text}
elif user_input_type == "2":
image_url = input("请输入图片 URL: ")
user_message = {
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": image_url}},
{"type": "text", "text": "请描述这张图片"} # 提示模型描述
]
}
else:
print("无效的输入类型。")
continue
conversation_history.append(user_message)
payload = generate_chat_payload(conversation_history)
try:
response = requests.post(url, headers=headers, data=json.dumps(payload))
response.raise_for_status()
response_json = response.json()
# print("\nAPI 响应:")
# print(json.dumps(response_json, indent=2, ensure_ascii=False))
if "choices" in response_json and response_json["choices"]:
model_response = response_json["choices"][0]["message"]
conversation_history.append(model_response)
print("\n模型回复:")
if isinstance(model_response["content"], str):
print(model_response["content"])
elif isinstance(model_response["content"], list):
for item in model_response["content"]:
if item["type"] == "text":
print(item["text"])
elif item["type"] == "image_url":
print("显示图片...")
display_image_from_url(item["image_url"]["url"])
else:
print("无法处理的模型回复内容类型")
else:
print("\n没有从模型收到回复。")
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
except json.JSONDecodeError as e:
print(f"JSON 解析错误: {e}")
except (KeyError, IndexError) as e:
print(f"从响应中提取信息时出错: {e}")
except Exception as e:
print(f"发生其他错误: {e}")
continue_chat = input("继续对话? (y/n): ")
if continue_chat.lower() != "y":
break
if __name__ == "__main__":
main()
openai的接口调用方式
当然,咱们这种部署方式同样也兼容openai的接口调用方式,如:
import openai
host = "117.50.192.15"
port = "8180"
client = openai.Client(base_url=f"http://{host}:{port}/v1", api_key="null")
response = client.chat.completions.create(
model="null",
messages=[
{"role": "system", "content": "I'm a helpful AI assistant."},
{"role": "user", "content": "给我写一首关于爱情的诗"},
],
stream=True,
)
for chunk in response:
if chunk.choices[0].delta:
print(chunk.choices[0].delta.content, end='')
print('\n')
这就提供了很多思路,可以直接把这个接口对接到dify等工具上,然后打造自己的专属工作流,知识库等,这绝不亚于市面上的那些大模型。
并且如果感觉回复的内容不是很符合自己的要求,还可以针对模型进行微调,比其他非开源只能调用api-key的模型想象空间大了很多!!!
总结
本文详细介绍了如何使用FastDeploy快速部署大模型服务的全过程,涵盖了从选择开源模型到在GPU算力服务器上完成部署并开放公网访问的各个步骤。首先,我们回顾了相关的背景信息,并介绍了操作流程。接着,文章通过具体的部署实例,逐步展示了如何解决可能出现的库版本冲突问题、安装必要的软件包以及如何配置系统文件(如/etc/hosts)来确保模型服务的顺利运行。
通过使用FastDeploy,用户能够更加高效地部署大规模机器学习模型,并能够方便地进行文字、图像及连续对话版本的交互测试。此外,文章还分享了官方demo和openai接口的调用方式,帮助读者更好地理解和应用模型服务。
本文不仅为读者提供了清晰的操作指南,还解决了在模型部署过程中常见的技术难题,使读者能够轻松搭建和使用高效的AI服务。
文心大模型的开源标志着技术权力从巨头垄断向全民共创的转移。然而,开源的本质不是慈善,而是通过开放降低生态摩擦,让创新在自由流动中爆发更大价值。
一起来轻松玩转文心大模型吧一文心大模型免费下载地址:
https://ai.gitcode.com/theme/1939325484087291906