在类中实现Gramformer多进程时遭遇无法Pickle错误求助
解决Gramformer多进程中的Pickle序列化错误
问题根源
Gramformer依赖的Transformer模型(PyTorch/TensorFlow实现)无法通过Python的pickle序列化,而Python多进程启动时会尝试将父进程中的对象(包括你提前初始化的self.gf)序列化后传递给子进程,这直接触发了序列化失败的错误。而Spacy的nlp对象本身做了序列化兼容处理,因此未出现异常。
修复方案
- 子进程独立初始化Gramformer:不在父进程中提前创建Gramformer实例,让每个子进程启动后自行初始化,避免跨进程传递无法序列化的模型对象。
- 修正参数传递与结果收集逻辑:原代码存在参数传递错误(将列表直接传给仅接收单个entry的函数),且未收集子进程处理结果,需调整任务拆分与结果合并逻辑。
- 使用
multiprocessing.Pool简化管理:相比手动创建Process,Pool更适合批量任务的分发与结果收集,代码更简洁高效。
修正后的代码
import multiprocessing import spacy class SpacyWrapper: def __init__(self): self.nlp = spacy.load('en_core_web_sm') spacy_wrapper = SpacyWrapper() # 独立处理函数,子进程内自行初始化Gramformer def process_entries(lst_part): from gramformer import Gramformer gf = Gramformer(models=1, use_gpu=False) corrected_entries = [] for entry in lst_part: paragraph = spacy_wrapper.nlp(entry) corrected_entry = '' for sentence in paragraph.sents: corrected_sentence = list(gf.correct(sentence.text))[0] # 修正句号不一致问题 if not sentence.text.endswith('.') and corrected_sentence.endswith('.'): corrected_sentence = corrected_sentence[:-1] corrected_entry += ' ' + corrected_sentence corrected_entries.append(corrected_entry.strip()) return corrected_entries class GramformerWrapper: def correct_sentences(self, lst): num_processes = multiprocessing.cpu_count() chunk_size = len(lst) // num_processes + 1 # 拆分任务为多个子列表 chunks = [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)] # 用Pool分发任务并收集结果 with multiprocessing.Pool(num_processes) as pool: results = pool.map(process_entries, chunks) # 合并所有子进程的结果 corrected_entries = [] for res in results: corrected_entries.extend(res) return corrected_entries # 使用示例 gramformer_wrapper = GramformerWrapper() test_data = ["I is go to park.", "He don't like apple.", "We was playing football yesterday."] print(gramformer_wrapper.correct_sentences(test_data))
额外说明
- 若需在类中封装逻辑,避免在类的
__init__方法中初始化Gramformer,应在子进程执行的方法内完成模型初始化(但使用Pool时,类方法的序列化仍可能存在问题,独立函数是更稳妥的选择)。 - TensorFlow/PyTorch模型对象依赖进程内的内存空间或CUDA上下文,无法安全跨进程序列化,因此必须在每个子进程内单独初始化。
内容的提问来源于stack exchange,提问作者Zaks Hugh
相关产品推荐
相关产品推荐

