最早接触的开源大模型是ChatGLM-6B,其中提供了一个脚本api.py,使用该脚本运行的模型是同步的,也就是说,第二次请求需要等待第一次请求完成后才能运行。
在后来的ChatGLM2-6B中,提供了一个新的脚本openai_api.py,使用该脚本可以并行的执行请求。
在脚本openai_api.py,采用PyTorch + GPU 并行计算:使用 CUDA Streams,使多个推理任务能够并发运行。
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
ChatGLM2-6B 本身支持流式生成,在 predict() 函数里,使用了 model.stream_chat() 进行 流式推理(streaming inference),它允许生成 部分 结果后立即返回,而不是等待整个文本生成完毕。
for new_response, _ in model.stream_chat(tokenizer, query, history):
在ChatGLM-6B中,add api_stream,return the response of the stream_chat by asynchronously
增加了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": []}'
1、经测试,model.stream_chat可以并发 2、api_stream.py里是开新线程调用model.stream_chat的 3、从客户端来看,是可以并发返回请求的 4、如果有多张卡,可以用CUDA_VISIBLE_DEVICES指定GPU,将api_stream起到不同的端口上,考虑到同一个IP推理一个问题要对应到一个应用上,可以用haproxy、nginx等工具代理后端服务