运行Ruta Script时CPU使用率过高

时间:2016-10-24 12:10:07

标签: gpu cpu uima ruta

运行Ruta Script时CPU使用率太高。所以我计划使用GPU。我是否需要执行任何其他过程来在GPU机器上运行脚本。 Orelse有任何其他解决方案来降低CPU使用率

示例脚本:

PACKAGE uima.ruta.example;

ENGINE utils.PlainTextAnnotator;
TYPESYSTEM utils.PlainTextTypeSystem;

WORDLIST EditorMarkerList = 'EditorMarker.txt';
WORDLIST EnglishStopWordList = 'EnglishStopWords.txt';
WORDLIST FirstNameList = 'FirstNames.txt';
WORDLIST JournalVolumeMarkerList = 'JournalVolumeMarker.txt';
WORDLIST MonthList = 'Months.txt';
WORDLIST PagesMarkerList = 'PagesMarker.txt';
WORDLIST PublisherList = 'Publishers.txt';

DECLARE EditorMarker, EnglishStopWord, FirstName, JournalVolumeMarker,        Month, PagesMarker, PublisherInd;
Document{ -> MARKFAST(EditorMarker, EditorMarkerList)};
Document{ -> MARKFAST(EnglishStopWord,EnglishStopWordList)};
Document{ -> MARKFAST(FirstName, FirstNameList)};
Document{ -> MARKFAST(JournalVolumeMarker, JournalVolumeMarkerList)};
Document{ -> MARKFAST(Month, MonthList)};
Document{ -> MARKFAST(PagesMarker, PagesMarkerList)};
Document{ -> MARKFAST(PublisherInd, PublisherList)};


DECLARE Reference;
Document{-> EXEC(PlainTextAnnotator, {Line, Paragraph})};
Document{-> RETAINTYPE(SPACE, BREAK)};
Line{-REGEXP("CORA:.*") -> MARK(Reference)};
Reference{-> TRIM(SPACE, BREAK)};
Document{-> RETAINTYPE};

DECLARE LParen, RParen;
SPECIAL{REGEXP("[(]") -> MARK(LParen)};
SPECIAL{REGEXP("[)]") -> MARK(RParen)};

DECLARE YearInd;
NUM{REGEXP("19..|20..") -> MARK(YearInd, 1, 2)} SW?{REGEXP("a|b|c|d", true)};
Document{-> RETAINTYPE(SPACE)};
CAP YearInd{-> UNMARK(YearInd)};
Document{-> RETAINTYPE};


DECLARE NameLinker;
W{-PARTOF(NameLinker), REGEXP("and", true) -> MARK(NameLinker)};
COMMA{-PARTOF(NameLinker) -> MARK(NameLinker)};
SEMICOLON{-PARTOF(NameLinker) -> MARK(NameLinker)};
SPECIAL{-PARTOF(NameLinker), REGEXP("&") -> MARK(NameLinker)};

DECLARE FirstNameInd, FirstNameInitial, SingleChar;
CW{-PARTOF(FirstNameInitial), REGEXP(".")} SPECIAL{-    PARTOF(FirstNameInitial), REGEXP("-")} CW{REGEXP(".") ->     MARK(FirstNameInitial,1,2,3,4)} PERIOD;
SPECIAL{-PARTOF(FirstNameInitial), REGEXP("-")} CW{REGEXP(".") ->    MARK(FirstNameInitial,1,2,3)} PERIOD;
CW{-PARTOF(FirstNameInitial), REGEXP(".") -> MARK(FirstNameInitial,1,2)} PERIOD;
CW{-PARTOF(FirstNameInitial), REGEXP(".") -> MARK(FirstNameInitial)} COMMA;
CW{-PARTOF(FirstNameInitial), REGEXP(".") -> MARK(SingleChar)};

DECLARE Quote, QuotedStuff;
SPECIAL[1,2]{REGEXP("[\"'´`‘’“]"), -PARTOF(Quote) -> MARK(Quote)};
Document{-> RETAINTYPE(SPACE)};
W Quote{-> UNMARK(Quote)} W;
Document{-> RETAINTYPE};
BLOCK(InRef) Reference{}{
    Quote ANY+{-PARTOF(Quote) -> MARK(QuotedStuff, 1, 2, 3)} Quote;
}

DECLARE InInd;
W{REGEXP("In", true)-> MARK(InInd)};

DECLARE FirstToken, LastToken;
BLOCK(InRef) Reference{}{
    ANY{POSITION(Reference,1) -> MARK(FirstToken)};
    Document{-> MARKLAST(LastToken)};
}


DECLARE NumPeriod, NumComma, NumColon;
Document{-> RETAINTYPE(SPACE, BREAK)};
NUM PERIOD{-> MARKONCE(NumPeriod)} NUM;
NUM COMMA{-> MARKONCE(NumComma)} NUM;
NUM COLON{-> MARKONCE(NumColon)} NUM;
Document{-> RETAINTYPE};
DECLARE PeriodSep, CommaSep, ColonSep;
PERIOD{-PARTOF(FirstNameInitial), -PARTOF(NumPeriod), -PARTOF(FirstToken) -> MARKONCE (PeriodSep)};
COMMA{-PARTOF(FirstNameInitial), -PARTOF(NumComma), -  PARTOF(FirstToken) -> MARKONCE (CommaSep)};
COLON{-PARTOF(FirstNameInitial), -PARTOF(NumColon), -PARTOF(FirstToken) -> MARKONCE (ColonSep)};

1 个答案:

答案 0 :(得分:2)

我没有在GPU上运行Ruta的经验,如果与具有多个CPU的某些并行处理相比,这会带来任何优势。

Ruta变得越来越迫切,结果是你可以写快速但又慢的规则,这取决于你关心多少。

松散地说,每个规则都是特定类型注释的迭代器。如果你有很多通用类型的迭代器,那么你在UIMA中有很多索引操作。索引操作是花费的主要源时间,因此应该减少它们,例如,通过减少注释或选择更好的迭代器/规则。

您的规则示例包含许多改进运行时的潜在选项(仅第一次优化迭代):

  • 每个MARKFAST导致两个嵌套迭代器超过RutaBasic(所有原子文本跨度),它在整个文档上迭代七次。而是将规则编译成mtwl并使用TRIE动作。以下是如何执行此操作的示例:ruta-german-novel-with-dkpro

  • 您在连续规则中有几个重复的起始锚点,例如第32 + 33行。您可以使用BLOCK或内联规则对SPECIAL进行一次迭代:SPECIAL->{Document{REGEXP("[(]") -> MARK(LParen)};Document{REGEXP("[)]") -> MARK(RParen)};};您甚至可以通过迭代将其与其他类似规则结合一次,并将所有这些规则分类一次。

  • 您的规则不应用动态锚定,您不指定规则匹配的起始锚点。例如,第58行中的规则需要迭代所有单词。这不是必需的,因为您还可以使用W @Quote{-> UNMARK(Quote)} W;仅对所有引用注释进行迭代,这样会快得多。有几条规则可以通过这种方式进行优化。

  • 如果你有相同的迭代器但是有第49-53行的附加顺序依赖,你应该使用FOREACH块。在这里,您可以迭代CW并在每个CW上应用几个规则锚定。

  • 有些情况确实很慢。例如,您应该避免POSITION(第69行)并将其替换为MARKFIRST动作。

正如Renaud所说,Ruta Workbench提供了分析功能。它显示脚本的哪一部分(规则,块)占用了多长时间,以及大多数时间所需的语言元素(条件,操作)。在那里,您可以获得一个很好的指标,哪些部分值得优化。

免责声明:我是UIMA Ruta的开发者