2

运行 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)};
4

1 回答 1

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)};};您甚至可以通过对 ANY 进行一次迭代并将其与其他类似规则组合起来,并且只对它们进行一次分类。

  • 您的规则不应用动态锚定,您没有指定规则匹配的起始锚点。例如,第 58 行中的规则需要遍历所有单词。这不是必需的,因为您也可以只遍历所有 Quote 注释,W @Quote{-> UNMARK(Quote)} W;这样更快。有几个规则可以通过这种方式进行优化。

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

  • 有些条件真的很慢。例如,您应该避免使用 POSITION(第 69 行)并将其替换为 MARKFIRST 操作。

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

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

于 2016-10-27T07:43:05.273 回答