PaddleOCR icon indicating copy to clipboard operation
PaddleOCR copied to clipboard

PaddleOCR-VL循环predict请求时内存增加不释放问题

Open fhkankan opened this issue 1 month ago • 17 comments

🔎 Search before asking

  • [x] I have searched the PaddleOCR Docs and found no similar bug report.
  • [x] I have searched the PaddleOCR Issues and found no similar bug report.
  • [x] I have searched the PaddleOCR Discussions and found no similar bug report.

🐛 Bug (问题描述)

PaddleOCR-VL采用vllm部署后,300多张图片循环请求predict时,出现内存由2G占用不断增加到10G不释放,是否存在内存泄漏?如何改善?

客户端和服务端是k8s中的一个pod,2个容器,每个容器都用了一张A100的卡。

发现客户端的内存增长不释放,客户端的容器内,使用nvidia-smi看了下GPU是有资源使用的

实测,在predict后加gc.collect(),上涨降低(2G到6G),但是还是逐个累加

🏃‍♂️ Environment (运行环境)

os centos7.9

python 3.12

CPU. intel
GPU A100

🌰 Minimal Reproducible Example (最小可复现问题的Demo)

from paddleocr import PaddleOCRVL

pipeline = PaddleOCRVL(
    layout_detection_model_name="PP-DocLayoutV2",
    layout_deteection_model_dir="/models/PP-DocLayoutV2",
    vl_rec_backend="vllm-server",
    vl_rec_server_url="http://127.0.0.1:8000/v1",
)

async def parse_file(file_base64):
    result = pipeline.predict(file_base64)
    result = [res.json for res in result]
    return result


fhkankan avatar Nov 17 '25 11:11 fhkankan

一样的问题,GPU还可以调用cuda.empty_cache(),NPU设备没法清缓存,运行一段时间必定OOM

minmie avatar Nov 18 '25 03:11 minmie

我现在也卡在这里了,不知道官方有没有控制和清空占用显存的方案

zhanglichen666 avatar Nov 18 '25 03:11 zhanglichen666

考虑比较可能和框架的内存分配策略有关,建议可以试试这个issue里提到的empty_cache方案:https://github.com/PaddlePaddle/PaddleOCR/issues/16011

Bobholamovic avatar Nov 18 '25 09:11 Bobholamovic

一样的问题,GPU还可以调用cuda.empty_cache(),NPU设备没法清缓存,运行一段时间必定OOM

请问定期调用gc.collect有帮助吗

Bobholamovic avatar Nov 18 '25 09:11 Bobholamovic

内存累加,调用gc.collect()会降低增加的速度,但是还是会逐渐累加

fhkankan avatar Nov 19 '25 02:11 fhkankan

考虑比较可能和框架的内存分配策略有关,建议可以试试这个issue里提到的empty_cache方案:#16011

@fhkankan 可以先试试这个

Bobholamovic avatar Nov 19 '25 03:11 Bobholamovic

一样的问题,GPU还可以调用cuda.empty_cache(),NPU设备没法清缓存,运行一段时间必定OOM

请问定期调用gc.collect有帮助吗

没有用

minmie avatar Nov 19 '25 06:11 minmie

一样的问题,GPU还可以调用cuda.empty_cache(),NPU设备没法清缓存,运行一段时间必定OOM

请问定期调用gc.collect有帮助吗

没有用

这样的话大概率和框架的内存/缓存分配策略有关了,建议也可以到paddle框架的repo提一个issue,那边会有更专业的开发者提供可能的解决方式。

Bobholamovic avatar Nov 20 '25 02:11 Bobholamovic

考虑比较可能和框架的内存分配策略有关,建议可以试试这个issue里提到的empty_cache方案:#16011

@fhkankan 可以先试试这个

不是显存,是内存在累加不释放

fhkankan avatar Nov 24 '25 01:11 fhkankan

考虑比较可能和框架的内存分配策略有关,建议可以试试这个issue里提到的empty_cache方案:#16011

@fhkankan 可以先试试这个

不是显存,是内存在累加不释放

不好意思我之前看错了。请问方便用tracemalloc标准库看看是什么对象占据了大量内存吗?

Bobholamovic avatar Nov 24 '25 02:11 Bobholamovic

手动屏蔽如下代码,则内存不会增加

result = pipeline.predict(file_base64)

fhkankan avatar Nov 24 '25 06:11 fhkankan

手动屏蔽如下代码,则内存不会增加

result = pipeline.predict(file_base64)

这一句代码里面包含了很多复杂的步骤,我们可能需要看看具体是哪个步骤出现了内存泄漏或者其他情况

Bobholamovic avatar Nov 24 '25 06:11 Bobholamovic

Image 在paddleX的paddlex/infereencee/pipelines/paddleocr-vl/pipeline.py的_paddleOCRVLPipeline的predict()中,将use_queues=False时同时在683行前直接手动赋值yield {}不执行_process_vlm()时,内存也不再累加,怀疑是在_process_vlm中需要进一步定位

fhkankan avatar Nov 24 '25 06:11 fhkankan

考虑比较可能和框架的内存分配策略有关,建议可以试试这个issue里提到的empty_cache方案:#16011

@fhkankan 可以先试试这个

不是显存,是内存在累加不释放

不好意思我之前看错了。请问方便用tracemalloc标准库看看是什么对象占据了大量内存吗?

通过这个方式,可以不用猜测,直接定位到是哪些对象占据了内存

Bobholamovic avatar Nov 24 '25 07:11 Bobholamovic

Image定位到是这个地方导致内存累加了

fhkankan avatar Nov 25 '25 05:11 fhkankan

如此修改后,内存累积数值有明显下降,但是最高值还是有逐渐增加趋势,请问还有更好的写法和调整吗?
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) _, buffer = cv2.imencode('.jpg', image, [int(cv2.IMWRITE_JPEG_QUALITY), 95]) image_url = "data:image/jpeg;base64," + base64.b64encode(buffer).decode("ascii") del image del buffer

fhkankan avatar Nov 25 '25 06:11 fhkankan

这样修改之后,继续通过tracemalloc定位,哪些对象占据内存较大呢?

Bobholamovic avatar Nov 25 '25 06:11 Bobholamovic