一、简介
流式输出就是一边生成一边输出结果,而不需要所有的结果都输出完成。流式传输是一种HTTP协议的特性,它允许服务器在响应数据准备好之前就开始向客户端发送数据。当数据准备好之后,服务器会将其作为一个或多个“块”传输到客户端,直到响应完成。
流式传输通常用于需要实时更新数据的应用程序,例如聊天应用程序、股票报价等。使用流式传输,客户端可以在服务器更新数据时实时接收更新,而无需等待完整的响应。
二、背景
最近在部署Fastchat的vicuna-7b-v1.5-16k, Fastchat本身没有流式输出的serve,所以查找了一些资料,我的参考资料为FastChat+vicuna1.1部署与流式调用实践 - 知乎
三、实现流式输出
1. 在 FastChat/fastchat/serve/ 目录下增加 api_stream.py
脚本
2. 在 FastChat/fastchat/protocol/ 目录下增加chat_completion.py 脚本
这两个脚本都在上面给的参考资料里博主的github代码库中下载,所在目录同上⬆️GitHub - little51/FastChat: An open platform for training, serving, and evaluating large languages. Release repo for Vicuna and FastChat-T5.
🌟如果你懒得去找,可以直接百度网盘提取,永久有效!!!
【超级会员V4】我通过百度网盘分享的文件:chat_com....py等2个文件
链接:https://pan.baidu.com/s/1QyYlhtt3PlGCoIgfUyRBLA
提取码:f4b5
复制这段内容打开「百度网盘APP即可获取」
3. 依次拉起下面几个服务
🌟使用nohup拉起配合结尾的&使用,可以实现在后台运行
🌟使用ps aux |grep fastchat查看三个服务都是拉起状态就算成功
# 拉起controller
nohup python3 -m fastchat.serve.controller &
# 拉起model_worker,注意至少有20G显存或者40G内存
nohup python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-7b-v1.5-16k &
# 拉起api_stream,指定一个端口,我这里给的8087
FASTCHAT_CONTROLLER_URL=http://localhost:21001 CUDA_VISIBLE_DEVICES=1 nohup python -u -m fastchat.serve.api_stream --host 0.0.0.0 --port 8087 >> fastchat.log 2>&1 &
四、流式输出测试
把命令写到文件里运行文件即可:
# 在FastChat目录下创建文件flow_api.sh
touch flow_api.sh
# 将下面的内容写进flow_api.sh
curl http://localhost:8087/v1/chat/completions/stream \
-H "Content-Type: application/json" \
-d '{"model": "vicuna-7b-v1.5-16k","messages": [{"role": "user", "content": "请写一篇100字的日记"}]}'
# 执行该文件,输出为flow_api.out日志
sh flow_api.sh <flow_api.out
⚠️注意这个判断逻辑:
测试用curl多次发post请求,直到遇到[stop]
停用词说明取完了推理结果。同一个生成结果,执行两次在第二次出现了[stop]
停用词,说明实现了流式输出。