一次性跑n个图片和对应的内存,显卡 1080Ti
图片数 | 内存 |
---|---|
1000 | 8G |
2000 | 11G |
2800 | 19G |
2900 | 21G |
3100 | 24G |
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
import time
p = pipeline('ocr-detection', 'damo/cv_resnet18_ocr-detection-line-level_damo',model_revision='v1.0.0',device="cuda:1")
for i in range(3000):
result = p('font1.jpg')
print(f'{i+1}/3000')
使用官方文档的方法运行,其中 ocr_detection 循环处理图片,大约一张图片需要2s。 有无加速和解决内存泄露的方案?
您在使用 ocr-detection
模型处理图片时,发现单张图片的处理时间约为 2 秒,并且随着图片数量增加,内存占用显著上升(例如:3100 张图片占用 24GB 内存)。这表明可能存在 性能瓶颈 和 内存泄漏 的问题。以下从加速和解决内存泄漏两个方面提供解决方案。
根据知识库中的内容,批量检测图片可以有效减少请求开销。虽然批量检测可能会拉长平均响应时间,但总体效率会更高。以下是实现批量处理的建议:
代码调整: 将单张图片逐一处理改为批量提交多张图片。例如,每次提交 100 张图片进行检测。
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
# 初始化 OCR 检测管道
p = pipeline('ocr-detection', 'damo/cv_resnet18_ocr-detection-line-level_damo',
model_revision='v1.0.0', device="cuda:1")
# 批量处理图片
batch_size = 100
for i in range(0, 3000, batch_size):
batch_results = [p('font1.jpg') for _ in range(batch_size)]
print(f'Processed {i + batch_size}/3000')
注意事项:
通过以下方法进一步提升推理速度: - 混合精度训练:启用 torch.bfloat16
或 torch.float16
数据类型,降低显存占用并加速计算。 - 模型剪枝与量化:对模型进行剪枝或量化操作,减少参数规模,从而提升推理速度。
示例代码(启用混合精度):
import torch
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
# 启用混合精度
with torch.cuda.amp.autocast():
p = pipeline('ocr-detection', 'damo/cv_resnet18_ocr-detection-line-level_damo',
model_revision='v1.0.0', device="cuda:1")
for i in range(3000):
result = p('font1.jpg')
print(f'{i + 1}/3000')
如果单张 GPU 显存不足,可以考虑使用多 GPU 分布式推理。将图片分发到多个 GPU 上并行处理,显著提升吞吐量。
在循环中显式调用 torch.cuda.empty_cache()
清理未使用的显存,避免显存累积占用。
示例代码:
import torch
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
# 初始化 OCR 检测管道
p = pipeline('ocr-detection', 'damo/cv_resnet18_ocr-detection-line-level_damo',
model_revision='v1.0.0', device="cuda:1")
for i in range(3000):
result = p('font1.jpg')
print(f'{i + 1}/3000')
# 手动清理显存
if i % 100 == 0: # 每处理 100 张图片清理一次
torch.cuda.empty_cache()
确保每次调用 pipeline
后,模型的中间变量被正确释放。可以通过以下方法排查: - 使用 del
删除不再需要的对象。 - 调用 gc.collect()
强制触发垃圾回收。
示例代码:
import gc
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
# 初始化 OCR 检测管道
p = pipeline('ocr-detection', 'damo/cv_resnet18_ocr-detection-line-level_damo',
model_revision='v1.0.0', device="cuda:1")
for i in range(3000):
result = p('font1.jpg')
print(f'{i + 1}/3000')
# 删除临时变量并触发垃圾回收
del result
gc.collect()
根据知识库中的信息,PyTorch 可能因版本不兼容导致内存泄漏问题。建议升级到最新稳定版本的 PyTorch 和 CUDA 驱动程序。
升级命令:
pip install --upgrade torch torchvision torchaudio
同时,确保 GPU 驱动版本与 CUDA 版本匹配。例如: - CUDA 12.1.1 - NVIDIA Driver 535.154.05
加速方案:
torch.bfloat16
)。内存泄漏解决方案:
torch.cuda.empty_cache()
清理显存。del
和 gc.collect()
)。通过上述优化措施,您可以显著提升 OCR 检测的效率并解决内存泄漏问题。