如何减少使用deeplearning4j(内存映射文件和WorkspaceConfiguration)的程序中的RAM利用率?


林老爷的日常
2024-12-08 10:11:24 (4月前)
  1. 我正在使用deeplearning4j但是当我加载预先训练的文本分类模型时,我的电脑上没有足够的RAM

我试图改变eclipse.ini文件并添加更多内存来改变Xms和Xmx。 …

2 条回复
  1. 0# 十二* | 2019-08-31 10-32



    我来自deeplearning4j项目。内存映射工作空间用于嵌入是,并且应该被视为与我们的堆外存储器不同的概念。 off堆内存是一个概念性的漏洞我不会在这里介绍(你必须要了解JVM,这里的主题不相关)



    您必须使用内存映射工作空间的方法是将word2vec加载到内存映射范围内。
    第一个组件是配置:




    1. 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();

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

    3. }

    4. </code>


    值得注意的是,内存映射工作空间是应该如何使用的。 Mem map仅用于访问大型数组并从ram中提取它的子集。
    您应该只使用它来提取训练所需的单词向量的子集。



    当使用word2vec(或任何其他嵌入技术)时,典型的模式是仅查找所需的单词向量,并将它们合并到一个小批量中。
    该小批量(以及相关的培训)应该在一个单独的工作区中进行(或者将其取消,这是默认的)。你可以将它解除连接的原因是我们已经在ComputationGraph和MultiLayerNetwork中为你做了工作空间和其他相关的优化。只要确保传递你需要适合的任何东西。



    从那里,使用INDArray get(..)和put(..)方法将您需要的行复制到另一个应该用于训练的数组中。
    有关更多信息,请参阅:

    https://deeplearning4j.org/docs/latest/nd4j-overview



    有关更多信息,请参阅INDArray javadoc中的leverage,leverageTo,detach,..:

    1. <a href="https://deeplearning4j.org/api/latest/org/nd4j/linalg/api/ndarray/INDArray.html" rel="nofollow noreferrer">
    2. https://deeplearning4j.org/api/latest/org/nd4j/linalg/api/ndarray/INDArray.html
    3. </A>


登录 后才能参与评论