news 2026/7/31 8:01:54

PaddleOCR GPU 推理显存不释放?这样改,显存稳稳回落不翻倍--亲测有效

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleOCR GPU 推理显存不释放?这样改,显存稳稳回落不翻倍--亲测有效

PaddleOCR GPU 推理显存不释放?这样改,显存稳稳回落不翻倍

现象

Flask 包一层 PaddleOCR 3.x 做 OCR 服务,启动基线 576MiB,识别同一张图:

  • 旧版(naive_best_fit)涨到 670MiB 左右就稳了

  • 新版(auto_growth)直接飙到 1400+ MiB,nvidia-smi 看着像泄漏

实测不是真泄漏,是分配器策略 + 清理姿势不对 + 预处理画蛇添足三件事叠一起。

根因一句话

Paddle 的 GPU 显存分配器默认会把“释放的块”囤在自己池子里不还给驱动,empty_cache()能不能把显存退给 nvidia-smi,取决于分配策略:

  • naive_best_fit(旧):预占一大块,池子锁死,empty_cache()基本无效

  • auto_growth(新,pip 版默认):按需cudaMalloc,空闲块可以被empty_cache()归还 ✅

但很多人用了auto_growth还是不回落,是因为清理顺序错了,或者预处理把输入 shape 搞出花样,导致 cuDNN workspace 越缓存越多。

解决办法(四步,照抄)

1. import paddle 之前设环境变量

import os # 关键:换 auto_growth,empty_cache 才管用 os.environ["FLAGS_allocator_strategy"] = "auto_growth" os.environ["FLAGS_fraction_of_gpu_memory_to_use"] = "0.3" # 30% 上限兜底 os.environ["FLAGS_initial_gpu_memory_in_mb"] = "512" os.environ["FLAGS_reallocate_gpu_memory_in_mb"] = "128" os.environ["FLAGS_cudnn_exhaustive_search"] = "0" os.environ["FLAGS_conv_workspace_size_limit"] = "64"

必须放在import paddle/import paddleocr最前面,晚了不生效。

2. 预处理别瞎缩放对齐

显存是被 det 的text_det_limit_side_len=960和 rec 固定高度卡死的,外部预缩放省不到显存,只会让小字识别率掉

不要做 32 倍数对齐,不要强行 resize 到小图,只转 RGB:

def preprocess_image(image_path): from PIL import Image with Image.open(image_path) as img: if img.mode not in ('RGB', 'L'): img.convert('RGB').save(image_path) return image_path

3. 正确的显存回收函数(顺序不能乱)

必须先等 kernel 跑完 → Python 断引用 → 再等一次 → 最后empty_cache()

import gc import paddle def clean_gpu_memory(force=False): # 节流:每 N 次清一次,别每次请求都 synchronize if not force: clean_gpu_memory._n += 1 if clean_gpu_memory._n < 15: return clean_gpu_memory._n = 0 paddle.device.synchronize() # 2.5+ 新 API,替代 cuda.synchronize() gc.collect() # 断 Python 侧 tensor 引用 paddle.device.synchronize() paddle.device.cuda.empty_cache() # 只有 auto_growth 下能真退回显存 clean_gpu_memory._n = 0

paddle.device.cuda.synchronize()2.5.0 起弃用,换成paddle.device.synchronize()

4. 推理完在 finally 里清一次

python

def process_single_image(path): start = time.time() result = None try: with _ocr_lock: # predictor 非线程安全,加锁 result = ocr.predict(preprocess_image(path)) return {'texts': parse(result), 'time_cost': round(time.time()-start, 4)} finally: del result clean_gpu_memory()

并发用 Flask 默认多线程时,Paddle inference predictor 不是线程安全的,不加锁显存峰值会翻倍,结果还可能串。

验证

服务起好后看这两个值:

curl http://localhost:19600/gpumem curl "http://localhost:19600/gpumem?clean=1"
  • allocated_mb每次识别完回落到基线 → 正常

  • reserved_mb高但 allocated 回落 → 只是池子缓存,不是泄漏

  • 强制 clean 后 reserved 往下掉 → auto_growth 生效

避坑补充

  • 不要在推理外面套paddle.no_grad():走的是 inference predictor,没有反向图,写了也没用

  • 不要在每次predict后都synchronize():阻塞等 kernel,白等;只在 clean 里同步

  • 文件大小限制在preprocess_image里 raise 别被同函数 except 吞掉,要往外抛

  • 同卡跑别的任务,用auto_growth+fraction=0.3naive_best_fit友好得多

改完同图识别:基线 576 → 峰值 ~680 → 清完回 580 左右,不再翻倍。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 7:55:53

移动 App 网络请求最佳实践:超时、重连与弱网环境优化

移动 App 网络请求最佳实践&#xff1a;超时、重连与弱网环境优化在移动端开发中&#xff0c;网络请求的稳定性直接影响用户体验。相比服务端&#xff0c;移动网络具有高延迟、易中断、带宽波动大等特点。本文从超时策略、自动重连机制和弱网环境适配三个维度&#xff0c;梳理一…

作者头像 李华
网站建设 2026/7/31 7:54:46

Spring WebFlux WebClient文件传输实战:解决缓冲区限制与流式处理

1. 项目概述&#xff1a;WebClient文件传输的实战与深坑 在微服务架构里&#xff0c;服务间的文件传输是个高频且容易踩坑的场景。特别是当你从传统的同步阻塞式框架&#xff08;比如用 RestTemplate &#xff09;转向响应式编程栈&#xff0c;使用Spring WebFlux的 WebClie…

作者头像 李华
网站建设 2026/7/31 7:54:18

AI编程助手Skill开发实战:从提示词到可复用能力封装

如果你正在使用 AI 编程助手&#xff08;如 Cursor、Claude Code、Codex 等&#xff09;&#xff0c;可能会发现一个现象&#xff1a;官方提供的通用能力虽然强大&#xff0c;但在特定业务场景下往往不够精准。比如&#xff0c;你想让 AI 生成符合公司规范的数据库访问代码&…

作者头像 李华
网站建设 2026/7/31 7:53:11

LibreOffice 2024深度指南:开源办公套件的核心优势与实战技巧

1. 项目概述&#xff1a;为什么我们还在谈论LibreOffice&#xff1f; 如果你在办公室里待过&#xff0c;或者处理过任何文档、表格、演示文稿&#xff0c;那么“LibreOffice”这个名字你大概率听过。它常常和“免费”、“开源”、“微软Office的替代品”这些标签绑在一起。但今…

作者头像 李华
网站建设 2026/7/31 7:51:56

临床检验诊断学复试备考全攻略:从知识图谱到实战技巧

1. 项目背景与价值解析作为一名经历过医学考研复试的过来人&#xff0c;我深知临床检验诊断学专业复试准备的艰辛。山东大学齐鲁医院作为国内顶尖的医疗教学机构&#xff0c;其复试考核向来以专业性强、覆盖面广著称。这份资料包的独特价值在于&#xff0c;它精准对接了齐鲁医院…

作者头像 李华
网站建设 2026/7/31 7:50:41

C 语言工业级通用组件手写 22:去极值平均滤波

目录 前言&#xff1a; 一、去极值平均滤波核心本质与应用场景 1. 什么是去极值平均滤波 2. 解决的核心痛点 3. 典型工业落地场景 二、核心实现原理 三、工业级设计规范 四、完整可复用源码 1、filter_mean_exc.h 2、filter_mean_exc.c 五、实战演示 六、进阶优化方…

作者头像 李华