2016-10-24 14 views
2

Ruta Script実行中にCPU使用率が高すぎるため、GPUを使用する予定です。 GPUマシンでスクリプトを実行するために追加の処理を行う必要があるかどうか。これは、複数のCPUを搭載したいくつかの並列化されたプロセスに比べてどんな利点をもたらすならば、私は何の経験GPU上ルタを実行しているを持っていないと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

:Orelseは、CPUの使用量を削減するために任意の代替ソリューションは

サンプルスクリプトがあります。

ルタは、あなたが気にかかっているかどうかによって、速くても遅いルールを書くことができるようになってきています。

大まかに言えば、各ルールは、特定の種類の注釈に対するイテレータです。一般的な型よりもイテレータが多い場合は、UIMAで多くのインデックス操作が行われます。索引操作は、主なソース時間が費やされているので、注釈を減らすか、より良いイテレータ/ルールを選択するなどして、それらを減らす必要があります。

あなたのルールの例は、ランタイム(最適化の唯一の最初の反復)を改善するために多くの潜在的なオプションが含まれています:

  • 各MARKFASTを7回反復されるRutaBasic(すべての原子のテキストスパン)上の2つのネストされたイテレータを引き起こし完全な文書にむしろルールをmtwlにコンパイルし、TRIEアクションを使用します。 ruta-german-novel-with-dkpro

  • 連続するルールに複数の重複している開始アンカー、たとえば32 + 33行があります。 BLOCKまたはインラインルールを使用してSPECIALで一度反復することができます。SPECIAL->{Document{REGEXP("[(]") -> MARK(LParen)};Document{REGEXP("[)]") -> MARK(RParen)};}; ANYを1回反復して、他の同様のルールと組み合わせることもできます。

  • ルールには動的アンカーが適用されません。ルールマッチの開始アンカーは指定しません。例えば、58行目のルールは、すべての単語に対して繰り返す必要があります。はるかに速いW @Quote{-> UNMARK(Quote)} W;のすべてのQuote注釈に対してのみ繰り返し処理を行うことができるので、これは必須ではありません。このように最適化できるルールがいくつかあります。

  • イテレータは同じですが、49-53行目のような追加的な依存関係がある場合は、FOREACHブロックを使用する必要があります。ここでは、CWを繰り返し処理し、各CWに固定されたいくつかのルールを適用できます。

  • いくつかの条件は非常に遅いです。たとえば、POSITION(行69)を避け、MARKFIRSTアクションに置き換える必要があります。

Renaudが言及したように、Ruta Workbenchはプロファイリング機能を提供します。スクリプトのどの部分(ルール、ブロック)がどのくらいの時間を要したか、どの言語要素(条件、アクション)が大部分の時間を必要としたかを表示します。そこでは、最適化する価値のある指標が得られます。

免責事項:私はあなたがスクリプトの一部を共有することができUIMAルタ

+0

私はMARKFASTの代わりにTRIEを試しました。私は注釈値でRepeitionを受け取ります。 –

+0

私は-PARTOFを使用しましたが、動作しませんでした –

+0

なぜ繰り返しのkinfですか? –