我用spacy来识别网页上的街道地址。
我的模型基本上是使用spacy的新实体类型示例代码初始化的:type.py
我的培训数据包括纯文本网页及其相应的街道地址实体和字符位置。
我能够快速地建立一个空间模型来开始预测,但我发现它的预测速度非常慢。
我的代码的工作方式是遍历原始的HTML页面,然后在迭代时将每个页面的纯文本版本输入spacy。由于无法进入的原因,我需要在迭代循环中逐页地使用Spacy进行预测。
在加载模型之后,我使用了进行预测的标准方法,我将其称为预测/评估阶段:
doc = nlp(plain_text_webpage)
if len(doc.ents) > 0:
print ("found entity")问题:
更新:
我设法通过以下方式大大缩短了处理时间:
加载模型的更新代码:
nlp = spacy.load('test_model/', disable=['parser', 'tagger', 'textcat'])
nlp.tokenizer = WhitespaceTokenizer(nlp.vocab)
doc = nlp(text)然而,仍然是太慢(比我需要的慢20倍)。
问题:
发布于 2018-04-07 20:10:06
有关速度故障排除的详细信息,请参阅此处:https://github.com/explosion/spaCy/issues/1508
最重要的事情是:
1)检查链接到哪个BLAS库numpy,并确保它在您的机器上编译得很好。使用conda很有帮助,因为您可以得到Intel的mkl
2)
在AWS上有c4.8个大型实例,当spacy对数据进行评估时,所有36个核都会被最大化。
那可能很糟糕。我们现在只能并行矩阵乘法,因为我们使用的是numpy --所以没有方法来处理更大的块。这意味着BLAS库可能启动了太多线程。一般情况下,每个过程只能使用3-4个核心。尝试设置BLAS库的环境变量以限制线程数。
3)使用nlp.pipe()对数据进行批量处理。这使得矩阵乘法更大,处理效率更高。
4)您的“通过我的处理管道提供数据”的外部循环可能是令人尴尬的并行。那么,并行化它。要么使用Python的多处理,要么使用just之类的东西,或者像Spark之类的东西,或者只是并行地启动10个bash脚本。但是拿出你能做的最外层、最高层次的工作,并尽可能独立地运行它。
实际上,与一个大型VM相比,运行多个较小的VM更好。这在操作上是很烦人的,但它意味着资源共享的减少。
https://stackoverflow.com/questions/49702372
复制相似问题