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

2023-09-14 08:51:29

       最近在研究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格式)反馈相应结果,详见下图

更多推荐

远程连接PostgreSQL:配置指南与安全建议

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🐅🐾猫头虎建议程序员必备技术栈一览表📖:🛠️全栈技术FullStack:📚MERN/MEAN/MEVNStack|🌐Jamstack|🌍GraphQL|🔁RESTfulAPI|⚡WebSockets|🔄CI/CD|🌐Git&Versio

Linux安全加固:保护你的服务器

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

Cobra眼睛蛇-强大的Golang CLI框架,快速上手的脚手架搭建项目工具,详细安装和使用

Cobra眼睛蛇-强大的GolangCLI框架,快速上手的脚手架搭建项目工具,详细安装和使用。阅读过k8s源码的同学,应该都知道k8sScheduler、kubeadm、kubelet等核心组件的命令行交互全都是通过spf13写的Cobra库来实现。本文就来介绍下Cobra的相关概念及具体用法。关于Cobra是一个用于

MySQL常用配置详解

目录一、MySQL查看配置信息二、MySQL查看服务器当前运行状态的信息三、MySQL常用配置详解1、mysql(使用mysql命令登录数据库时的默认的设置)2、client(客户端默认设置内容)3、mysqld(服务端端配置)四、配置修改演示1、修改my.cnf配置文件(window系统修改my.ini配置文件)2、

二叉树经典OJ题——【数据结构】

W...Y的主页😊代码仓库分享💕今天我们来进行二叉树的OJ练习,就是利用二叉树的前序、中序、后续以及晨序遍历的特性进行OJ训练。话不多说,来看我们的第一道题。【leetcode965.单值二叉树】OJ链接如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回true;否则返

Wireshark把DDoS照原形

1前言MTU、传输速度、拥塞控制,还是各种重传,TCP传输相关的核心概念:学习了RFC规范和具体的Linux实现通过案例,把这些知识灵活运用了起来这种种还是在协议规范这大框架内的讨论,默认前提就是通信两端是遵照TCP规定工作,都是君子协定。若不遵TCP规范,甚至找漏洞攻击,这种小人行为也很常见,如DDoS攻击。2NTP

正则表达式元字符

正则表达式元字符-详细说明字符说明\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n"匹配字符"n”。“\n"匹配换行符。序列”\\“匹配”\“,”\(“匹配”("。^匹配输入字符串开始的位置。如果设置了RegExp对象的Multiline属性,^还会与"\n"或"\r"之后的位置匹配。$匹配输入字符

如何用Stable Diffusion模型生成个人专属创意名片?

目录1什么是二维码?2什么是扩散模型?3StableDiffusion环境搭建4开始制作创意名片结语1什么是二维码?二维码是一种用于存储和传输信息的方便而广泛使用的图像编码技术。它是由黑色方块和白色空白区域组成的二维图形,可以通过扫描设备(如智能手机)进行解码。二维码基于特定的编码标准和解码算法——其中包括错误检测和纠

如何通过简历展示自己的执行力和动力?

导语:简历是求职过程中的重要工具,通过合适的展示方式能够有效地展示自己的执行力和动力。本文将分享一些技巧,帮助您在简历中突出这两个关键能力。突出成就和项目经历:在简历中详细描述您曾经完成的项目或工作,并着重强调其中的具体成果。指出您所负责的任务,并描述您是如何通过积极的执行力完成这些任务的。例如,提及您成功地完成了某个

RHCSA_Linux 从命令行管理文件

目录一、文件命令规范:二、创建链接文件1、创建软链接文件2、创建硬链接文件三、目录操作命令1、创建目录--mkdir2、统计目录及文件的空间占用情况--du3、删除目录文件四、创建、删除普通文件1、创建普通文件2、删除普通文件五、数据流和重定向1、数据流2、重定向操作符3、输出重定向案例标准输出重定向:1>或>、1>>

2023华为OD统一考试(B卷)题库清单(持续收录中)以及考点说明

目录专栏导读2023B卷“新加题”(100分值)2023Q2100分2023Q2200分2023Q1100分2023Q1200分2022Q4100分2022Q4200分牛客练习题专栏导读本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测

热文推荐