ChatGLM-6B icon indicating copy to clipboard operation
ChatGLM-6B copied to clipboard

add api_stream,return the response of the stream_chat by asynchronously

Open little51 opened this issue 2 years ago • 2 comments

增加了api_stream.py,实现了将stream_chat同步调用以异步方式提供给http请求。stream_chat的结果存放在定时清理的缓存中,客户端通过多次发送post请求从缓存中获取response,直到遇到停止词[stop]时停止请求。调用方式如下: curl -X POST "http://127.0.0.1:8000/stream"
-H 'Content-Type: application/json'
-d '{"prompt": "你好", "history": []}'

little51 avatar Apr 08 '23 09:04 little51

请问,这种多线程调用同一个模型,能不能实现异步效果? 因为我测试了一下,感觉所有请求还是在排队处理,前一个完全处理完,才处理下一个。 还望解答。

ninghongbo123 avatar Apr 20 '23 16:04 ninghongbo123

1、经测试,model.stream_chat可以并发 2、api_stream.py里是开新线程调用model.stream_chat的 3、从客户端来看,是可以并发返回请求的 4、如果有多张卡,可以用CUDA_VISIBLE_DEVICES指定GPU,将api_stream起到不同的端口上,考虑到同一个IP推理一个问题要对应到一个应用上,可以用haproxy、nginx等工具代理后端服务

little51 avatar Apr 21 '23 02:04 little51

1、经测试,model.stream_chat可以并发 2、api_stream.py里是开新线程调用model.stream_chat的 3、从客户端来看,是可以并发返回请求的 4、如果有多张卡,可以用CUDA_VISIBLE_DEVICES指定GPU,将api_stream起到不同的端口上,考虑到同一个IP推理一个问题要对应到一个应用上,可以用haproxy、nginx等工具代理后端服务

用gunicorn部署,起2个worker,客户端请求一次服务端会同时响应两次结果

ZTurboX avatar May 19 '23 01:05 ZTurboX

我这种机制有缺点,workers应该是起了两个python进程,前后两次的请求由于没有session保持,且两个进程的缓存之间没有内存共享,所以出来两个结果。对于这种类似于有状态的应用,建议用haproxy之类的能做session保持的代理工具分发流量

little51 avatar May 19 '23 05:05 little51

我这种机制有缺点,workers应该是起了两个python进程,前后两次的请求由于没有session保持,且两个进程的缓存之间没有内存共享,所以出来两个结果。对于这种类似于有状态的应用,建议用haproxy之类的能做session保持的代理工具分发流量

用ngnix可以做吗

ZTurboX avatar May 21 '23 04:05 ZTurboX

nginx做负载均衡可以,但做带session保持还要额外的设置,我也没深究过。haproxy在生产系统上用过,没有问题,配置也很简单,如有需要,可给我发邮件到[email protected],我把haproxy给你。

little51 avatar May 21 '23 10:05 little51

nginx可以做按源IP的负载均衡,确保同一个IP的请求指到同一个服务端口上,但在实际场景中,往往nginx不是入口反向代理,在nginx之前如果还有防火墙NAT之类的,就没办法用这个特性。

little51 avatar May 21 '23 10:05 little51