PaddleNLP
PaddleNLP copied to clipboard
[Question]: Taskflow 服务化部署 持续多次推理,严重内存泄漏
系统环境
- Nvidia Driver: 460.27.04
- cuda: 1.2
- cudnn: 8.1.1
软件环境
- paddlepaddle-gpu: 2.4.2.post112
- paddlenlp: 2.5.2
- onnx: 1.12.0
- onnxconverter-common: 1.13.0
- onnxruntime-gpu: 1.15.0
- paddle2onnx: 1.0.6
问题描述
构建了一个uie识别的rpc服务,服务内通过global定义了全局TASK,rpc接口每次会调用Taskflow进行推理。
在客户端持续发送请求的过程中发现,服务端的GPU显存稳定,但cpu memory以每分钟0.01GB的速度稳定增加,截止观测时间点,cpu内存从2G一直增长到13G+。在注释了对TASK的调用后,cpu内存保持稳定,不再增长。
复现代码片段
# rpc接口文件
class IdentifyService:
def __init__(self):
paddle_model.PaddleNlpModel.load_model()
async def Identify(self, ....):
paddle_model.PaddleNlpModel.predict(....)
return ....
# model文件
TASK = None
class PaddleNlpPredictor:
def __init__(self):
self.schema = ...
self.batch_size = ...
def load_model(self):
global TASK
TASK = Taskflow("information_extraction", schema=self.schema, model="uie-base", use_fast=True, precision='fp16', batch_size=self.batch_size)
def predict(self, ....):
predictions = TASK(texts)
return predictions
PaddleNlpModel = PaddleNlpPredictor()
辛苦开发团队帮助进行确认和排查,目前这个问题比较影响使用,万分感谢🙏
应该是你代码的问题。 你的TASK虽然是全局的,但是每次初始化,都会生成一个新的TASK对象,所以内存才会高。
你试着判断TASK为空,来加载TASK试试。
@tim20112017 你好,感谢回答。我们这里是封装了一个rpc服务,预期功能是TaskFlow在服务启动时初始化一次,之后多次持续在rpc接口响应逻辑中被调用进行推理。
这段代码中,模型初始化(load_model)只会执行一次,服务端日志也确认只被调用了一次。
且我尝试在TASK = Taskflow(...)
之前加了if TASK is None:
后,启动服务并持续多次调用时,仍然出现内存持续稳定增长的情况。
#3429 #6354 目前所遇到的现象和这两个issue高度类似,部署方式也基本相同,是否paddlenlp serving pipeline也存在内存泄漏的问题?
我也遇到了这个问题,显存不能正常释放。有解决的嘛?
推荐用户使用fastdeploy的方式,支持高并发。fastdeploy UIE服务化部署链接:
https://github.com/PaddlePaddle/FastDeploy/blob/develop/examples/text/uie/README_CN.md?plain=1
适用了使用fastdeploy的方式部署,还是有显存不断增长的问题