
Streaming Pipeline Regression in Transformers v5
快速结论:在 Transformers v5 中使用 pipeline 处理大型生成器(generator)或流式数据集时,触发 OOM(内存溢出)。优先排查是否因为 inputs = list(inputs) 将整个生成器强行转换为列表导致内存爆炸,可临时从 container_types 中移除 types.GeneratorType 作为绕过。
问题场景
用户在使用 Transformers v5(5+)版本的 Pipeline 对象进行推理或处理任务时,若输入是一个大型生成器(例如流式数据集、大文件逐行读取生成器),调用 pipeline 时会导致内存耗尽(OOM)。
报错原文
# 触发 OOM 的关键代码路径,无显式报错文本,但表现为 MemoryError 或进程被杀
# 根源代码位置:transformers/pipelines/base.py 约 1206 行
inputs = list(inputs) # 将生成器强制转为列表,导致流式数据全部加载到内存
原因分析
根本原因是 v5 中为支持聊天样式(chat-style)输入检测,在 Pipeline.__call__ 中新增了 inputs = list(inputs) 代码。对于生成器类型,由于不可下标访问,需要先转换为列表才能读取第一个元素。然而对于大型或流式生成器,list() 操作会将整个生成器内容一次性加载到内存中,导致 OOM。在 v4 版本中不存在此转换,生成器会通过原有的惰性 get_iterator / PipelineIterator 路径流式处理。
注意:此问题由 PR #42326(chat template 变更)引入。
环境排查
- Transformers 版本:确认是否为 v5 或更高版本(如 5.0.0+)
- 输入数据类型:检查调用 pipeline 时传入的是否为
generator或流式迭代器 - 内存用量:监控系统内存是否在调用时急剧增长
解决步骤
- 临时绕过:修改
transformers/pipelines/base.py,在container_types定义中移除types.GeneratorType,即改为container_types = (list, tuple)。注意此方法会导致单条聊天信息以生成器形式传入时无法被正确检测为聊天输入。 - 官方修复(可优先尝试):使用
next()仅获取生成器的第一个元素进行聊天检测,若为聊天消息则仅转换该元素为Chat类型;否则将取出的元素重新放回生成器,让后续代码走原有的惰性迭代路径。此修复避免了全量加载。请更新 Transformers 至包含此修复的最新版本(参考 PR 合并状态)。 - 如果使用自定义脚本,考虑在传入 pipeline 前将生成器包装为可迭代对象,或使用
PipelineIterator手动处理流式数据。
验证方法
使用一个大型生成器作为 pipeline 输入(例如从 yield 模拟流式数据,总数据量超过内存),检查程序是否能流式处理完成而不触发 OOM。修复后应不会出现内存急剧增长,且第一个元素能被正确检测(若能)。


