Как ускорить процесс создания модели OpenNLP

Я использую средство поиска имен токенов OpenNLP для анализа неструктурированных данных, я создал корпус (тренировочный набор) из записей 4MM, но поскольку я создаю модель из этого корпуса с использованием API OpenNLP в Eclipse, процесс занимает около 3 часов, что составляет очень много времени. Модель строится с параметрами по умолчанию, то есть итерацией 100 и отсечкой 5.

Итак, мой вопрос в том, как я могу ускорить этот процесс, как я могу сократить время, затрачиваемое на процесс построения модели.

Причиной этого может быть размер корпуса, но я просто хотел знать, сталкивался ли кто-нибудь с такой проблемой, и если да, то как ее решить.

Пожалуйста, дайте какую-нибудь подсказку.

Заранее спасибо!


person Nikhil Jain    schedule 18.11.2014    source источник
comment
Попробуйте параметры памяти jvm: -Xms=512m -Xmx=2048m   -  person Ramanan    schedule 19.11.2014
comment
Спасибо за предложение, но вы знаете, что я уже увеличил -Xmx до 10 ГБ, так как процесс занимает около 10 ГБ. После увеличения памяти, все еще это занимает 3 часа. Вот почему я немного обеспокоен.   -  person Nikhil Jain    schedule 19.11.2014
comment
Другого способа ускорить процесс нет. Экспорт его в виде файла jar и его запуск могут дать вам дополнительные ~ 500 МБ (что занимает eclipse). Это 4 миллиона записей? Я думаю, GATE (gate.ac.uk) займет еще больше времени, чем это.   -  person Ramanan    schedule 19.11.2014
comment
хорошо, я попытаюсь экспортировать проект в виде файла jar и запустить его в командной строке. Да корпус содержит 4 миллиона записей. У вас есть идеи, как я могу запустить это на Spark для ускорения процесса.   -  person Nikhil Jain    schedule 19.11.2014
comment
Переход к масштабируемому распределенному решению (например, Apache Spark), вероятно, является правильной идеей. Я не уверен, какую модель вы строите, но MLlib Spark поддерживает несколько типов. spark.apache.org/docs/1.1.0/mllib-guide. html   -  person Daniel Darabos    schedule 25.11.2014
comment
Я знаю, что MLib от Spark — это один из вариантов, но я давно работаю над OpenNLP и не хочу переключаться с openNLP на Mlib. Я нашел в Интернете, что можно интегрировать openNLP со Spark с помощью UIMAFit, но не нашел хороших примеров.   -  person Nikhil Jain    schedule 28.11.2014


Ответы (2)


Обычно первым подходом к решению таких проблем является разделение обучающих данных на несколько фрагментов и предоставление каждому из них возможности создать собственную модель. После этого вы объединяете модели. Я не уверен, что это справедливо в данном случае (я не эксперт OpenNLP), ниже есть другое решение. Кроме того, поскольку кажется, что API OpenNLP предоставляет только однопоточные методы train(), я бы зарегистрировал проблему с запросом многопоточной опции.

Для медленной однопоточной операции двумя основными факторами замедления являются IO и CPU, и оба они могут обрабатываться отдельно:

  • IO - какой жесткий диск вы используете? Обычный (магнитный) или SSD? переход на SSD должен помочь.
  • ЦП - какой ЦП вы используете? переход на более быстрый процессор поможет. Не обращайте внимания на количество ядер, здесь вам нужна чистая скорость.

Вариант, который вы, возможно, захотите рассмотреть, чтобы получить сервер с высокой производительностью процессора от веб-сервисов Amazon или Google Compute Engine и запустить там обучение — вы можете загрузить модель позже. Оба дают вам серверы с высокой производительностью, использующие процессоры Xeon (Sandy Bridge или Ivy Bridge) и локальное хранилище SSD.

person David Rabinowitz    schedule 25.11.2014
comment
Можно ли создавать небольшие модели, а затем объединять их в одну? Мне любопытно узнать, какая библиотека поддерживает это? - person Nikhil Jain; 28.11.2014
comment
Привет @Nikhil, как я уже писал, я не эксперт НЛП, так что это была просто идея. Как вы можете видеть из моего ответа, я не думаю, что это возможно, поэтому я перечислил другие варианты. - person David Rabinowitz; 28.11.2014
comment
Привет, Дэвид, я увеличил свою оперативную память, после чего модель создается намного быстрее, чем раньше (занимает 50 минут на записи 3MM). Кроме того, метод train() также обеспечивает многопоточность, поэтому я добавляю несколько потоков, скажем, 10, что также улучшает производительность моей модели. Спасибо за хорошие предложения. - person Nikhil Jain; 01.12.2014
comment
Я работал с НЛП и OpenNLP достаточно долго, чтобы сказать вам, что невозможно объединить меньшие модели для создания большей. Некоторые модели меньшего размера могут содержать функции, которых другие модели даже не видели. Последним шагом в обучении является присвоение весов всем функциям, вероятность того, что событие произойдет при наличии конкретной функции. Единственный вариант — выбрать самую эффективную модель из множества меньших моделей, а слияние — не вариант. - person Vihari Piratla; 24.12.2014

Я думаю, вам следует внести изменения, связанные с алгоритмом, перед обновлением оборудования.
Уменьшение размера предложения
Убедитесь, что в обучающей выборке нет излишне длинных предложений. Такие предложения не увеличивают производительность, но оказывают огромное влияние на вычисления. (Не уверен в порядке) Обычно я ограничиваю 200 слов в предложении. Также внимательно посмотрите на функции, это генераторы функций по умолчанию
two kinds of WindowFeatureGenerator with a default window size of only two OutcomePriorFeatureGenerator PreviousMapFeatureGenerator BigramNameFeatureGenerator SentenceFeatureGenerator
Эти генераторы функций генерируют следующие функции в данном предложении для слова: Robert.

Sentence: Robert, creeley authored many books such as Life and Death, Echoes and Windows.
Features:
w=robert
n1w=creeley
n2w=authored
wc=ic
w&c=robert,ic
n1wc=lc
n1w&c=creeley,lc
n2wc=lc
n2w&c=authored,lc
def
pd=null
w,nw=Robert,creeley
wc,nc=ic,lc
S=begin


ic — начальная заглавная буква, lc — нижний регистр

Из этих признаков S=begin — единственный признак, зависящий от предложения, который отмечает, что Robert встречается в начале предложения.
Моя цель состоит в том, чтобы объяснить роль полного предложения в обучении. На самом деле вы можете удалить SentenceFeatureGenerator и уменьшить размер предложения, чтобы разместить только несколько слов в окне желаемого объекта. Это будет работать так же хорошо.
Я уверен, что это сильно повлияет на сложность и очень мало на производительность.

Вы думали о выборке?
Как и я у описанных выше особенностей очень разреженное представление контекста. Возможно, у вас есть много предложений с дубликатами, как это видят генераторы признаков. Попытайтесь обнаружить их и сделать выборку таким образом, чтобы представить предложения с разнообразными шаблонами, т.е. должно быть невозможно написать только несколько регулярных выражений, которые соответствуют им всем. По моему опыту, обучающие выборки с разнообразными шаблонами показали лучшие результаты, чем те, которые представляют только несколько шаблонов, даже несмотря на то, что в первых было гораздо меньшее количество предложений. Такой способ выборки никак не должен влиять на производительность модели.

Спасибо.

person Vihari Piratla    schedule 24.12.2014
comment
Спасибо Вихари за ответ. Я понимаю вашу точку зрения, но как я могу отказаться от генератора предложений? как я могу увидеть функции, предоставляет ли OpenNLP какую-либо утилиту командной строки для этого? не могли бы вы поделиться, как вы сгенерировали функции для приведенного выше предложения, как только я получу генераторы функций, я попытаюсь определить дубликаты. Возможно, в тренировочном наборе будут дубликаты, поскольку я создаю его программно. - person Nikhil Jain; 06.01.2015
comment
Sentence Feature Generator — это просто причудливый токенизатор предложений, он никак не влияет на производительность. OpenNLP не предоставляет утилиту командной строки для просмотра функций; Я добавил несколько операторов печати в свой код (не помню где). Как я сказал в ответе, функции зависят только от небольшого окна объекта (OpenNLP называет их событиями), идентифицируют такие объекты, сохраняют только окно вокруг них и выделяют такие подпредложения как предложения. Или попробуйте второй метод (выборка), который проще (поскольку вам просто нужно подобрать несколько регулярных выражений), и я более уверен в этом. - person Vihari Piratla; 06.01.2015
comment
Привет, Дэвид, есть ли возможность интегрировать open nlp со spark для распараллеливания процесса синтаксического анализа? - person Praveen Kumar K S; 20.07.2016