Обучение Gensim Doc2Vec вылетает с ошибкой Killed: 9

У меня есть документы с более чем 37 миллионами предложений, и я использую Gensim Doc2Vec для их обучения. Обучение модели отлично работает с небольшими наборами данных, скажем, с 5-10 миллионами записей. Однако при обучении на полном наборе данных процесс завершается в основном на этапе «сброса весов слоев». Иногда умирает раньше.

Подозреваю, что это проблема с памятью. У меня 16 ГБ оперативной памяти с 4 ядрами. Если это действительно проблема с памятью, могу ли я как-нибудь обучить модель партиями. Из прочтения документации кажется, что train () полезен в тех случаях, когда в новых документах нет новых словарей. Но с моими документами дело обстоит иначе.

Какие-либо предложения?


person N.Hamoud    schedule 25.07.2018    source источник


Ответы (1)


Модель больше не из-за необработанного размера корпуса, а из-за количества уникальных слов / тегов документов, которые вы хотите, чтобы модель обучалась.

Если вы используете 37 миллионов уникальных документов, каждый со своим собственным идентификатором в качестве doc-тега, и вы используете общий размер вектора, например 300 измерений, только для этих doc-векторов потребуется:

37 million * 300 dimensions * 4 bytes/dimension = 44.4 GB

Для уникальных слов и внутренних весов модели потребуется больше ОЗУ, но не столько, сколько для этих doc-векторов со словарем нормального размера и разумным выбором min_count, чтобы отбросить более редкие слова.

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

Лучше всего обучить модель на некотором меньшем репрезентативном подмножестве - возможно, просто на случайном подмножестве - которое умещается в адресуемой памяти. Затем, когда вам понадобятся векторы для других документов, вы можете использовать infer_vector(), чтобы вычислять их по одному, а затем сохранять их в другом месте. (Но у вас все равно не будет их всех в памяти, что может иметь решающее значение для достаточно быстрого сканирования для most_similar() или других сравнений с полным корпусом).

Использование машины с большим количеством оперативной памяти значительно упрощает работу с такими большими наборами векторов.

(Еще один возможный трюк включает использование параметра mapfile_path, но если вы не знакомы с тем, как ваша операционная система обрабатывает файлы с отображением памяти, и не понимаете, как в дальнейшем используется / преобразовывается большой массив docvecs для ваших последующих операций, он может будет больше проблем, чем оно того стоит. Это также повлечет за собой снижение производительности, что, вероятно, будет терпимо только в том случае, если ваши документы имеют один уникальный тег идентификатора, так что шаблон доступа к файлу mmapped всегда находится в обучении и поиске сходства простая загрузка спереди назад в том же первоначальном порядке. Вы можете увидеть этот ответ, чтобы получить более подробную информацию.)

person gojomo    schedule 26.07.2018
comment
Спасибо за ваш отзыв. Я очень ценю это. Я выполнял потоковую передачу документов и считаю, что это экономит память и время при загрузке всего корпуса и только его предварительной обработке. Как вы упомянули, объем памяти, необходимый для построения / обучения модели, остается прежним и зависит от размера вектора и количества слов. Интересно, почему процесс убивается, даже когда на SSD достаточно места, более 250 ГБ. Мы пытались построить модель на 4-ядерной машине, но она перестала работать, когда объем памяти занимал около 85 ГБ. Есть ли в ОС порог, который вызывает ошибку уничтожения, и можем ли мы что-нибудь с этим сделать? - person N.Hamoud; 31.07.2018
comment
Другой вопрос касается размера вектора, достаточно ли 300D и есть ли практическое правило выбора размера вектора. Обучение модели на меньшем наборе данных не идеально для моего проекта, поскольку это уже небольшое подмножество исходного набора данных. - person N.Hamoud; 31.07.2018
comment
Модель требует адресуемой памяти - по сути, ОЗУ. (Использование виртуальной памяти, даже с поддержкой SSD, довольно плохо и медленно для этих моделей, учитывая объем необходимого произвольного доступа. Тем не менее, трюк, который я упомянул, может использовать замененную виртуальную память и более низкую производительность < i> может быть терпимым во время обучения, если вы только продвигаетесь по док-тегам в исходном порядке.) - person gojomo; 01.08.2018
comment
Поскольку виртуальная память намного медленнее, чем ОЗУ, ваша ОС, вероятно, имеет некоторые ограничения на ее использование, и она, вероятно, не будет использовать больше, чем несколько кратных размеру ОЗУ в качестве виртуальной памяти. Обойти это будет вопрос, связанный с ОС ... но опять же, если вы используете любую виртуальную память во время тренировки, у вас, вероятно, будет ужасная скорость обучения, и вы получите гигантский модель, которая также не очень хороша для поиска после обучения. - person gojomo; 01.08.2018