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

[BUG/Help] 单卡用2个worker启动api,GPU占用x2,但是有多个请求时并没有并行运行model

Open tophgg opened this issue 1 year ago • 17 comments

Is there an existing issue for this?

  • [X] I have searched the existing issues

Current Behavior

单卡通过uvicorn用2个worker启动api,GPU实际占用了20G,但是同一时间处理2个请求时,他们并没有并行运行model

Expected Behavior

在单卡、显存支持下,能通过多开进程让多用户访问

Steps To Reproduce

在V100-32GB单卡 使用chatglm2-6b-int4模型,启动api.py 1.在workers=1时,GPU占用5.5G 2.在workers=2时,GPU占用20G 3.分别启动不同端口的2个workers=1的api.py进程,GPU占用10G

在2,3情况下模型应该都起来,能成功运行并占用GPU。

同一个问题,一个线程直接请求只耗时2.3s。 同一个问题,在测试脚本同时开2个线程同时请求,总耗时4.6s才返回;

开启多个进程的情况下,似乎还是在用同一个模型进行推理,想问这是我的姿势不对还是说这是模型在同一时间只能被单卡执行,多余的GPU只能浪费?

#全局定义model
app = FastAPI()
tokenizer = AutoTokenizer.from_pretrained("/root/chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("/root/chatglm2-6b-int4", trust_remote_code=True).half().cuda()
model.eval()

#...

if __name__ == '__main__':
    uvicorn.run("api:app", host='0.0.0.0', port=6006, workers=2)

Environment

- OS: linux
- Python: 3.8
- Transformers: 4.30.2
- PyTorch: 2.0.0
- CUDA Support (`python -c "import torch; print(torch.cuda.is_available())"`) :

Anything else?

No response

tophgg avatar Jun 28 '23 09:06 tophgg

多个模型实例同时跑,得参考fastchat或者torchserve使用多进程分别加载模型服务了吧 但为啥api.py这样不行,也不太懂,同求一个原理解释

supdizh avatar Jun 30 '23 03:06 supdizh

问题解决了吗

qdx1997 avatar Jul 04 '23 09:07 qdx1997

可以试试用triton server,可以加载多个实例

Kevinddddddd avatar Jul 05 '23 07:07 Kevinddddddd

同问,2个进程,分别加载2个模型,最后还是串行的

TTyb avatar Jul 11 '23 07:07 TTyb

可以试试用triton server,可以加载多个实例

你好,请问你试过triton框架部署glm-6b这种chat模型并行请求成功了吗?我想了解下大概多少GPU显存级别能并行多用户实例?

我查阅了下资料,还没找到相关例子,想尝试在autodl上部署 但是他不支持docker。。

tophgg avatar Jul 11 '23 08:07 tophgg

同问

850tomato avatar Jul 12 '23 13:07 850tomato

可以试试用triton server,可以加载多个实例

你好,请问你试过triton框架部署glm-6b这种chat模型并行请求成功了吗?我想了解下大概多少GPU显存级别能并行多用户实例?

我查阅了下资料,还没找到相关例子,想尝试在autodl上部署 但是他不支持docker。。

autodl和揽舟什么的gpu租用都不是物理机,都是虚拟机,虚拟机里没法再装docker

Alwin4Zhang avatar Jul 20 '23 01:07 Alwin4Zhang

同问

wdmmxlbt avatar Aug 05 '23 16:08 wdmmxlbt

你好 请问解决了吗?

VirgilG72 avatar Oct 30 '23 07:10 VirgilG72

已收到,谢谢

TTyb avatar Oct 30 '23 07:10 TTyb

workers=2时,显存比开两个端口多一倍,是应为代码这么写模型会加载4次

guo-xiaomeng avatar Nov 10 '23 06:11 guo-xiaomeng

workers=2时,显存比开两个端口多一倍,是应为代码这么写模型会加载4次

请问一下为什么一个worker会加载两次模型呢,应该怎么写才能一个worker对应一个模型

CharlieLzy avatar Nov 15 '23 05:11 CharlieLzy

用以下方式,开启多进程一定会失败,因为虽然workes为2,但是整个api.py文件会加载5次,所以会特别占内存,并且还是串行的方式。

if __name__ == '__main__':
    uvicorn.run("api:app", host='0.0.0.0', port=6006, workers=2)

多进程一定要用命令行的方式才能成功

gunicorn api:app --worker-class uvicorn.workers.UvicornWorker --workes 2

YYGe01 avatar Nov 22 '23 07:11 YYGe01

同问

zzylydx avatar Apr 17 '24 01:04 zzylydx

已收到,谢谢

TTyb avatar Apr 17 '24 01:04 TTyb

您好,请问解决了么。我现在测试也是这样,同时请求,但实际上就是串行执行的

GoodDayUp avatar Jun 06 '24 02:06 GoodDayUp

已收到,谢谢

TTyb avatar Jun 06 '24 02:06 TTyb