我来自deeplearning4j项目。内存映射工作空间用于嵌入是,并且应该被视为与我们的堆外存储器不同的概念。 off堆内存是一个概念性的漏洞我不会在这里介绍(你必须要了解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
}
</code>
值得注意的是,内存映射工作空间是应该如何使用的。 Mem map仅用于访问大型数组并从ram中提取它的子集。
您应该只使用它来提取训练所需的单词向量的子集。
当使用word2vec(或任何其他嵌入技术)时,典型的模式是仅查找所需的单词向量,并将它们合并到一个小批量中。
该小批量(以及相关的培训)应该在一个单独的工作区中进行(或者将其取消,这是默认的)。你可以将它解除连接的原因是我们已经在ComputationGraph和MultiLayerNetwork中为你做了工作空间和其他相关的优化。只要确保传递你需要适合的任何东西。
从那里,使用INDArray get(..)和put(..)方法将您需要的行复制到另一个应该用于训练的数组中。
有关更多信息,请参阅:
https://deeplearning4j.org/docs/latest/nd4j-overview
有关更多信息,请参阅INDArray javadoc中的leverage,leverageTo,detach,..:
<a href="https://deeplearning4j.org/api/latest/org/nd4j/linalg/api/ndarray/INDArray.html" rel="nofollow noreferrer">
https://deeplearning4j.org/api/latest/org/nd4j/linalg/api/ndarray/INDArray.html
</A>