multiprocessing - 使用 Spacy 训练 NER 模型仅使用一个核心
问题描述
当我用 Spacy 训练 NER 模型并监控我的 CPU 时,我可以看到它只使用 1 个内核。
我在 Spacy 文档中只找到了一个多处理示例,但它不适用于培训:https ://github.com/explosion/spaCy/blob/master/examples/pipeline/multi_processing.py 我只是在使用培训示例中提供的代码,但 TRAINING_DATA 中的 500000 个元组列表遵循相同的结构: ("rawtext", {"entities": [(entity_start_offset, entity_end_offset, "ENTITY")]})
with nlp.disable_pipes(*other_pipes): # only train NER
for itn in range(n_iter):
random.shuffle(TRAIN_DATA)
losses = {}
batches = spacy.util.minibatch(TRAIN_DATA,
size=spacy.util.compounding(4., 32., 1.001))
for i, batch in enumerate(batches):
print(i)
texts, annotations = zip(*batch)
# Updating the weights
nlp.update(texts, annotations, sgd=optimizer,
drop=0.35, losses=losses)
print('Losses', losses)
我需要使用多核加速训练。现在,使用 1 个单核每个 epoc 需要 40 分钟。
解决方案
似乎从 2.1 版开始,Spacy 的训练只使用一个单核。(https://github.com/explosion/spaCy/issues/3507)当矩阵乘法的并行化在其他框架中被探测到值得时,我发现它有点奇怪。
推荐阅读
- android - 在另一台计算机上编译时出现 Google SignIn API 异常 10
- react-native - 尝试为选项卡按钮添加显示/隐藏逻辑
- c++ - 在 qml 中处理页面
- node.js - docker容器中的nodejs twitter api抛出401错误
- amazon-web-services - AWS ECS 通过 bash 从容器内将文件上传到存储桶
- mysql - 如何在节点 js 中添加自动触发器?
- php - Laravel 加载关系 - 框架错误?
- ocaml - 函数定义语法
- python - Python Pandas:传递值的形状是 (126, 5),索引意味着 (84, 5)
- scala - 如何编写一个通用函数来评估火花数据框的列内的列值