You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在类中实现Gramformer多进程时遭遇无法Pickle错误求助

解决Gramformer多进程中的Pickle序列化错误

问题根源

Gramformer依赖的Transformer模型(PyTorch/TensorFlow实现)无法通过Python的pickle序列化,而Python多进程启动时会尝试将父进程中的对象(包括你提前初始化的self.gf)序列化后传递给子进程,这直接触发了序列化失败的错误。而Spacy的nlp对象本身做了序列化兼容处理,因此未出现异常。

修复方案

  1. 子进程独立初始化Gramformer:不在父进程中提前创建Gramformer实例,让每个子进程启动后自行初始化,避免跨进程传递无法序列化的模型对象。
  2. 修正参数传递与结果收集逻辑:原代码存在参数传递错误(将列表直接传给仅接收单个entry的函数),且未收集子进程处理结果,需调整任务拆分与结果合并逻辑。
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:53:23