使用EasyOCR与Transformers的Python脚本多次运行后初始化缓慢求助
解决EasyOCR+Transformers多次运行后GPU初始化缓慢的问题
针对性解决方法
复用模型实例,避免重复初始化
每次运行脚本都重新加载EasyOCR和Transformers模型,会反复分配GPU内存并产生碎片。建议将模型初始化放在脚本启动阶段,后续推理直接复用同一个实例,而非每次处理都从头加载。例如用全局变量保存模型对象:import easyocr from transformers import pipeline # 全局初始化模型,仅执行一次 ocr_reader = easyocr.Reader(['ch_sim', 'en'], gpu=True) nlp_pipeline = pipeline("feature-extraction", model="bert-base-chinese", device=0) def process_image(image_path): # 复用已初始化的模型 ocr_result = ocr_reader.readtext(image_path) nlp_result = nlp_pipeline("sample text") return ocr_result, nlp_result配置PyTorch CUDA内存分配器
通过环境变量PYTORCH_CUDA_ALLOC_CONF优化内存分配策略,减少碎片生成。可在脚本开头添加:import os # 设置最大拆分内存块大小为256MB,提升内存复用率 os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:256'也可尝试
expandable_segments:True配置,允许内存分配器合并相邻空闲块。配合垃圾回收强制释放内存
仅调用torch.cuda.empty_cache()可能无法清理未被Python垃圾回收追踪的对象引用,需结合gc.collect():import gc import torch # 在需要释放模型内存时执行 del ocr_reader, nlp_pipeline gc.collect() torch.cuda.empty_cache()升级依赖版本
当前使用的CUDA 11.4和旧版PyTorch对内存碎片的处理不够完善,建议升级至PyTorch 1.12+(适配CUDA 11.6/11.7),新版本内存分配器针对Transformer类模型做了优化,能有效减少碎片积累。
GPU内存碎片管理最佳实践
- 避免频繁创建/销毁大型张量或模型对象,这类操作会产生大量零散的空闲内存块,后续大内存分配时易触发碎片化。
- 对常用张量使用
torch.cuda.pin_memory()固定内存位置,减少动态分配带来的内存碎片。 - 使用
torch.cuda.memory_summary()查看详细内存分配日志,定位导致碎片的具体操作。 - 借助NVIDIA Nsight Systems工具分析内存分配流程,精准找到碎片化根源并优化。
内容的提问来源于stack exchange,提问作者Ajinkya Bhapkar
相关产品推荐
相关产品推荐

