PaddlePaddle / PaddleNLP

👑 Easy-to-use and powerful NLP and LLM library with 🤗 Awesome model zoo, supporting wide-range of NLP tasks from research to industrial applications, including 🗂Text Classification, 🔍 Neural Search, ❓ Question Answering, ℹ️ Information Extraction, 📄 Document Intelligence, 💌 Sentiment Analysis etc.
https://paddlenlp.readthedocs.io
Apache License 2.0
12.16k stars 2.94k forks source link

[Question]: Taskflow 服务化部署 持续多次推理,严重内存泄漏 #6596

Open renardbebe opened 1 year ago

renardbebe commented 1 year ago

系统环境

- 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内存保持稳定,不再增长。

image

复现代码片段

# 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()

辛苦开发团队帮助进行确认和排查,目前这个问题比较影响使用,万分感谢🙏

tim20112017 commented 1 year ago

应该是你代码的问题。 你的TASK虽然是全局的,但是每次初始化,都会生成一个新的TASK对象,所以内存才会高。

你试着判断TASK为空,来加载TASK试试。

renardbebe commented 1 year ago

@tim20112017 你好,感谢回答。我们这里是封装了一个rpc服务,预期功能是TaskFlow在服务启动时初始化一次,之后多次持续在rpc接口响应逻辑中被调用进行推理。

这段代码中,模型初始化(load_model)只会执行一次,服务端日志也确认只被调用了一次。

且我尝试在TASK = Taskflow(...)之前加了if TASK is None:后,启动服务并持续多次调用时,仍然出现内存持续稳定增长的情况。

renardbebe commented 1 year ago

3429 #6354 目前所遇到的现象和这两个issue高度类似,部署方式也基本相同,是否paddlenlp serving pipeline也存在内存泄漏的问题?

zhh8689 commented 11 months ago

我也遇到了这个问题,显存不能正常释放。有解决的嘛?

w5688414 commented 6 months ago

推荐用户使用fastdeploy的方式,支持高并发。fastdeploy UIE服务化部署链接:

https://github.com/PaddlePaddle/FastDeploy/blob/develop/examples/text/uie/README_CN.md?plain=1

Huangswust182 commented 3 months ago

适用了使用fastdeploy的方式部署,还是有显存不断增长的问题