pytorch_pretrained_bert的BertForSequenceClassification推理CPU内存泄漏如何解决
BertForSequenceClassification 推理CPU内存泄漏解决方案
以下是可直接落地的修复建议:
- 调整DataLoader配置
实时推理场景下将num_workers参数设置为0,多进程数据加载在反复创建DataLoader的场景下极易出现共享内存无法释放的问题,是CPU内存持续上涨的常见诱因。同时推理无需打乱数据,可直接删除RandomSampler相关逻辑,使用默认顺序采样即可。 - 优化变量存储与引用
首先补全代码中缺失的批次变量赋值:b_input_ids, b_input_mask = batch,未被正确引用的张量会延迟释放,间接推高内存占用。如果是单请求实时返回结果的场景,不需要将所有批次的logits存入predictions列表累计,处理完当前批次后直接返回结果即可,避免大量numpy数组长期占用CPU内存。 - 修正模型加载逻辑
加载模型权重时直接指定map_location=device,无需先加载到CPU再转移到GPU,减少CPU侧的大张量副本残留。同时你当前使用的pytorch_pretrained_bert是已停止维护的老旧版本,本身存在已知的内存泄漏缺陷,建议替换为官方维护的transformers库中的对应实现。 - 全局复用基础对象
分词器和模型的初始化操作仅需在服务启动时执行一次,不要每次推理请求都重复加载模型权重和分词器,重复加载会产生大量无法释放的冗余内存,是实时推理场景内存泄漏的最高发原因。 - 调整内存清理策略
不需要在每个批次循环中反复执行gc.collect()和torch.cuda.empty_cache(),频繁调用反而会带来额外性能开销,仅需在所有批次推理完成后执行一次即可。 - 升级核心依赖版本
将PyTorch升级到1.10及以上的官方稳定版本,旧版本PyTorch存在多进程加载、张量转移相关的已知内存泄漏bug,新版本已修复绝大多数这类问题。
内容的提问来源于stack exchange,提问作者Ashba jawed
相关产品推荐
相关产品推荐

