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

       最近在研究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 historyif __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.rhkb.cn/news/137616.html

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

相关文章

【css】如何实现自定义滚动悬浮置顶、固定表头

说到固定表头或者滚动置顶&#xff0c;我们需要认识css的两个api的2个属性&#xff1a; position: sticky; position: sticky; 是 CSS 中的一种定位方式。当应用于元素时&#xff0c;该元素在滚动时会固定在父容器的指定位置&#xff0c;直到滚动到达特定的位置或条件满足后&…

APP产品经理岗位的具体内容(合集)

APP产品经理岗位的具体内容1 1、负责项目产品团队的管理工作&#xff0c;对项目产品团队考核目标负责; 2、全面负责“工务园”所有产品&#xff0c;全方位负责其生命周期管理; 3、按照产品管理相关的计划和规范&#xff0c;对产品版本的更新及发布负责&#xff0c;完善产品的…

书剑宠物疫苗接种管理软件操作教程

【软件简介】 书剑宠物疫苗接种管理软件是一款宠物疫苗接种管理的工具&#xff0c;适合宠物诊所使用。具有动物主人建档、宠物疫苗接种登记管理、每日提醒、打印疫苗接种通知卡、自定义短信提醒模板等完善的功能。 另外本软件的特色是同时具有手机网页版功能&#xff0c;手机…

警惕!多本SCI/SSCI被剔除,9月SCI/SSCI期刊目录已更新~(附下载)

【SciencePub学术】 2023年9月20日&#xff0c;科睿唯安更新了Web of Science核心期刊目录。 继上次SCI期刊目录和SSCI期刊目录更新之后&#xff0c;本次9月更新共有9本期刊发生变动&#xff1a; • SCIE&#xff1a;有3本期刊不再被SCIE期刊目录收录(Editorial De-listing/Pr…

VScode的注释和标题,标签,img的src属性(如何网页上插入图片)(Mac如何开启js控制台)(如何免费复制网页中的文字)

一、注释 <!--这是注释-->&#xff0c;在这个<!--内容-->里面的是注释&#xff0c;内容就是你要填写的注释。 在windows上查看&#xff0c;你是使用F12&#xff0c;但是mac上(我也不清楚为什么f12不好使&#xff0c;这时候就要按照下面的步骤调出这个界面 看这个高…

【校招VIP】前端JS之深拷贝和浅拷贝

考点介绍 js中的浅拷贝和深拷贝&#xff0c;只是针对复杂数据类型(Objcet&#xff0c;Array)的复制问题。简单来讲浅拷贝和深拷贝都可以实现在原有对象的基础上再生成一份的作用。但是根据新生成的对象能否影响到原对象可以分为浅拷贝和深拷贝。 前端JS之深拷贝和浅拷贝-相关题…

聊聊Spring的Aware接口

文章目录 0.前言1.什么是Aware接口2.Aware接口的设计目的3.详解3.1. ApplicationContextAware我们举个例子来说明 3.2. BeanFactoryAware3.3. BeanNameAware3.4. ServletContextAware3.5. MessageSourceAware3.6. ResourceLoaderAware 4.参考文档 0.前言 背景&#xff1a; 最近…

Spring Boot魔法:简化Java应用的开发与部署

文章目录 什么是Spring Boot&#xff1f;1. 自动配置&#xff08;Auto-Configuration&#xff09;2. 独立运行&#xff08;Standalone&#xff09;3. 生产就绪&#xff08;Production Ready&#xff09;4. 大量的起步依赖&#xff08;Starter Dependencies&#xff09; Spring …

【SpringMVC】JSR 303与interceptor拦截器快速入门

目录 一、JSR303 1、什么是JSR 303&#xff1f; 2、为什么要使用JSR 303&#xff1f; 3、JSR 303常用注解 3.1、常用的JSR 303注解 3.2、Validated与Valid区别 3.2.1、Validated 3.2.2、Valid 3.2.3、区别 4、使用案例 4.1、导入依赖 4.2、配置校验规则 4.3、编写…

大模型Tuning分类

类型总结 微调&#xff08;Fine-tunning&#xff09; 语言模型的参数需要一起参与梯度更新 轻量微调&#xff08;lightweight fine-tunning&#xff09; 冻结了大部分预训练参数&#xff0c;仅添加任务层&#xff0c;语言模型层参数不变 适配器微调 &#xff08;Adapter-t…

数据研发“新人”如何快速落地?

作者&#xff1a;肖迪(墨诩) 一、前言 这个季度主推安全月构筑&夯实稳定性底盘&#xff0c;就组织了组里的同学对核心业务链路进行了稳定性的摸排。在摸排过程中&#xff0c;不断有个声音在问你摸排出来的问题就是全部问题么&#xff1f;你加的监控加全了么&#xff1f;你…

进程同步与互斥

目录 进程同步与互斥&#xff08;1&#xff09; 第一节、进程间相互作用 一、相关进程和无关进程 二、与时间有关的错误 第二节、进程同步与互斥 一、进程的同步 二、进程的互斥 三、临界区 进程同步与互斥&#xff08;2&#xff09; 三、信号量与P、V操作的物理含义…

Tomcat 下部署 jFinal

1、检查web.xml 配置&#xff0c;在 tomcat 下部署需要检查 web.xml 是否存在&#xff0c;并且要确保配置正确&#xff0c;配置格式如下。 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

使用命令行(CMD)编译单Java文件

1.安装JDK JDK官网&#xff1a;https://www.oracle.com/java/technologies/downloads/ 选 Windows -> x64 MSI Instaler或者x64 Installer 安装成功后。 2.配置环境变量 按下Win键&#xff0c;搜索环境变量 添加JAVA_HOME系统环境变量&#xff0c;要指定类似这样的路径(…

Dubbo学习(一)——dubbo学习背景

文章目录 前言分布式基础理论什么是分布式系统发展演变ORMMVCRPCSOA RPC(远程调用)什么是RPCRPC工作原理 为什么RPC要用到DubboDubbo的优势高性能可扩展性高可靠性监控和管理 使用示例总结 前言 分布式基础理论 什么是分布式系统 分布式系统是若干独立计算机的集合&#xff…

月木学途开发 1.后台用户模块

概述 权限控制采用springsecurity 数据库设计 用户表 DROP TABLE IF EXISTS admin; CREATE TABLE admin (aid int(32) NOT NULL AUTO_INCREMENT,email varchar(50) DEFAULT NULL,username varchar(50) DEFAULT NULL,password varchar(255) DEFAULT NULL,phoneNum varchar(2…

在Ubuntu 18.04上支持C++17的std::filesystem的方法

在Ubuntu 18.04上通过命令sudo apt install gcc g安装的gcc/g版本为7.5&#xff0c;此版本并不直接支持filesystem&#xff0c;如下图所示&#xff1a; Ubuntu 18.04上的g 7.5支持experimental的filesystem,即std::experimental::filesystem&#xff0c;若想使Ubuntu 18.04支持…

软件设计原则扩展

一、引言 经典的软件设计7大原则 开闭原则&#xff08;Open Close Principle, OCP&#xff09; 依赖倒置原则&#xff08;Dependence Inversion Principle, DIP&#xff09; 单一职责原则&#xff08;Simple Responsibility Principle, SRP&#xff09; 接口隔离原则&#xf…

OPENCV实现DNN图像分类

使用步骤1 使用步骤2 使用步骤3 使用步骤4 使用步骤5 使用步骤6 完整代码如下: import numpy as np

Git --- 基础介绍

Git --- 基础介绍 git 是什么git --- 工作区, 暂存区, 资源库git --- 文件状态git --- branch 和 HEADgit --- 一次正常的git提交流程 git 是什么 Git是一款分布式源代码管理工具(版本控制工具)Git和其他传统版本控制系统比较: 传统的版本控制系统(例如 SVN)是基于差异的版本控…