owlready2中的OWL推理机:如何减少计算时间

问题描述 投票:0回答:1

为了提供一些上下文,我目前正在研究一个对话框本体,并且我有一个 python 脚本,可以生成有关本体中的类和属性的对话框表示。这意味着我的脚本为每个对话框输出一个

.rdf
文件。对于每个对话框,我必须执行推理以确定对话框中每个话语的类别。就我而言,有必要单独处理每个对话框。

我的问题是:我正在使用

HermiT
Pellet
推理机,我称之为使用
owlready2
函数,分别是
sync_reasoner()
sync_reasoner_pellet()
,每个对话框大约需要 0.7 秒才能继续。在我有大量对话的情况下,有没有办法优化它,这意味着减少计算时间?请注意,我无法在 cuda GPU 上运行我的代码,否则我会丢失我不想要的全文。有什么优化流程的建议吗?

ontology pellet owlready reasoner hermit
1个回答
0
投票

推理因需要很长时间才能完成而臭名昭著,而当涉及到图算法的复杂时间时,我们通常会束手无策。您最好的选择可能是并行化操作。

正如您现在所看到的,HermiT 和 Pellet 在单线程上运行,一次处理一个语句。例如,如果您有 10 个核心,则当前使用其中的 1/10 来处理数据。

幸运的是,每个对话框文件并不依赖于下一个。这将允许您一次生成多个进程(使用 Python

multiprocessing
模块),每个进程都对特定的 RDF 文件进行推理。

总结

为了减少推理所需的时间:垂直扩展(获得更强大的CPU)

为了减少对数据集进行推理所需的时间:水平缩放。

想出一种使用多重处理来并行推理文件的方法。有些人将文件批量放入文件夹中,并让每个进程负责处理文件中的数据(最简单)。有些人使用作业队列系统(想想 celerly + redis),其中每个进程都会询问队列需要处理哪个文件。有些使用事件驱动技术等

这是一个小项目,我会制作N个文件夹,其中N是你拥有-1的核心数量。然后将文件总数除以 N,并将那么多文件放入每个文件夹中。然后我会生成 N 个进程,每个进程处理一个不同的文件夹。每个进程都会在其各自文件夹中的文件上加载本体和原因。

© www.soinside.com 2019 - 2024. All rights reserved.