Replies: 3 comments
-
你的问题涉及 PaddleOCR 内存占用不断增长,即解析不同图片时内存只增不减的问题。这通常与 Python的垃圾回收机制、模型加载方式、FastAPI的异步调用 有关。以下是一些可能的解决方案: 🔍 问题分析
✅ 解决方案1️⃣ 避免使用全局 OCR 实例可以在每次请求时 初始化和销毁模型实例,避免全局缓存: from memory_profiler import profile
from paddleocr import PaddleOCR
import uvicorn
from fastapi import FastAPI
import gc
app = FastAPI()
img_path2 = 'img_12.jpg'
img_path3 = "12.pdf"
@profile
def profile_test(path: str):
ocr = PaddleOCR(use_angle_cls=True, use_gpu=False,
det_model_dir="./ch_PP-OCRv3_det_infer",
rec_model_dir="./ch_PP-OCRv3_rec_infer",
cls_model_dir="./ch_ppocr_mobile_v2.0_cls_infer",
rec_char_dict_path="./ppocr_keys_v1.txt" )
result = ocr.ocr(path)
del ocr # 手动删除 OCR 实例
gc.collect() # 强制垃圾回收
return result
@app.get("/test2")
async def ocr_test2():
result = profile_test(img_path2)
return result
@app.get("/test3")
async def ocr_test3():
result = profile_test(img_path3)
return result
if __name__ == "__main__":
uvicorn.run(app, port=8080, host="0.0.0.0", log_level="info") 📌 优化点:
2️⃣ 手动清除 Paddle 缓存如果你仍然观察到内存增加,可以在 OCR 处理后 尝试清理 Paddle 的 GPU/CPU 资源: import paddle
paddle.device.cuda.empty_cache() # 释放 GPU 内存(如果用 GPU) 也可以结合 import gc
gc.collect()
paddle.device.cuda.empty_cache() 3️⃣ 检查 PDF 解析是否缓存数据如果
🚀 总结
如果仍然遇到问题,可以尝试 更新 PaddleOCR 版本,例如 希望这些建议能帮助你优化 PaddleOCR 内存使用 🚀,如果问题仍然存在,建议打开一个新的 Issue 反馈给 PaddleOCR 团队! Response generated by 🤖 feifei-bot | chatgpt-4o-latest |
Beta Was this translation helpful? Give feedback.
-
关于 '不再使用全局 OCR 对象,每次请求生成一个新实例,并在处理完毕后 del ocr & gc.collect() 释放内存。'这种方式以尝试,占用内存涨的更快。 |
Beta Was this translation helpful? Give feedback.
-
这个问题应该不是python使用的问题,是不是可能是paddlepaddle依赖里c++相关功能的问题,因为切换paddlepaddle版本到3.0.0b2看起来是能解决的,只是推理速度慢了很多 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
paddleocr==2.7
paddlepaddle==2.6.2、3.0.0rc1、3.0.0b2
具体效果就是切换调用两个接口,test2解析图片,test3解析pdf,memory_profiler打印的内存直增不减,3.0.0b2能缓解,但是解析速度差太多了,还有别的解决办法吗
测试代码如下:
`from memory_profiler import profile
from paddleocr import PaddleOCR
import uvicorn
from fastapi import FastAPI
app = FastAPI()
ocr = PaddleOCR(use_angle_cls=True, use_gpu=False,
det_model_dir="./ch_PP-OCRv3_det_infer",
rec_model_dir="./ch_PP-OCRv3_rec_infer",
cls_model_dir="./ch_ppocr_mobile_v2.0_cls_infer",
rec_char_dict_path="./ppocr_keys_v1.txt") # need to run only once to download and load model into memory
img_path2 = 'img_12.jpg'
img_path3 = "12.pdf"
@Profile
def profile_test(path: str):
result = ocr.ocr(path)
temp = 1==1
return result
@app.get("/test2")
async def ocr_test2():
result = profile_test(img_path2)
return result
@app.get("/test3")
async def ocr_test3():
result = profile_test(img_path3)
return result
if name == "main":
uvicorn.run(app, port=8080, host="0.0.0.0", log_level="info")
`
Beta Was this translation helpful? Give feedback.
All reactions