通过ThreadPoolExecutor异步执行model.chat 保证多路同时请求能并发响应.
[THUDM/ChatGLM-6B]API server支持更好的并发
回答
参考 #808 使用pydantic定义请求/相应结构.
WEB API 使用pydantic定义输入和输出结构后,可以支持chat_stream模式吗? 另外,如果是单卡,在使用CHAT_STREAM模式的时候,发现同时多人询问,问题会串到不同人的问题中,如何解决。 还有多卡的话,在不同的端口号上启动多个进程响应询问服务,外面通过NGINX统一一个端口上进行转发,是不是也会遇到上面,问答会 串的问题?
这个PR并不能实现真正意义上的单卡并发,多请求排队可能都有问题,所以直接关了。
CHAT_STREAM的话,需要换一下thread pool的执行方式,单个session的流反馈用同步方式来执行。
多卡反而比较好搞,FASTAPI本身是支持多worker模式的,根据卡的数量开worker,注意一下worker初始化阶段通过CUDA_VISABLE_DEVICE或者类似的方式控制一下就可以了。
def model_stream_predict(input_text, max_length, top_p, temperature, history=[]):
global model, tokenizer
next_response_index = 0
for response, history in model.stream_chat(tokenizer, input_text, history=history, max_length=max_length,
top_p=top_p,
temperature=temperature):
if len(response) > next_response_index:
yield response[next_response_index:]
next_response_index = len(response)
# print(history)
torch_gc()
@app.post("/stream_chat")
async def create_stream_chat(params: Params) -> StreamingResponse:
model_response = model_stream_predict(
params.prompt,
history=params.history,
max_length=params.max_length,
top_p=params.top_p,
temperature=params.temperature
)
return StreamingResponse(
content = model_response,
status_code=status.HTTP_200_OK,
media_type="text/html",
)
“需要换一下thread pool的执行方式,单个session的流反馈用同步方式来执行”这个实例代码是不是可以参考这个“通过ThreadPoolExecutor异步执行model.chat 保证多路同时请求能并发响应.” 这个代码实现?
还有一个问题请教,FASTAPI本身是支持多worker模式的,根据卡的数量开worker,注意一下worker初始化阶段通过CUDA_VISABLE_DEVICE或者类似的方式控制一下就可以了。这个有示例吗?怎么设置比较合理?
还有一个问题请教,FASTAPI本身是支持多worker模式的,根据卡的数量开worker,注意一下worker初始化阶段通过CUDA_VISABLE_DEVICE或者类似的方式控制一下就可以了。这个有示例吗?怎么设置比较合理?
还有一个问题请教,FASTAPI本身是支持多worker模式的,根据卡的数量开worker,注意一下worker初始化阶段通过CUDA_VISABLE_DEVICE或者类似的方式控制一下就可以了。这个有示例吗?怎么设置比较合理?
看了一下fastapi/uvicorn的文档,因为没有简单的方法传递workerid信息, 就不能方便的去绑定对应的GPU,看起来也不是很方便。还是前置一个HTTP Server 做负载均衡,根据对应GPU个数,启动worker来的更直接一些吧。
On Sat, May 27, 2023 at 11:18 PM hellocxj @.***> wrote:
还有一个问题请教,FASTAPI本身是支持多worker模式的,根据卡的数量开worker,注意一下worker初始化阶段通过CUDA_VISABLE_DEVICE或者类似的方式控制一下就可以了。这个有示例吗?怎么设置比较合理?
— Reply to this email directly, view it on GitHub https://github.com/THUDM/ChatGLM-6B/pull/1018#issuecomment-1565490393, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAAY5FYUMCI4RIH7KW22PDXIILKRANCNFSM6AAAAAAYBHMFDA . You are receiving this because you modified the open/close state.Message ID: @.***>
“需要换一下thread pool的执行方式,单个session的流反馈用同步方式来执行”这个实例代码是不是可以参考这个“通过ThreadPoolExecutor异步执行model.chat 保证多路同时请求能并发响应.” 这个代码实现?
请问一下这个问题有解决方案吗?我也遇到了类似的问题,在sse流式输出的时候同步执行时,问题会串到不同人的问题中,从而出现ASGI application的报错,请问一下能否实现stream下不相互干扰的多并发?谢谢!
另外,如果是单卡,在使用CHAT_STREAM模式的时候,发现同时多人询问,问题会串到不同人的问题中,如何解决。
请问一下您解决这个问题了吗?感谢!