当我使用 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(当矩阵乘法的并行化在其他框架中被证明是有价值的时,我发现这有点奇怪。
根据文档:https://spacy.io/usage/processing-pipelines#multiprocessing(spaCy 3(
spaCy 包括对使用 nlp.pipe 进行多处理的内置支持使用n_process选项:
# Multiprocessing with 4 processes
docs = nlp.pipe(texts, n_process=4)
# With as many processes as CPUs (use with caution!)
docs = nlp.pipe(texts, n_process=-1)