【Linux】阿里云服务器搭建gradio实例

文章目录

    • 0 前言
    • 1 整体结构
    • 2 Python开放环境搭建
      • 2.1 SSL安装
      • 2.2 python安装
    • 3 开发
      • 3.1 工具使用
      • 3.2 gradio
      • 3.3 langchain
    • 4 nginx部署
      • 4.1 下载安装
      • 4.2 配置访问gradio
    • 5 服务编写
    • 6 扩展:安装软件步骤总结

0 前言

  因为课程原因,需要做一个大模型相关的大作业,想到之前买的阿里云服务器,便想在服务器基于大模型API部署一个聊天机器人 。 因为是新手,特地做个记录,供初学者参考。

1 整体结构

  聊天机器人主要就是前端的交互界面和后台的大模型处理两个部分。其中前端的交互界面是基于 gradio 库来实现的(官网:https://www.gradio.app/);后端大模型是基于 langchain 这个一站式部署的库实现的(官网:https://www.langchain.com.cn/,API用的是国内大模型的免费API。接下来将分别介绍。

2 Python开放环境搭建

  在开始介绍之前,还需要搭建一个Python环境。
  阿里云服务器系统(CentOS 7.3)默认的python版本是3.6,实测在使用gradio时出现很多问题,所以建议安装高版本的Python,这里选择的是Python 3.10.14。

首先从官网下载安装包

由于gradio库需要使用到ssl,加上python 3.10支持的ssl版本要大于1.1.1,所以这里先安装SSL

2.1 SSL安装

到SSL的GitHub下载源码。

https://github.com/openssl/openssl/releases/tag/OpenSSL_1_1_1w

在这里插入图片描述

先解决依赖

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel

解压openssl并编译安装

# 解压
tar -zxvf openssl-1.1.1w.tar.gz
# 进入到安装目录
cd openssl-1.1.1w/
# 配置安装路径
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl enable-shared
# 编译
make # -j 4
# 安装
make install

安装好之后,还需要将openssl的可执行文件和库文件添加到系统能识别的位置,这样后续编译运行对此有依赖的软件程序就能正常执行。

# 先把原先老版本的openssl重命名一下备份
mv /usr/bin/openssl /usr/bin/openssl_backup
# 执行文件和库文件软链接,注意前面是实际位置,后面是链接存放的位置
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1

如果加上软链接还提示找不到的话,可以将软链接放到lib64文件夹下,二者都是存放共享库,但是一个是32位程序调用,一个是64位程序调用。

安装好之后测试一下openssl的版本:

openssl version

2.2 python安装

接下来开始安装python
和上面一样,先解决一下依赖

yum -y install gcc makeyum install libffi-develyum -y install zlib zlib-devel yum -y install bzip2 bzip2-devel 
yum -y install ncurses ncurses-devel 
yum -y install readline readline-devel 
yum -y install openssl openssl-devel 
yum -y install openssl-static 
yum -y install xz lzma xz-devel 
yum -y install sqlite sqlite-devel 
yum -y install gdbm gdbm-devel 
yum -y install tk tk-devel
yum -y install mesa-libGL.x86_64

这些依赖不一定都要安装,可以先往后走,遇到报错再来安装

然后再到官网下载源码包,在这里插入图片描述

解压python并编译安装

# 解压
tar -zxvf Python-3.10.14.tgz
# 进入到安装目录
cd Python-3.10.14/
# 配置安装路径和openssl路径
./configure -C --with-openssl=/usr/local/openssl --with-openssl-rpath=auto --prefix=/usr/local/python310
# 编译
make # -j 4
# 安装
make install

安装好之后,还需要将python的可执行文件的链接放到系统的环境变量中,这样就不用每次运行python还要找一波路径。

# 可以直接覆盖原来的python3,也可以像下面一样指定一个别名
ln -s /usr/local/python3/bin/python3.10 /usr/bin/python310
# pip这个可以不需要,因为实际使用时可以用python -m pip,或者虚拟环境中直接使用
ln -s /usr/local/python3/bin/pip3.10 /usr/bin/pip3
# 配置文件,根据自己的需要选择
ln -s /usr/local/python3/bin/python3.10-config /usr/bin/python3-config

验证一下ssl是否安装成功

# 先在终端输入python310
python310# 再导入一下ssl模块
import ssl

如果不报错,就说明ssl安装成功。

参考链接

3 开发

搭建好python环境之后,接下来就可以正常开发了。

3.1 工具使用

首先是使用的工具,还是首推VS Code,利用内部的Remote Development插件套装,可以实现本地开发云端程序,操作和本地基本一致,完全没有入门门槛,比较简单,不再赘述。

3.2 gradio

工具确定了,接下来就是实际撸代码了。
gradio是主角之一。它可以快捷地实现一个前端,快到什么程度呢,基本几行代码就能实现一个前端交互界面,非常适合一些机器学习等人工智能应用的快速可视化。

这里列举一些参考资料

ChatInterface:https://www.gradio.app/docs/gradio/chatinterface
几行代码实现一个聊天交互界面。

gradio快速创建一个目标识别的应用:
https://blog.csdn.net/weixin_44162814/article/details/138153029

3.3 langchain

langchain是一个一站式部署大模型的库,内部实现了很多国内外大模型的接口,比如OpenAI,智普AI等,除了官方文档,也可以参考一下这个文档:
https://github.com/aihes/LangChain-Tutorials-and-Examples

4 nginx部署

4.1 下载安装

先下载

wget -c https://nginx.org/download/nginx-1.14.0.tar.gz

版本可以根据自己需要选择,目前官网最新版好像是1.27.0:
在这里插入图片描述

解压并进入目录

tar -zxvf nginx-1.14.0.tar.gz
cd nginx-1.14.0

使用nginx的默认配置

./configure

最后再编译安装

make
make install

现在安装好之后,由于还没有添加到环境变量中,所以还不能直接在终端运行nginx,也不能用which去查找,可以使用whereis去查找

> whereis nginx
nginx: /usr/local/nginx

这里输出的是安装目录,执行文件在安装目录下的sbin文件夹,所以运行nginx时,需要:

/usr/local/nginx/sbin/nginx

这个相当于是一个服务,运行起来之后就不会关闭。

如果需要关闭可以参考以下操作

# 先用ps指令查找对应的进程
ps -ef | grep nginx
kill <pid>  # 对应进程的PID值

关闭之后,如果想要重新运行,可以:

/usr/local/nginx/sbin/nginx -s reopen

正常运行之后,浏览器访问服务器链接(80端口),应该可以看到一个欢迎界面:

在这里插入图片描述
nginx就是这样运行,比较简单。复杂的地方在于这个配置的问题
可以使用vim编辑nginx的配置文件

vim /usr/local/nginx/conf/nginx.conf

具体的配置部分理解继续看下一节。

参考链接

4.2 配置访问gradio

前面介绍gradio可以看到,运行代码之后,会出现一个本地链接和端口。
如果有在Windows上运行gradio的可能会有这样的疑惑:这不是跟flask一样,运行完成之后直接点击链接就能访问吗?那如果在服务器上面,只需要输入服务器对应公网IP不就行了?一开始我也是这样想的,但是在查找教程过程中,无意看到一句话:gradio只能提供内部访问,外部访问需要使用nginx这样的反向代理服务器。

在开始之前,先简单介绍一下nginx的配置文件的结构

  • 全局块:配置全局的指令,对整个Nginx服务器起作用。
  • events块:配置与连接相关的指令,如工作进程数和连接超时时间等。
  • http块:配置HTTP服务器的指令,如监听端口、虚拟主机和HTTP模块等。
  • server块:配置虚拟主机的指令,可以配置多个server块来支持多个域名或IP地址。
  • location块:配置URL路径的指令,可以在server块或http块中使用。

其中,我们主要需要配置的就是location块,即实现将默认访问80端口的请求导向gradio的本地链接。

参考链接

好在gradio官网也提供的相应的教程:https://www.gradio.app/guides/running-gradio-on-your-web-server-with-nginx
不用到处去找博客视频之类的了

整体思路参考这个链接,具体的配置方式还是看上面那个官网教程。

5 服务编写

  为了避免每次都要用python运行程序,可以考虑将这一指令写成服务的形式。

创建一个新的service文件,通常以.service作为后缀名。在终端中使用以下命令创建一个新的服务文件:

sudo vi /etc/systemd/system/myservice.service
在打开的编辑器中,输入以下内容:

[Unit]
Description=My Service
After=network.target[Service]
ExecStart=/path/to/your/service_executable
Type=simple
Restart=always
RestartSec=3
User=your_username[Install]
WantedBy=default.target

其中,

Description是对服务的描述;
After指定服务应该在哪些目标之后启动;
ExecStart指定要运行的服务可执行文件的路径;
Type指定服务的类型,这里简单地使用simple;
Restart指定服务在失败后应该如何重启,这里选择always;
RestartSec指定服务在重启之前应该等待的时间,这里选择3秒;
User指定服务应该以哪个用户的身份运行;
WantedBy指定在哪个目标之前安装此服务。
保存并关闭文件。

更新systemctl并启动新服务。在终端中运行以下命令:

sudo systemctl daemon-reload
sudo systemctl start myservice.service

验证服务是否成功启动。可以使用以下命令检查服务的状态:

sudo systemctl status myservice.service

如果服务已成功启动,将在终端中看到服务的状态信息。

设置服务开机自启动。运行以下命令来启用服务自启动:

sudo systemctl enable myservice.service

现在,服务将在系统启动时自动启动。

这样就创建了一个CentOS 7的service。根据实际情况,需要修改[Unit]和[Service]部分的内容以适应您的具体服务需求。

参考链接

6 扩展:安装软件步骤总结

  从上面安装的几个软件来看,其实Linux端安装软件还是有规律可循的,主要就是那么几步:configure,make,make install

参考链接:link1,link2

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

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

相关文章

vue3中如何实现标准元素 拖动 功能 【收藏备用】

最近在用vue3做一个企业后台管理系统的项目,在登录页面的时候需要用户滑动滑块来获取验证码登录系统 用到了元素拖放 这里也顺便记录一下 如何使用的. 目录 1.功能介绍 2.代码部分 3 实现过程 3.1 设置可拖动元素 3.2 拖动什么 3.3 放到何处 3.4 进行放置 1.功能介绍…

小水电远程集控运维系统简介及应用价值

一、政策背景 2023年7月14日水利部办公厅印发了《智能化小型水电站技术指南( 试行)》和&#xff08;《小水电集控中心技术指南( 试行)》两个指导性文件&#xff0c;明确要求实施小水电绿色改造和现代化提升工程&#xff0c;推进建设智能集约的现代化小水电。 二、系统概述 小…

公司电脑加全屏水印怎么加(怎么打水印满屏)?4个方法精选!包教包会!

在企业管理中&#xff0c;为了保护公司机密信息的安全&#xff0c;给公司电脑添加全屏水印已成为一种常见的安全措施。 全屏水印不仅可以震慑潜在的窥探者&#xff0c;还能在信息不慎泄露时提供追溯线索。 那么&#xff0c;如何给公司电脑添加全屏水印呢&#xff1f; 以下是4…

AI大模型开发架构设计(18)——基于大模型构建企业知识库案例实战

文章目录 1 LLM 大模型在工作中的实际应用以及局限性LLM 大模型工作中实际应用大模型2点局限性 2 基于大模型和向量数据库的企业级知识库架构剖析向量数据库向量数据库选型知识库文档检索增强(Retrieval Augmented Generation)向量数据库应用技术总体架构向量数据库应用离线索引…

10款PDF合并工具的使用体验与推荐!!!

在如今的信息洪流中&#xff0c;我们几乎每个人都被淹没在大量的数字文档之中。无论是学生、教师还是职场人士&#xff0c;我们都需要高效地管理和处理这些文档。而PDF文件&#xff0c;凭借其跨平台的稳定性和通用性&#xff0c;成了最常用的文档格式之一。我们经常需要处理、编…

Redis做分布式锁

&#xff08;一&#xff09;为什么要有分布式锁以及本质 在一个分布式的系统中&#xff0c;会涉及到多个客户端访问同一个公共资源的问题&#xff0c;这时候我们就需要通过锁来做互斥控制&#xff0c;来避免类似于线程安全的问题 因为我们学过的sychronized只能对线程加锁&…

IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发

对于新手学习SpringBoot开发&#xff0c;可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握&#xff0c;如果快速上手数据库开发&#xff0c;可以先按照本文介绍的方式使用JdbcTemplat…

12、Linux系统的网络基本设置

查看网络接口信息ifconfig ip addr/ip a #简单查看网络接口信息 ifconfig #表示只显示当前活跃的设备接口信息 ifconfig -a #查看当前主机所有的&#xff08;all&#xff09;网络设备&#xff0c;包括未运行的设备。 如我们查看本机网卡ens33的…

JDK1.8升级JDK不生效

最近因为项目原因&#xff0c;需要将jdk1.8升级到JDK11.升级发生了一个纠结的问题&#xff0c;就是cmd不生效。在此记录&#xff01; 项目中指定jdk 如果在android studio项目&#xff0c;可以单独指定该项目的jdk&#xff0c;而不用全局升级&#xff0c;可以做如下配置&#…

八 Bean的生命周期

八、Bean的生命周期 8.1 什么是Bean的生命周期 Spring其实就是一个管理Bean对象的工厂。它负责对象的创建&#xff0c;对象的销毁等。 所谓的生命周期就是&#xff1a;对象从创建开始到最终销毁的整个过程。 什么时候创建Bean对象&#xff1f; 创建Bean对象的前后会调用什…

【Android】webview常用方法和使用

文章目录 前言一、常见用法二、基础属性webView的常用方法WebViewClient的常用方法WebChromeClient的常用方法WebSettings的相关方法 三、加载流程和事件回调四、webview和JS之间的互相调用总结 五、参考链接 前言 最近项目又用到了webview&#xff0c;在回顾复习一次webview相…

OpenGL ES 共享上下文实现多线程渲染

OpenGL ES 共享上下文时,可以共享哪些资源? 共享上下文实现多线程渲染 EGL 概念回顾 EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信; 查询绘图表面的可用类型和配置; 创建绘图表面; 在OpenGL ES 和…

09C++结构体

/*结构体属于用户自定义的数据类型&#xff0c; 允许用户存储不同的数据类型, 语法:struct 结构体名{结构体成员列表} ;*/ //struct 结构体名 变量名 #include <iostream> #include <string> using namespace std; struct student { string name; int age;int s…

python第七次作业

01.设计一个函数&#xff0c;可以传入一个或多个单词的字符串&#xff0c;并返回该字符串&#xff0c;但所有五个或更多字母的单词都前后颠倒 a input("输入:") print(a) #将一句话以空格为分界拆分为单个单词 b a.split(" ") ls_1 [] ls_2 []for i i…

C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信

1. 前言 RabbitMQ是一个流行的开源消息队列系统&#xff0c;支持多种消息协议&#xff0c;广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。在本文中&#xff0c;我们将熟悉如何使用C与RabbitMQ进行消息通信。 2. 准备工作 在 Windows 平台上…

AI写作(四)预训练语言模型:开启 AI 写作新时代(4/10)

一、预训练语言模型概述 ​ 预训练语言模型在自然语言处理领域占据着至关重要的地位。它以其卓越的语言理解和生成能力&#xff0c;成为众多自然语言处理任务的关键工具。 预训练语言模型的发展历程丰富而曲折。从早期的神经网络语言模型开始&#xff0c;逐渐发展到如今的大规…

图像处理实验一(Matlab Exercises and Image Fundamentals)

一、基本概念介绍 MATLAB是一种广泛使用的高性能语言&#xff0c;特别适用于数学计算、算法开发、数据分析和可视化。在图像处理领域&#xff0c;MATLAB提供了强大的工具和函数&#xff0c;使得图像的读取、处理和分析变得相对简单。通过MATLAB&#xff0c;用户可以实现从基本的…

番外-JDBC:2024年最新java连接数据库教程

前言 JavaScript的内容晚点更新&#xff0c;今天继续更新一点番外&#xff0c;今天更新的是jdbc&#xff0c;如何用java连接数据库 1.导包 要使java能够连接数据库我们需要导入一个包&#xff0c;请按照以下操作安装并导包 1.进入官网 MySQL 以上为官网链接进去后点击下载…

Ubuntu22.04安装DataEase

看到DataEase的驾驶舱&#xff0c;感觉比PowerBI要好用一点&#xff0c;于是搭建起来玩玩。Dataease推荐的操作系统是Ubuntu22.04/Centos 7。 下载了Ubuntu22.04和DataEase 最新版本的离线安装包 一.安装ubuntu22.04 在安装的时候&#xff0c;没有顺手设置IP地址信息&#xff…

vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果

说明 vue路由切换时&#xff0c;当前页面左侧和右侧容器分别从两侧滑出&#xff0c;新页面左右分别从两侧滑入 效果展示 路由切换-滑入滑出效果 难点和踩坑 现路由和新路由始终存在一个页面根容器&#xff0c;通过<transition>组件&#xff0c;效果只能对页面根容器有效…