「源力觉醒 创作者计划」_文心开源模型(ERNIE-4.5-VL-28B-A3B-PT)使用心得

文章目录

  • 背景
  • 操作流程
    • 开源模型选择
    • 算力服务器平台开通
    • 部署一个算力服务器
    • 登录GPU算力服务器进行模型的部署
    • FastDeploy 快速部署服务
      • 安装paddlepaddle-gpu
        • 1. 降级冲突的库版本
      • 安装fastdeploy
    • 直接部署模型(此处大约花费15分钟时间)
      • 放行服务端口供公网访问
      • 最后一个错误,马上部署成功
        • 1. 手动配置 `/etc/hosts` 文件
    • 调用大模型服务
      • 官方demo调用
      • 文字交互demo
      • 文+图+连续对话版本(python代码)
      • openai的接口调用方式
  • 总结

背景

文心大模型全面开源!

作为备受关注的文心大模型,历经发展与积淀,如今迎来重要一步——全面开源并免费开放下载体验!

我们相信,开放协作、集思广益,是推动大模型技术长远发展和释放其真正价值的关键。此次开源,正是迈出了坚实的一步。

我亲身体验后,整体感受超出预期!现将详细的体验流程整理如下,供大家参考:

操作流程

开源模型选择

今天搞这个模型:
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/

这里安装完毕会报错,

这是因为:

  1. 版本不匹配: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 等)。
  2. 依赖解析限制: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):

步骤:

  1. 查看当前主机名:bash
hostname
# 假设输出为:eb1879bc7658(你的容器ID或主机名)
  1. 编辑 /etc/hosts 文件:bash
vi /etc/hosts
  1. 在文件中添加一行,将主机名映射到 127.0.0.1:****

(如果已有 127.0.0.1 localhost,直接在后面加上主机名即可)

  1. 保存退出(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 payloadconversation_history = []def main():global conversation_historywhile 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("无效的输入类型。")continueconversation_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":breakif __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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914923.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P10719 [GESP202406 五级] 黑白格

题目传送门 前言:不是这样例有点过分了哈: 这是我没考虑到无解的情况的得分: 这是我考虑了的得分: 总而言之,就是一个Subtask 你没考虑无解的情况(除了Subtask #0),就会WA一大片,然后这个Subt…

AWS RDS PostgreSQL可观测性最佳实践

AWS RDS PostgreSQL 介绍AWS RDS PostgreSQL 是亚马逊云服务(AWS)提供的托管型 PostgreSQL 数据库服务。托管服务:AWS 管理数据库的底层基础设施,包括硬件、操作系统、数据库引擎等,用户无需自行维护。高性能&#xff…

C++——set,map的模拟实现

文章目录前言红黑树的改变set的模拟实现基本框架迭代器插入源码map模拟实现基础框架迭代器插入赋值重载源码测试代码前言 set,map底层使用红黑树这种平衡二叉搜索树来组织元素 ,这使得set, map能够提供对数时间复杂度的查找、插入和删除操作。 下面都是基…

LabVIEW液压机智能监控

​基于LabVIEW平台,结合西门子、研华等硬件,构建液压机实时监控系统。通过 OPC 通信技术实现上位机与 PLC 的数据交互,解决传统监控系统数据采集滞后、存储有限、参数调控不便等问题,可精准采集冲压过程中的位置、速度、压力等参数…

15. 什么是 xss 攻击?怎么防护

总结 跨站脚本攻击&#xff0c;注入恶意脚本敏感字符转义&#xff1a;“<”,“/”前端可以抓包篡改主要后台处理&#xff0c;转义什么是 XSS 攻击&#xff1f;怎么防护 概述 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的 Web 安全…

更换docker工作目录

使用环境 由于默认系统盘比较小docker镜像很容易就占满&#xff0c;需要挂载新的磁盘修改docker的默认工作目录 环境&#xff1a;centos7 docker默认工作目录: /var/lib/docker/ 新的工作目录&#xff1a;/home/docker-data【自己手动创建&#xff0c;一般挂在新加的磁盘下面】…

算法学习笔记:26.二叉搜索树(生日限定版)——从原理到实战,涵盖 LeetCode 与考研 408 例题

二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种特殊的二叉树&#xff0c;因其高效的查找、插入和删除操作&#xff0c;成为计算机科学中最重要的数据结构之一。BST 的核心特性是 “左小右大”&#xff0c;这一特性使其在数据检索、排序和索引…

共生型企业:驾驭AI自动化(事+AI)与人类增强(人+AI)的双重前沿

目录 引言&#xff1a;人工智能的双重前沿 第一部分&#xff1a;自动化范式&#xff08;事AI&#xff09;——重新定义卓越运营 第一章&#xff1a;智能自动化的机制 第二章&#xff1a;自动化驱动的行业转型 第三章&#xff1a;自动化的经济演算 第二部分&#xff1a;协…

TypeScript的export用法

在 TypeScript 中&#xff0c;export 用于将模块中的变量、函数、类、类型等暴露给外部使用。export 语法允许将模块化的代码分割并在其他文件中导入。 1. 命名导出&#xff08;Named Export&#xff09; 命名导出是 TypeScript 中最常见的一种导出方式&#xff0c;它允许你导出…

数据结构-2(链表)

一、思维导图二、链表的反转def reverse(self):"""思路&#xff1a;1、设置previous_node、current、next_node三个变量,目标是将current和previous_node逐步向后循环并逐步进行反转,知道所有元素都被反转2、但唯一的问题是&#xff1a;一旦current.next反转为向…

ros2 标定相机

一个终端执行&#xff1a; ros2 run image_tools cam2image --ros-args -p width:640 -p height:480 -p frequency:30.0 -p device_id:-1 -r /image:/camera/image_raw另一个终端执行&#xff1a;8x6 是格子角点数量&#xff0c;0.028是格子尺寸 ros2 run camera_calibration …

IsaacLab学习记录(二)

二、导入并训练自己的机器人1、urdf等其他格式转usd&#xff08;工具在./scrips/tools/&#xff09;​​​维度​​​​URDF (Unified Robot Description Format)​​​​USD (Universal Scene Description)​​​​定位​​机器人模型描述标准&#xff08;仅描述单机器人&…

基于Rust Softplus 函数实践方法

Softplus 函数 Softplus 函数是神经网络中常用的激活函数之一,定义为: ​ Softplus函数导数 ​ 是 sigmoid 函数。Softplus 处处可导,并且导数恰好是 sigmoid。 它是 ReLU 函数的平滑近似,具有连续可导的特性,适合需要梯度优化的场景。 数学特性 平滑性:导数为 Sig…

Ubuntu服务器安装Miniconda

下载 Miniconda 安装脚本&#xff08;如果能联网&#xff09;wget https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-Linux-x86_64.sh -O Miniconda3.sh安装 Miniconda 到 /opt/condabash Miniconda3.sh -b -p /opt/conda激活 conda/opt/conda/bin/conda init ba…

Java数组补充v2

一、数组基本概念1. 什么是数组数组是Java中用来存储同类型数据的固定大小的连续内存空间的数据结构。2. 数组特点固定长度&#xff1a;一旦创建&#xff0c;长度不可改变相同类型&#xff1a;所有元素必须是同一数据类型索引访问&#xff1a;通过下标&#xff08;从0开始&…

【PTA数据结构 | C语言版】前缀树的3个操作

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;利用前缀树查找给定字符串是否在某给定字符串集合 S 中。 输入格式&#xff1a; 输入首先给出一个正整数 n&#xff08;≤1000&#xff09;&#xff0c;随后 n 行&#xff0…

JAVA面试宝典 -《缓存架构:穿透 / 雪崩 / 击穿解决方案》

&#x1f4a5;《缓存架构&#xff1a;穿透 / 雪崩 / 击穿解决方案》 文章目录&#x1f4a5;《缓存架构&#xff1a;穿透 / 雪崩 / 击穿解决方案》&#x1f9ed; 一、开篇导语&#xff1a;为什么缓存是高并发系统的命脉&#xff1f;✅1.1 缓存的核心价值缓存带来的收益​​&…

FPGA创意项目网页或博客推荐

1. 综合项目平台(开源+教程) ① Hackster.io - FPGA专区 🔗 https://www.hackster.io/fpga 特点: 大量基于FPGA的创意项目(如Zynq游戏机、视觉处理、机器人控制)。 提供完整教程(Vivado工程文件+代码)。 推荐项目: FPGA-Based Oscilloscope(低成本示波器) V…

Go 程序无法使用 /etc/resolv.conf 的 DNS 配置排查记录

在最近的一次部署中&#xff0c;我遇到一个奇怪的问题&#xff1a;Go 程序在运行时不使用 /etc/resolv.conf 中的 DNS 设置&#xff0c;导致服务无法正常访问域名。这篇文章记录下完整的排查过程和最终的解决方案。1. 问题现象我有一个部署在 KVM 虚拟机内的 Go 应用&#xff0…

微服务相关问题(2)

1、Spring Cloud相关常用组件注册中心&#xff08;nacos、Eureka等&#xff09;、负载均衡&#xff08;Ribbon、LoadBalancer&#xff09;、远程调用&#xff08;feign&#xff09;、服务熔断&#xff08;Sentinel、Hystrix&#xff09;、网关&#xff08;Gateway&#xff09;2…