ChatGPT平替- ChatGLM多用户并行访问部署

这篇具有很好参考价值的文章主要介绍了ChatGPT平替- ChatGLM多用户并行访问部署。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        ChatGLM对话模型基本环境配置和部署请参考上一篇博文《ChatGPT平替-ChatGLM环境搭建与部署运行》,地址为“https://blog.csdn.net/suiyingy/article/details/130370190”。但是,默认部署程序仅支持单用户访问,多用户则需要排队访问。测试过相关的几个Github多用户工程,但是其中一些仍然不满足要求。本节将系统介绍如何实现多用户同时访问ChatGLM的部署接口,包括http、websocket(流式输出,stream)和web页面等方式,主要目录如下所示。

        (1)api.py http多用户并行

        (2)api.py websocket多用户并行(流式输出,stream)

        (3)web_demo.py多用户并行

        本节所涉及程序可根据文中描述自行编写或替换,也可在“https://download.csdn.net/download/suiyingy/87742178”进行下载,文中所有程序均在其中。

1 api.py http多用户并行

1.1 fastapi并行

        ChatGLM-6B工程的api.py是基于fastapi编写的http post服务程序。具体介绍及调用方式请参考上一篇博文。运行程序后,当多用户同时调用该http接口时,程序需要排队执行,即当前用户指令需要等待上一用户获取结果完成之后才进行执行。

        实现接口并行的关键在于去除create_item的async,相应程序如下所示,该函数段由RdFast小程序自动生成。我们可以根据如下描述编写程序,也可前往“https://download.csdn.net/download/suiyingy/87742178”进行下载,对应下载后的api_http_one_worker.py文件。

#该函数段由RdFast小程序自动生成

from pydantic import BaseModel
class User(BaseModel):
    prompt: str
    history: list

@app.post("/http/noasync")
def create_item(request: User):
    global model, tokenizer
    json_post_raw = request.dict()
    json_post = json.dumps(json_post_raw)
    json_post_list = json.loads(json_post)
    prompt = json_post_list.get('prompt')
    history = json_post_list.get('history')
    max_length = json_post_list.get('max_length')
    top_p = json_post_list.get('top_p')
    temperature = json_post_list.get('temperature')
    response, history = model.chat(tokenizer,
                                   prompt,
                                   history=history,
                                   max_length=max_length if max_length else 2048,
                                   top_p=top_p if top_p else 0.7,
                                   temperature=temperature if temperature else 0.95)
    now = datetime.datetime.now()
    time = now.strftime("%Y-%m-%d %H:%M:%S")
    answer = {
        "response": response,
        "history": history,
        "status": 200,
        "time": time
    }
    log = "[" + time + "] " + '", prompt:"' + prompt + '", response:"' + repr(response) + '"'
    print(log)
    torch_gc()

        我们通过输入“你好”来进行测试,并模拟三个用户进行同时访问。修改之前三个用户获取返回结果所需时间分别为2.08s、4.05s和6.02s,而修改之后获取结果所需时间分别为6.73s、6.78和6.88s。修改前程序顺序执行,最后一个用户获取结果所需时间为6.02s。修改后程序是并行执行的,三个用户几乎同时获得访问结果。

        由于模型参数在多个线程之间是共享的,且多线程状态下程序会交替运行,因此多线程状态下获取结果的总时间反而增加了。因此,这种修改并不适合http模式,比较适合于websocket流式输出。模拟多用户调用的测试程序如下所示。

import json
import time
import requests
import threading

def get_ans(id, prompt):
    t0 = time.time()
    headers = {'Content-Type': 'application/json'}
    url = 'http://IP:Port/http/noasync'
    data = {'prompt': prompt, 'history': []}
    data = json.dumps(data)
    reponse = requests.post(url=url, data=data, headers=headers)
    print(id, '耗时为:', round(time.time() - t0, 2), 's,结果为:', reponse .text)

if __name__ == '__main__':
    t1 = threading.Thread(target=get_ans, args=('线程1', '你好'))
    t2 = threading.Thread(target=get_ans, args=('线程2', '你好'))
    t3 = threading.Thread(target=get_ans, args=('线程3', '你好'))
    t1.start()
    t2.start()
    t3.start()

1.2 fastapi多线程并行

        fastapi多线程通过启动参数workers来进行控制。如果程序直接将api.py中的workers设置为大于1的数值,即“uvicorn.run(app, host='0.0.0.0', port=8000, workers=2)”,那么会报错“WARNING:  You must pass the application as an import string to enable 'reload' or 'workers'.”,报错后程序退出并停止执行。正确修改为“uvicorn.run('api:app', host='0.0.0.0', port=8000, workers=2)”,其中api表示当前python文件名称。

        这相当于各个线程分别运行api.py文件的app,运行次数由workers决定。从这里可以看到,程序并不能识别’__main__’函数中的变量,因此要把模型定义放在全局位置,如下所示,否则会报错误“NameError: name 'model' is not defined”。

app = FastAPI()
tokenizer = AutoTokenizer.from_pretrained("chatglm-6b-int4-qe", trust_remote_code=True)
model = AutoModel.from_pretrained("chatglm-6b-int4-qe", trust_remote_code=True).half().cuda()
model.eval()

        在多线程情况下,类似上一节,无论是否使用asnc,程序运行时间基本一致。但是,基本显存会随着线程数量增多而增加。实际运行时,单个线程应需要10GB左右显存,包括模型加载和推理。各个线程数量下的模型加载显存如下所示。而1.1节的方法中单个线程仅需要3939MB。

Workers=1, 7329MB
Workers=2, 17875MB
Workers=3, 24843MB
Workers=4, 31811MB
Workers=5, 38779MB

        我们可以根据上述描述编写程序,也可前往“https://download.csdn.net/download/suiyingy/87742178”进行下载,对应下载后的api_http_three_worker.py文件。

2 api.py websocket多用户并行

        Fastapi websocket的创建方法如下所示,该示例程序来源于RdFast小程序自动生成。

#该示例程序来源于RdFast小程序自动生成。
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
app = FastAPI()
connected_websockets = {}
@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: str):
    await websocket.accept()
    connected_websockets[client_id] = websocket
    try:
        while True:
            # 接收客户端websocket发送过来的信息
            data = await websocket.receive_text()
            # 将接收到的信息通过所有已连接的websocket广播给其他客户端
            for ws in connected_websockets.values():
                await ws.send_text(f"Client {client_id}: {data}")
    except WebSocketDisconnect:
        # 连接断开时,从已连接的客户端中移除
        del connected_websockets[client_id]

        将上述程序与ChatGLM结合即可实现ChatGLM的websocket api接口。示例程序如下所示:

@app.websocket("/ws/{client_id}")
async def websocket_endpoint(ws: WebSocket, client_id: str):
    await ws.accept()
    print('已连接')
    try:
        while True:
            # 接收客户端websocket发送过来的信息
            data = await ws.receive_text()
            print('收到消息:', data)
            resp0 = ''
            for response, history in model.stream_chat(tokenizer, data, [], max_length= 2048,top_p= 0.7, temperature= 0.95):
                print('response:', response)
                res = response.replace(resp0, '')
                resp0 = response
                await ws.send_text(res)
            await ws.send_text('<rdfast stop>')#自定义结束符
    except WebSocketDisconnect:
        print('连接已断开')

        我们可以根据上述描述编写程序,也可前往“https://download.csdn.net/download/suiyingy/87742178”进行下载,对应下载后的api_http_one_worker.py文件。Websocket测试程序如下所示。

from websocket import create_connection
def connect_node(ques):
    ans = ''
    url = "ws://IP:Port/ws/2"
    ws = create_connection(url)
    ws.send(ques)
    while True:
        try:
            recv_text = ws.recv()
            print(recv_text)
            if '<rdfast stop>' in recv_text:
                print('break')
                break
            ans += recv_text
        except Exception as e:
            print('except: ', str(e))
            recv_text = ws.recv()
            break
    print(ans)
    ws.close()
connect_node('你好')

        类似http接口,使用async时多用户调用websocket将排队获取结果。此时,程序去除async之后无法获取结果。使用1.2中多线程启动方式则可以实现多用户同时获得结果,程序基本一致,也可参考“https://download.csdn.net/download/suiyingy/87742178”的api_http_three_worker.py。

        另外,不同的python包所支持的工作方式不同。例如,websocket-server支持多用户同时调用websocket接口,安装方式为“pip install websocket-server”。运行程序时可能会出现错误提示“KeyError: 'upgrade'”,但这不影响结果获取。websocket-server ChatGLM相应程序见“https://download.csdn.net/download/suiyingy/87742178”的api_ws.py程序。

3 web_demo.py多用户并行

        Web_demo.py默认状态下多用户会排队访问,使用下面命令启动时可同时获取结果。concurrency_count表示最多可同时获取结果的用户数,即并发数。max_size表示排队的数量,即最多允许多少个用户处于排队状态。使用时只需将web_demo.py的最后一行替换成如下启动方式即可。Web_demo2.py采用streamlit实现,默认支持多用户同时访问。

demo.queue(
    concurrency_count=5,
    max_size=500).launch(share=False,
                inbrowser=True,
                server_name="0.0.0.0",
                server_port=8000)

      本文来源于AIGC专栏《Python从零开始进行AIGC大模型训练与推理》,地址为“https://blog.csdn.net/suiyingy/article/details/130169592”。

文章内容将在下方公众号内同步更新。文章来源地址https://www.toymoban.com/news/detail-473003.html

到了这里,关于ChatGPT平替- ChatGLM多用户并行访问部署的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 类ChatGPT项目的部署与微调(下):从ChatGLM-6b到ChatDoctor

    随着『GPT4多模态/Microsoft 365 Copilot/Github Copilot X/ChatGPT插件』的推出,绝大部分公司的技术 产品 服务,以及绝大部分人的工作都将被革新一遍 类似iPhone的诞生 大家面向iOS编程 有了App Store 现在有了ChatGPT插件/GPT应用商店,以后很多公司 很多人面向GPT编程(很快技术人员

    2023年04月10日
    浏览(47)
  • 类ChatGPT的部署与微调(下):从ChatGLM-6b到ChatDoctor、可商用

    随着『GPT4多模态/Microsoft 365 Copilot/Github Copilot X/ChatGPT插件』的推出,绝大部分公司的技术 产品 服务,以及绝大部分人的工作都将被革新一遍 类似iPhone的诞生 大家面向iOS编程 有了App Store 现在有了ChatGPT插件/GPT应用商店,以后很多公司 很多人面向GPT编程(很快技术人员

    2023年04月26日
    浏览(43)
  • 云服务器部署开源ChatGLM-6B,让你也能拥有自己的ChatGPT

    一、背景 最近GPT不仅发布了GPT-4,而且解除封印可以联网了。不得不赞叹AI更新迭代的速度真快,都跟不上节奏了。但是大家也注意到了吧,随着GPT的每次更新,OpenAI对其开放使用的限制也越来越大。之前国内网随便访问GPT3,现在动不动就封号 所以,今天就来教大家部署国内

    2024年02月12日
    浏览(58)
  • 类ChatGPT的部署与微调(下):从ChatGLM、MOSS到ChatDoctor、可商用

    随着『GPT4多模态/Microsoft 365 Copilot/Github Copilot X/ChatGPT插件』的推出,绝大部分公司的技术 产品 服务,以及绝大部分人的工作都将被革新一遍 类似iPhone的诞生 大家面向iOS编程 有了App Store 现在有了ChatGPT插件/GPT应用商店,以后很多公司 很多人面向GPT编程(很快技术人员

    2024年02月01日
    浏览(43)
  • 类ChatGPT的部署与微调(下):从GLM、ChatGLM到MOSS、ChatDoctor、可商用

    随着『GPT4多模态/Microsoft 365 Copilot/Github Copilot X/ChatGPT插件』的推出,绝大部分公司的技术 产品 服务,以及绝大部分人的工作都将被革新一遍 类似iPhone的诞生 大家面向iOS编程 有了App Store 现在有了ChatGPT插件/GPT应用商店,以后很多公司 很多人面向GPT编程(很快技术人员

    2024年02月04日
    浏览(45)
  • 手把手教你本地CPU环境部署清华大模型ChatGLM-6B,利用量化模型,本地即可开始智能聊天,达到ChatGPT的80%

    大家好,我是微学AI,今天教你们本地CPU环境部署清华大ChatGLM-6B模型,利用量化模型,每个人都能跑动大模型。ChatGLM-6B是一款出色的中英双语对话模型,拥有超过62亿个参数,可高效地处理日常对话场景。与GLM-130B模型相比,ChatGLM-6B在对话场景处理能力方面表现更加卓越。此

    2024年02月01日
    浏览(49)
  • 推荐 ChatGpt 平替介绍文章

    chenking2020/FindTheChatGPTer: 汇总那些ChatGPT的平替们 (github.com) Alpaca https://github.com/tatsu-lab/stanford_alpaca Alpaca DEMO: https://alpaca-ai-custom6.ngrok.io OpenChatKit https://github.com/togethercomputer/OpenChatKit ChatGLM https://github.com/THUDM/ChatGLM-6B ChatYuan https://github.com/clue-ai/ChatYuan Colossal AI https://github.com/hpca

    2024年02月03日
    浏览(39)
  • 全网最新版ChatGLM-6B开源模型环境详细部署及安装——如何在低显存单显卡上面安装私有ChatGPT GPT-4大语言模型

    ChatGPT的爆火让许多公司和个人都想要开发自己的大型语言模型,但是,由于算力和语言模型开发能力等诸多方面的限制,许多人最终都只能在开发的早期阶段止步不前。然而,近期清华大学知识工程和数据挖掘小组(Knowledge Engineering Group (KEG) Data Mining at Tsinghua University)发布

    2024年02月05日
    浏览(71)
  • ChatGPT开源平替(2)llama

            最近,FacebookResearch 开源了他们最新的大语言模型 LLaMA,训练使用多达14,000 tokens 语料,包含不同大小参数量的模型 7B、13B 、30B、 65B,研究者可以根据自身算力配置进行选择。         经过测试,(1)在算力要求上, 7B的模型,需要19G显存要求 ,单卡

    2024年02月01日
    浏览(69)
  • 狂追ChatGPT:开源社区的“平替”热潮

    目前,不少优质的类ChatGPT模型都只能通过API接入,而一些开源LLM的效果与ChatGPT相比差距不小。不过,近期开源社区开始密集发力了。 其中,Meta的LLaMA模型泄漏是开源“ChatGPT”运动的代表性事件。基于LLaMA模型,开源社区近期接连发布了ChatLLaMa、Alpaca、Vicuna、Koala等模型,效

    2023年04月25日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包