使用Simple Transformers测试NER时遇多进程启动错误求解决方案
问题:Windows环境下Simple Transformers/Hugging Face Transformers NER训练触发RuntimeError
我最近在跟着Simple Transformers的官方最小示例测试NER功能,结果碰到了一个RuntimeError。后来换成直接用Hugging Face Transformers写NER训练代码,居然也遇到了完全一样的问题。我试过社区里提到的加if __name__ == '__main__':的解决方案,但在Python 3.7环境里还是没搞定。
错误信息
File "C:\Users\Harsha\Anaconda3\envs\simpt\lib\site-packages\simpletransformers\ner\ner_model.py", line 242, in train_model train_dataset = self.load_and_cache_examples(train_data) File "C:\Users\Harsha\Anaconda3\envs\simpt\lib\site-packages\simpletransformers\ner\ner_model.py", line 986, in load_and_cache_examples features = convert_examples_to_features( File "C:\Users\Harsha\Anaconda3\envs\simpt\lib\site-packages\simpletransformers\ner\ner_utils.py", line 242, in convert_examples_to_features with Pool(process_count) as p: ... RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ...
我的系统配置
- 操作系统:Windows 10
- GPU:GTX 1070
- Python版本:3.8.3
- 依赖版本:transformers 2.1.1、PyTorch 1.5.1
- 环境:Conda虚拟环境
解决方案
这个问题本质是Windows的进程启动机制和Linux/macOS不同导致的——Windows用spawn而不是fork来创建子进程,这就要求所有会触发多进程的代码必须被包裹在if __name__ == '__main__':判断块里,否则子进程启动时会重复执行全局作用域的代码,引发错误。
你之前尝试的方案没生效,大概率是没有把所有训练相关的逻辑都放到这个判断块内部,比如模型初始化、数据加载这些步骤如果在全局作用域执行,还是会触发问题。下面给你一个正确的代码示例:
from simpletransformers.ner import NERModel, NERArgs def run_ner_training(): # 1. 配置模型参数 ner_args = NERArgs() ner_args.num_train_epochs = 3 ner_args.learning_rate = 1e-4 ner_args.train_batch_size = 8 # 可以根据需求添加更多参数 # 2. 初始化NER模型 model = NERModel( "bert", "bert-base-cased", args=ner_args, labels=["O", "B-PER", "I-PER", "B-ORG", "I-ORG", "B-LOC", "I-LOC"], ) # 3. 加载训练数据并启动训练 # 这里假设train_data是你准备好的训练数据集 model.train_model(train_data) if __name__ == '__main__': # Windows环境下必须添加这一行,解决多进程启动的问题 import multiprocessing multiprocessing.freeze_support() # 调用训练函数 run_ner_training()
另外还有两个额外的建议:
- 如果你是在Jupyter Notebook里运行代码,建议换成.py脚本执行——Notebook的全局作用域逻辑会让多进程问题更难排查。
- 你的transformers版本(2.1.1)太老了,和最新的Simple Transformers兼容性不好,而且老版本对Windows多进程的处理不够完善。可以尝试升级transformers到4.x系列(注意和Simple Transformers的版本匹配,比如Simple Transformers 0.63.x对应transformers 4.1.x及以上)。
内容的提问来源于stack exchange,提问作者cerofrais
相关产品推荐
相关产品推荐

