聊聊ChatGLM3多用户并发API调用的问题
背景
目前在公司内部4张A10的GPU服务器上部署了ChatGLM3开源模型;然后部署了官方默认的web_demo、api_demo两种模式;重新设计了前端,支持H5和安卓两个客户端调用。但却发现了不能并发访问的问题。
问题现象
在安卓与H5同时调用ChatGLM的API接口(流式接口)时,其中有一个客户端的返回是正常的,而另一个客户端返回却是乱码(解码后是空数据),同时模型报错。报错内容与问题请看issue。



官方回复如下:

后来我测试用多卡部署模型,比如3卡,此时可以支持3个以下的用户调用,但再多就不行了。
问题分析
由于非AI相关科班出身也不是专门做这个的,因此一下子还有点棘手;后来在智谱AI开放平台的使用指南-速率限制指南 一文中,发现其支持并发调用,只是说有并发数限制。因此我分析来说,应该是放出来的模型与开放平台上的模型有一定的区别,而这个区别就在于模型的并发能力。毕竟外部API调用时,最终还是调用模型内部的流式接口/非流式接口。也就是说,这个模型内部的接口并不支持并行计算。
从模型的内部来说,其是transformer神经网络结构,但其并发能力却没有这么简单,毕竟模型涉及到的计算量是巨大的。归根来说,还是transformer的并行计算能力。
后来找到个遇到同样情况的博文,不过和我们的部署方式还是有区别的。mosec部署chatglm2-6B 一文中分析了下其遇到的问题与解决方案,至此我大概也清楚了并发调用模型API时为什么会返回乱码(空数据)。
原因与解决策略
当并发调用时,其中模型已经处理完了一个request后,返回的tensor识别了eos_token,模型会认为已经处理完了所有的request,因此返回空数据。
那么从这里来说的话,我暂时想到的解决策略:模型内部按batch来处理request。
这个代码不好改,应该有开源的实现和解决策略。后来我又想到了LLaMA-Factory这个微调框架,他们也是有api_demo的,应该也会遇到这样的问题,因此提了个Issue,还好最终有另外的解,见issue。


LLaMA-Factory官方通过vllm实现了并发流式,暂时还没验证,简单看了下代码,理论上是冒得问题的:



首发于个人公众号

聊聊ChatGLM3多用户并发API调用的问题的更多相关文章
- 【转】Objc的底层并发API
本文由webfrogs译自objc.io,原文作者Daniel Eggert.转载请注明出处! 小引 本篇英文原文所发布的站点objc.io是一个专门为iOS和OS X开发者提供的深入讨论技术的平台, ...
- Objc的底层并发API
本文由webfrogs译自objc.io,原文作者Daniel Eggert.转载请注明出处! 小引 本篇英文原文所发布的站点objc.io是一个专门为iOS和OS X开发者提供的深入讨论技术的平台, ...
- Objc的底层并发API(转)
本文由webfrogs译自objc.io,原文作者Daniel Eggert. 小引 本篇英文原文所发布的站点objc.io是一个专门为iOS和OS X开发者提供的深入讨论技术的平台,文章含金量很 ...
- 039.Python使用TCP实现多用户并发
使用TCP实现多用户并发 在前面的实验中,TCP建立连接时,只能允许一个用户连接,当第二个用户建立连接时,发送的信息,服务端是没有办法接受,只有当第一个用户退出时,才能接受到第二个用户的请求,并实现通 ...
- Vue.js——使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
概述 上一篇我们介绍了如何使用vue resource处理HTTP请求,结合服务端的REST API,就能够很容易地构建一个增删查改应用.这个应用始终遗留了一个问题,Web App在访问REST AP ...
- 信鸽推送 .NET (C#) 服务端 SDK rest api 调用库(v1.2)
信鸽推送 .NET 服务端 SDK rest api 调用库-介绍 该版本是基于信鸽推送v2版本的时候封装的,先拿出来与大家分享,封装还还凑合,不依赖其他http调用件,唯一依赖json序列化dll ...
- xmlrpc实现bugzilla api调用(无会话保持功能,单一接口请求)
xmlrpc实现bugzilla4 xmlrpc api调用(无会话保持功能,单一接口请求),如需会话保持,请参考我的另外一篇随笔(bugzilla4的xmlrpc接口api调用实现分享: xml ...
- FormatMessage与GetLastError配合使用,排查windows api调用过程中的错误
前一段时间在学习windows api调用过程中,遇到过一些调用错误或者程序没能显示预期的结果,或者直接出现vc运行时错误. 这对新手来说是司空见惯的事,因为不太熟悉难免会出错,出错的信息如果能显示很 ...
- Sphinx中文分词安装配置及API调用
这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...
- (36)老版和新版API调用
---------更新时间18:06 2016-09-18 星期日------- *前言 我用的是odoo8,但里面有相当多的api是以前版本,这时若我们自己开发的 插件采用新版本api,里面 ...
随机推荐
- npm模块全局安装后无法使用解决方案
好家伙 npm模块全局安装后无法使用 估计是少配了环境变量 1.使用命令: npm config get prefix 找到全局包的安装位置 2.随后我们右键"我的电脑"打 ...
- 【Azure 事件中心】EventHub 中同一条消息不停的推送给消费端问题记录
问题描述 EventHub 中同一条消息,不停的推送给消费端,查看日志发现错误: Caused by: com.azure.messaging.eventhubs.implementation.Par ...
- Android Handler实现子线程与子线程、主线程之间通信
一.子线程向主线程传值: 首选在主线程里创建一个Handler 1 Handler mHandler = new Handler(){ 2 @Override 3 public void handle ...
- 聚焦企业流程智能化发展新趋势,中国信通院2022 RPA创新产业峰会即将开启
机器人流程自动化(Robotic Process Automation,RPA)是数字时代的重要劳动力之一,流程的自动化.智能化运行是企业释放运营能效.提升客户服务水平的重要路径. 近年来,各行业对R ...
- 记spring boot启动出现Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.问题处理
今天拉下了一个新的springboot工程,启动时出现了Unable to start web server; nested exception is org.springframework.cont ...
- modalError.vue 错误提示框 vue2 iview
需求 一个错误提示框,后台需要有换行,默认没有换行,做一个支持换行的全局错误提示函数. 注意 代码只展示原理,直接不能使用,里面有getAc,有需要参考 https://www.cnblogs.com ...
- period 发音 per + iod 没有ri音 (per=round od=hod=way)
period 发音 per + iod 没有ri音 pɪər iə d peri-在周围 + od-=hod-路,引申词义时期,阶段,句号等. per = round period 美: [ˈpɪrɪ ...
- pod的拉取和重启策略
在Kubernetes中,Pod的拉取策略和重启策略可以通过YAML配置文件来定义. Pod的拉取策略 Pod的拉取策略指的是Kubernetes在创建或重启Pod时,如何获取Pod所需的容器镜像.这 ...
- 世界银行使用.NET 7开发的免费电子问卷制作系统Survey Solution
Survey Solution (下文简称SS) 是世界银行数据部开发的一套免费电子问卷制作系统, 官网地址为: https://mysurvey.solutions/, github地址:https ...
- ETL工具-KETTLE教程 实例实战4----转换(值映射、列转行,增加常量、增加序列等)
附:Kettle实战视频教程,需要的朋友可以看看学习下哈~~ kettle实战第一讲-文件和数据库表的互相转换处理_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili kettle实战第二讲-数据库单 ...