2016-10-24 21 views
2

運行Ruta Script時CPU使用率過高。因此我打算使用GPU。是否需要執行任何額外的過程才能在GPU機器中運行腳本。否則容易有任何替代解決方案來降低CPU使用率運行Ruta Script時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)}; 
+0

可以共享腳本的一部分?你有沒有試圖在Ruta工作臺中對其進行分析? – Renaud

回答

2

我在GPU上運行魯塔沒有經驗,如果這會帶來任何好處相比,多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行中的規則需要遍歷所有單詞。這是沒有必要的,因爲您也可以只使用W @Quote{-> UNMARK(Quote)} W;進行遍歷所有引用註釋,這個速度要快得多。有幾條規則可以通過這種方式進行優化。

  • 如果您具有相同的迭代器但具有像第49-53行那樣的附加依賴關係,則應使用FOREACH塊。在這裏,您可以遍歷CW並應用幾個錨定在每個CW上的規則。

  • 有些情況真的很慢。例如,您應該避免POSITION(第69行)並用MARKFIRST操作替換它。

正如Renaud所說,Ruta Workbench提供了分析功能。它顯示腳本(規則,塊)的哪部分需要多長時間,以及大部分時間需要哪種語言元素(條件,動作)。你會得到一個很好的指標,哪些部件值得優化。

免責聲明:我是UIMA魯塔開發商

+0

我試過TRIE而不是MARKFAST,我在註解值中收到重複。 –

+0

我使用了-PARTOF,但它沒有工作 –

+0

爲什麼重複? –