Как я могу уменьшить использование оперативной памяти в моей программе, использующей deeplearning4j (файлы с отображением в памяти и WorkspaceConfiguration)? - PullRequest
0 голосов
/ 07 декабря 2018

Я использую deeplearning4j, но когда я загружаю предварительно обученную модель для классификации текста, у меня не хватает оперативной памяти на моем компьютере.

Я пытался изменить файл eclipse.ini и добавить дополнительные изменения памятиXms и Xmx.К сожалению, это не работает для меня.

https://deeplearning4j.org/docs/latest/deeplearning4j-config-memory

В этой ссылке, кажется, есть возможное решение использовать меньше оперативной памяти, даже если это стоит больше времени, но я неТеперь все равно.

По этой ссылке:

Файлы с отображением в памяти ND4J поддерживает использование файла с отображением в памяти вместо ОЗУ при использовании собственного nd4j-собственного бэкенда.С одной стороны, это медленнее, чем ОЗУ, но, с другой стороны, позволяет распределять фрагменты памяти способом, невозможным в противном случае.

Могу ли я добавить это в подобный код (перейдите по ссылке)?

https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/nlp/word2vec/Word2VecRawTextExample.java

Конечно, если есть другой способ (или лучший способ) написать это.Буду признателен за любые советы.

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

1 Ответ

0 голосов
/ 08 декабря 2018

Я из проекта deeplearning4j.Рабочие пространства с отображением в памяти созданы для встраивания да, и их следует рассматривать отдельно от нашей памяти без кучи.Память вне кучи - это концептуальная кроличья нора, которую я не буду здесь освещать (вам необходимо иметь представление о JVM, а тема здесь не актуальна)

Способ использования рабочих мест с отображением в памятиэто путем загрузки word2vec внутри области отображения памяти.Первый компонент - это конфигурация:

import org.nd4j.linalg.api.memory.MemoryWorkspace;
import org.nd4j.linalg.api.memory.conf.WorkspaceConfiguration;
import org.nd4j.linalg.api.memory.enums.LocationPolicy;
WorkspaceConfiguration mmap = WorkspaceConfiguration.builder()
            .initialSize(initialSize)
            .policyLocation(LocationPolicy.MMAP)
            .build();

try (MemoryWorkspace ws =   
           Nd4j.getWorkspaceManager().getAndActivateWorkspace(mmap)) {
 //load your word2vec here            

} 

Следует обратить внимание на то, как следует использовать рабочие области с отображением в памяти.Карта памяти предназначена только для доступа к большому массиву и извлечения его подмножеств из памяти.Вы должны использовать его только для извлечения подмножества векторов слов, необходимых для обучения.

При использовании word2vec (или любого другого метода встраивания) типичным шаблоном является поиск только тех словосочетаний, которые вы хотитеи объединить их в мини-пакет.Этот мини-пакет (и связанное с ним обучение) должен происходить в отдельном рабочем пространстве (или он должен быть отсоединен, что является значением по умолчанию).Причина, по которой вы можете отсоединить его, заключается в том, что мы уже делаем рабочие пространства и другие связанные с вами оптимизации внутри ComputationGraph и MultiLayerNetwork.Просто убедитесь, что передали все, что вам нужно.

Оттуда используйте методы INDArray get (..) и put (..), чтобы скопировать нужные вам строки в другой массив, который вы должны использовать для обучения.Подробнее об этом см .: https://deeplearning4j.org/docs/latest/nd4j-overview

Для получения дополнительной информации посмотрите плечо, плечо, отсоединение, .. в javadoc INDArray: https://deeplearning4j.org/api/latest/org/nd4j/linalg/api/ndarray/INDArray.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...