PaddleOCR-VL循环predict请求时内存增加不释放问题
🔎 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
一样的问题,GPU还可以调用cuda.empty_cache(),NPU设备没法清缓存,运行一段时间必定OOM
我现在也卡在这里了,不知道官方有没有控制和清空占用显存的方案
考虑比较可能和框架的内存分配策略有关,建议可以试试这个issue里提到的empty_cache方案:https://github.com/PaddlePaddle/PaddleOCR/issues/16011
一样的问题,GPU还可以调用cuda.empty_cache(),NPU设备没法清缓存,运行一段时间必定OOM
请问定期调用gc.collect有帮助吗
内存累加,调用gc.collect()会降低增加的速度,但是还是会逐渐累加
一样的问题,GPU还可以调用cuda.empty_cache(),NPU设备没法清缓存,运行一段时间必定OOM
请问定期调用
gc.collect有帮助吗
没有用
一样的问题,GPU还可以调用cuda.empty_cache(),NPU设备没法清缓存,运行一段时间必定OOM
请问定期调用
gc.collect有帮助吗没有用
这样的话大概率和框架的内存/缓存分配策略有关了,建议也可以到paddle框架的repo提一个issue,那边会有更专业的开发者提供可能的解决方式。
考虑比较可能和框架的内存分配策略有关,建议可以试试这个issue里提到的
empty_cache方案:#16011@fhkankan 可以先试试这个
不是显存,是内存在累加不释放
不好意思我之前看错了。请问方便用tracemalloc标准库看看是什么对象占据了大量内存吗?
手动屏蔽如下代码,则内存不会增加
result = pipeline.predict(file_base64)
手动屏蔽如下代码,则内存不会增加
result = pipeline.predict(file_base64)
这一句代码里面包含了很多复杂的步骤,我们可能需要看看具体是哪个步骤出现了内存泄漏或者其他情况
考虑比较可能和框架的内存分配策略有关,建议可以试试这个issue里提到的
empty_cache方案:#16011@fhkankan 可以先试试这个
不是显存,是内存在累加不释放
不好意思我之前看错了。请问方便用tracemalloc标准库看看是什么对象占据了大量内存吗?
通过这个方式,可以不用猜测,直接定位到是哪些对象占据了内存
定位到是这个地方导致内存累加了
如此修改后,内存累积数值有明显下降,但是最高值还是有逐渐增加趋势,请问还有更好的写法和调整吗?
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
这样修改之后,继续通过tracemalloc定位,哪些对象占据内存较大呢?