大模型对外提供应用的三种服务方式及示例

news2024/10/7 19:24:15

       最近在研究Llama大模型的本地化部署和应用测试过程中,为了给大家提供更多的应用方式,研究了如何利用python快速搭建各种应用访问服务,一般来说,我们开发完成的软件模块为了体现价值,都需要对外提供服务,最原始的方式就是将源码或编译好的类库提供给需要使用的客户进行引入使用,但对于大模型的应用来说,这种方式显然不行,一个是由于模型太大,需要更多的存储资源和计算资源等,客户侧一般没有相应的资源,一个是由于部署运行环境的复杂性和可运维性,导致这种应用方式的成功率和可移植性较低,因此,目前比较多的是以下三种方式,主要有终端Terminal、Web应用服务和Rest服务等。下面就逐个举例说明。

一、终端Terminal服务

这种方式需要在客户端安装相应的Terminal工具,比如putty,xterm等,同时需要给客户开放bash用户,并将需要执行的服务打包成sh命令或python命令,存放到用户的env下,否则会找不到命令,但这种方式的优点是软件模块对应的服务返回直接迅速,基本不延迟,用户很快能拿到相应的信息,但只能手动或半自动化操作使用。大模型预测的示例如下
运行命令:python llama2Test2.py Chinese-Llama-2
输出结果:大模型服务会根据用户的prompt反馈相应结果,详见下图。

二、Web应用服务

这种方式对客户的要求最低,耦合性最小,特别是面向那种初级用户来说,比如做一个前期的原型demo,这种方式最多,在传统的信息系统建设过程中,一般采用原型设计软件代替,比如Axure,但在机器学习和大模型应用测试过程中,由于python的强大,主要通过Gradio和Streamlit框架来实现,这些框架都支持快速的界面设计,用户登录验证和ip过滤等等,有些后端的服务没办法实现时,再结合Fastapi框架,封装相应的Rest接口,实现两者的组合使用,也就是说Gradio和Streamlit更接近Browser,是前端的后侧或者后端的对外应用访问接口,Fastapi是纯后端,实现复杂的计算处理和大数据解析及分片操作,二者关系见下图所示,大模型问答反馈的应用测试详见下图。

#Gradio方式
import gradio as gr
from transformers import AutoModel, AutoTokenizer,AutoModelForCausalLM,TextStreamer  
from transformers.generation.utils import GenerationConfig
if __name__ == "__main__":  
	model_path = "model/" + sys.argv[1]
	# 获得模型
	tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)    
	model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
	# 
    with gr.Blocks() as demo:  
        headStr="""<h1 align="center">"""  
        headStr =headStr+modelName+"</h1>"  
        gr.HTML(headStr)  
        # gr.HTML("""<h1 align="center">chatglm-6b</h1>""")  
  
        chatbot = gr.Chatbot()  
        with gr.Row():  
            with gr.Column(scale=4):  
                with gr.Column(scale=12):  
                    user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10).style(  
                        container=False)  
                with gr.Column(min_width=32, scale=1):  
                    submitBtn = gr.Button("Submit", variant="primary")  
            with gr.Column(scale=1):  
                emptyBtn = gr.Button("Clear History")  
                max_length = gr.Slider(0, 32768, value=8192, step=1.0, label="Maximum length", interactive=True)  
                top_p = gr.Slider(0, 1, value=0.8, step=0.01, label="Top P", interactive=True)  
                temperature = gr.Slider(0, 1, value=0.95, step=0.01, label="Temperature", interactive=True)  
  
        history = gr.State([])  
        past_key_values = gr.State(None)  
  
        submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history, past_key_values],  
                        [chatbot, history, past_key_values], show_progress=True)  
        submitBtn.click(reset_user_input, [], [user_input])  
  
        emptyBtn.click(reset_state, outputs=[chatbot, history, past_key_values], show_progress=True)  
	demo.queue().launch(server_name="0.0.0.0", server_port=7860, inbrowser=True, auth=("llm-oil", "ABCD234"))

#Streamlit方式
from transformers import AutoModel, AutoTokenizer  
import streamlit as st  
from streamlit_chat import message  
import streamlit_authenticator as stauth
@st.cache_resource  
def get_model():  
    tokenizer = AutoTokenizer.from_pretrained("model/chatglm-6b", trust_remote_code=True)  
    model = AutoModel.from_pretrained("model/chatglm-6b", trust_remote_code=True).half().cuda()  
    model = model.eval()  
    return tokenizer, model  
  
MAX_TURNS = 20  
MAX_BOXES = MAX_TURNS * 2  
tokenizer, model = get_model()
def predict(container,input, max_length, top_p, temperature, history=None):  
    with container:  
        if len(history) > 0:  
            if len(history)>MAX_BOXES:  
                history = history[-MAX_TURNS:]  
            for i, (query, response) in enumerate(history):  
                message(query, avatar_style="big-smile", key=str(i) + "_user")  
                message(response, avatar_style="bottts", key=str(i))  
  
        message(input, avatar_style="big-smile", key=str(len(history)) + "_user")  
        st.write("AI正在回复:")  
        with st.empty():  
            for response, history in model.stream_chat(tokenizer, input, history, max_length=max_length, top_p=top_p,  
                                               temperature=temperature):  
                query, response = history[-1]  
                st.write(response)  
    return history

if __name__ == "__main__":
    # auth=["llm-oil-local", "S6rJambM00Odn4LIEEix"]  
    container = st.container()  
    # create a prompt text for the text generation  
    prompt_text = st.text_area(label="用户命令输入",  
                               height=100,  
                               placeholder="请在这儿输入您的命令")  
  
    max_length = st.sidebar.slider(  
        'max_length', 0, 4096, 2048, step=1  
    )  
    top_p = st.sidebar.slider(  
        'top_p', 0.0, 1.0, 0.6, step=0.01  
    )  
    temperature = st.sidebar.slider(  
        'temperature', 0.0, 1.0, 0.95, step=0.01  
    )  
  
    if 'state' not in st.session_state:  
        st.session_state['state'] = []
        
    if st.button("发送", key="predict"):  
        with st.spinner("AI正在思考,请稍等........"):  
            # text generation  
            st.session_state["state"] = predict(container,prompt_text, max_length, top_p, temperature, st.session_state["state"])

运行命令:python llama2Test2.py Chinese-Llama-2 或者 streamlit run web_host02.py
输出结果:web服务会根据用户提交的prompt反馈相应结果,详见下图。

三、Rest接口服务

这种方式对客户的要求相对高一些,主要面向开发人员或前后端集成测试人员,实现前后端分离,耦合性小,实现方式主要基于Fastapi框架,封装相应的Rest接口,Fastapi是纯后端,实现复杂的计算处理和大数据解析及分片操作,正好满足大模型训练预测的结果反馈和智能科研工作辅助,服务端运行代码详见下图。

from fastapi import FastAPI, Request,status  
from fastapi.responses import JSONResponse  
from transformers import AutoTokenizer, AutoModelForCausalLM  
import uvicorn, json, datetime  
import torch
app = FastAPI()
if __name__ == '__main__':  
	model_path = "model/" + sys.argv[1]
    tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False)  
    model = AutoModelForCausalLM.from_pretrained(  
            model_path,  
            load_in_4bit=model_path.endswith("4bit"),  
            torch_dtype=torch.float16,  
            device_map='auto'  
        )  
    model.eval()  
    uvicorn.run(app, host='0.0.0.0', port=9060, workers=1)

运行命令:python restApi.py Chinese-Llama-2
输出结果:Rest服务会根据用户post提交的prompt数据(json格式)反馈相应结果,详见下图

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

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

相关文章

C++ PrimerPlus 复习 第一章 命令编译链接文件 make文件

第一章 命令编译链接文件 C 有什么呢&#xff1f;C 源代码文件后缀运行C过程可执行代码&#xff1a;编译语法&#xff1a;makeMakefile 基础语法编写完make只要和将要编译的文件放一起就行 然后在该目录使用make命令&#xff0c;就将自动运行&#xff1b;基础的Makefile版本 现…

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通

文章目录 前言一、关于数据仓库需求场景分类二、数据仓库线下部署场景2.1、线下部署场景介绍及优劣势说明2.2、线下部署场景对应的客户需求 三、数据仓库公有云部署场景3.1、公有云部署场景介绍及优劣势说明3.2、公有云部署场景对应的客户需求 四、为何重视数据共享&#xff08…

【洛谷 P1364】医院设置 题解(图论+深度优先搜索)

医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c;相邻接…

windows彻底卸载unity

1.控制面板卸载 双击打开桌面的控制面板&#xff0c;选择卸载程序&#xff0c;选中Unity和UnityHub右击卸载。 2.清除unity的注册表 在运行中输入“regedit”双击打开注册表界面 删除 HKEY_CURRENT_USER\Software\Unity 下所有项 删除 HKEY_CURRENT_USER\Software\Unity Tec…

项目:TCP在线云词典

一.要求 1.搭建的框架环境中实现并发&#xff0c;实现多个用户同时查询的功能。 2.服务器分别保存每个用户的使用记录&#xff0c;客户端可以查询日志的功能。 3.基本的查询单词的功能。 4.密码验证的功能&#xff0c;实现登录验证账号和密码是否正确。 二.流程和框架 框架 …

【Spring容器的启动过程】

Spring容器的启动过程 Spring 在初始化过程中有二个非常重要的步骤&#xff0c;容器的初始化与刷新。 初始化流程 如果想生成 bean 对象&#xff0c;那么就需要一个 beanFactory 工厂&#xff08;DefaultListableBeanFactory&#xff09;如果想让加了特定注解&#xff08;如 …

爬虫数据存储:技术、策略与实践(一)

文章目录 &#x1f34b;引言&#x1f34b;xlrd库和xlwt库&#x1f34b;创建Excel文件&#x1f34b;通过Python代码向Excel写入数据&#x1f34b;案例实战 &#x1f34b;引言 本节主要介绍一下在使用网络爬虫技术的时候&#xff0c;如何将数据存储到Excel中去 &#x1f34b;xl…

云原生之使用Docker部署Teedy轻量级文档管理系统

云原生之使用Docker部署Teedy轻量级文档管理系统 一、Teedy介绍1.1 Teedy简介1.2 Teedy特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Teedy镜像五、部署Teedy轻量级文…

git 本地工作区和仓库区基本使用

(1)git 本地有三个区 工作区和暂存区和 git管理的仓库. &#xff08;自行动手实践理解,然后就入门了&#xff09;(2)本地初次使用git做的事情,需要做如下工作 git config --global user.name "xx" git config --global user.email xxxqq.com git config --globa…

山西电力市场日前价格预测【2023-09-15】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-09-15&#xff09;山西电力市场全天平均日前电价为338.85元/MWh。其中&#xff0c;最高日前电价为415.06元/MWh&#xff0c;预计出现在19: 15。最低日前电价为270.06元/MWh&#xff0c;预计…

OPC是通讯协议吗安全性

目录 1 安全防护 1.1 防火墙 1.2 网闸 2 OPC是通讯协议吗 2.1 什么通讯协议 2.2 那么OPC又是什么&#xff1f; OPC官方说明文档 1 安全防护 本文阐述了控制网络以OPC接口接入信息网络应当采用的安全防护。 1.1 防火墙 防火墙是大家熟知的网络安全产品,并被用作控制网…

laravel8框架-语言包的安装和配置

1, 查找 laravel框架语言包地址&#xff1a; \根目录\resources\lang\ 默认有个 en 语言包 2&#xff0c;下载 和 安装 下载地址&#xff1a;https://packagist.org/ 搜索 laravel/lang 参考网址&#xff1a;https://packagist.org/packages/overtrue/laravel-lang 选择你…

ARM Linux DIY(十一)板子名称、开机 logo、LCD 控制台、console 免登录、命令提示符、文件系统大小

文章目录 前言板子名称uboot Modelkernel 欢迎词、主机名 开机 logoLCD 控制台console 免登录命令提示符文件系统大小 前言 经过前面十篇文章的介绍&#xff0c;硬件部分调试基本完毕&#xff0c;接下来的文章开始介绍软件的个性化开发。 板子名称 uboot Model 既然是自己的…

Games101作业0(vscode连接VB虚拟机)

作业0 配置环境: 基本配置在pa0中都有,下面介绍使用vscode连接VB虚拟机快捷开发 vscode连接VB虚拟机 1.用户名 可以看到Username为cs18并非为css180 2.密钥 在window主机生成密钥 ssh-keygen #一路回车3.VB虚拟机配置ssh sshd_config配置 cd /etc/ssh/ vim sshd_confi…

丰田工厂停产竟然因为磁盘...

丰田因磁盘空间不足关闭14家工厂 在如今的信息时代&#xff0c;无论是生活还是工作&#xff0c;我们都离不开计算机和网络。然而&#xff0c;令人惊讶的是&#xff0c;一家全球知名的汽车制造商——丰田&#xff0c;却因为磁盘空间不足的问题&#xff0c;被迫关闭了14家工厂。…

DP专题2 爬楼梯|

题目&#xff1a; 思路&#xff1a; 根据题意&#xff0c;我们先找到对应的 n 阶台阶的方案数是多少。 n 1 f(n) 1 n 2 f(n) 2 n 3 f(n) 3 n 4 f(n) 5 n 5 f(n) 8 ...... ...... n n f(n) f(n - 2) f(n - 1…

读高性能MySQL(第4版)笔记09_创建高性能索引(下)

1. 覆盖索引 1.1. 设计优秀的索引应该考虑到整个查询&#xff0c;而不单是WHERE条件部分 1.2. 如果一个索引包含&#xff08;或者说覆盖&#xff09;所有需要查询的字段的值&#xff0c;我们就称之为覆盖索引 1.3. 只有B-tree索引可以用于覆盖索引 1.4. 如果查询只需要扫描…

用Python实现链式调用

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 我们在使用Django的models查询数据库时&#xff0c;可以看到有这种写法&#xff1a; form app.models import XXX query XXX.objects.all() query query.filter(name123, age456).filter(salary999)在这种写法里面&#xf…

matlab根轨迹绘制

绘制根轨迹目的就是改变系统的闭环极点&#xff0c;使得系统由不稳定变为稳定或者使得稳定的系统变得更加稳定。 在使用PID控制器的时候&#xff0c;首先要确定的参数是Kp&#xff0c;画成框图的形式如下&#xff1a; 也就是想要知道Kp对系统性能有哪些影响&#xff0c;此时就…

go 包的引入

本文介绍下下go包的管理&#xff0c;以linux平台为例。 先看下目录结构&#xff1a; test目录下的test.go test2目录下的test.go 主函数的调用 此时执行会报错&#xff0c;需要用mod进行包的管理,执行下面命令 go mod init godir 生成go.mod文件 执行结果&#xff1a;