2016-10-24 14 views
2

Использование процессора слишком велико при запуске Ruta Script.So Я планирую использовать графический процессор. Нужно ли мне делать какой-либо дополнительный процесс для запуска скрипта на машине GPU. OrElse есть ли альтернативное решение, чтобы уменьшить использование ЦПИспользование процессора слишком велико во время работы Ruta Script

Пример сценарий:

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 и если это приносит какое-либо преимущество по сравнению с некоторым распараллеленным процессом с несколькими процессорами.

Ruta становится все более и более императивным, вследствие чего вы можете писать быстрые, но также и медленные правила, в зависимости от того, насколько вы заботитесь.

Любое слово, каждое правило является итератором по конкретному типу аннотации. Если у вас много итераторов по общим типам, в UIMA есть много операций с индексами. Операция индекса - основное время, затрачиваемое на основное время, поэтому их следует уменьшить, например, путем сокращения аннотаций или выбора лучших итераторов/правил.

Вашего примера правило содержит много потенциальных возможностей для улучшения выполнения (только первая итерация оптимизации):

  • Каждого MARKFAST вызывает два вложенных итератор над RutaBasic (все атомное текст охватывает), который итерация семь раз над полным документом. Скорее компилируйте правила в mtwl и используйте действие TRIE. Вот пример, как это сделать: ruta-german-novel-with-dkpro

  • У вас есть несколько повторяющихся стартовых якорей в последовательных правилах, например, строка 32 + 33. Вы можете перебирать один раз по SPECIAL с помощью BLOCK или встроенных правил: SPECIAL->{Document{REGEXP("[(]") -> MARK(LParen)};Document{REGEXP("[)]") -> MARK(RParen)};}; Вы даже можете комбинировать его с другими аналогичными правилами путем итерации один раз через ЛЮБОЕ и классифицировать их только один раз.

  • Ваши правила не применяют динамическое закрепление, вы не указываете стартовый якорь соответствия правила. Правило в строке 58, например, должно перебирать все слова. Это необязательно, так как вы можете также перебирать только все аннотации Quote с W @Quote{-> UNMARK(Quote)} W;, что намного быстрее. Существует несколько правил, которые можно оптимизировать таким образом.

  • Если у вас есть те же итераторы, но есть дополнительная последовательная зависимость, как в строке 49-53, вы должны использовать блок FOREACH. Здесь вы можете перебирать CW и применять несколько правил для каждого CW.

  • Некоторые условия очень медленные. Например, вам следует избегать POSITION (строка 69) и заменить его действием MARKFIRST.

Как отметил Рено, Ruta Workbench обеспечивает функции профилирования. Он показывает, какая часть вашего скрипта (правило, блок) заняла время, а также какой элемент языка (условие, действие) требуется большую часть времени. Там вы получаете хороший индикатор, части которого стоит оптимизировать.

ОТКАЗ: Я разработчик UIMA Ruta

+0

Я попробовал TRIE вместо MARKFAST, я получаю повторение в значении аннотации. –

+0

Я использовал -PARTOF, но это не сработало –

+0

Почему kinf повторений? –