[英]How can I reduce the RAM utilization in my program that use deeplearning4j (Memory-mapped files and WorkspaceConfiguration)?
我正在使用deeplearning4j,但是當我加載預訓練模型進行文本分類時,我的電腦上沒有足夠的RAM。
我試圖更改eclipse.ini文件並添加更多更改Xms和Xmx的內存。 不幸的是,這對我不起作用。
https://deeplearning4j.org/docs/latest/deeplearning4j-config-memory
在此鏈接中,似乎有可能使用較少的RAM的解決方案,即使這會花費更多的時間,但我現在不在乎。
從該鏈接:
內存映射文件當使用nd4j-native后端時,ND4J支持使用內存映射文件而不是RAM。 一方面,它比RAM慢,但另一方面,它允許您以其他方式無法分配的內存塊。
我可以在這樣的代碼中添加此代碼(按照鏈接)嗎?
如果有其他方法(或更好的方法)編寫它,請參見。 我將不勝感激任何建議。
提前致謝。
我來自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
}
內存映射的工作區值得注意的是應如何使用它。 內存映射僅用於訪問大型數組並將其子集從ram中拉出。 您只應使用它來提取進行訓練所需的單詞向量的子集。
使用word2vec(或任何其他嵌入技術)時,典型的模式是僅查找所需的單詞向量,然后將它們合並為一個小批。 該小批量(和相關的培訓)應在單獨的工作空間中進行(或將其取消附加,這是默認設置)。 之所以可以不附加它,是因為我們已經在ComputationGraph和MultiLayerNetwork內部為您完成了工作區和其他相關的優化。 只要確保傳遞您需要的任何東西即可。
從那里,使用INDArray get(..)和put(..)方法將所需的行復制到另一個應用於訓練的數組中。 有關更多信息,請參見: https : //deeplearning4j.org/docs/latest/nd4j-overview
有關更多信息,請參見INDArray javadoc中的杠桿率,桿柄杠桿率,分離率,..: https ://deeplearning4j.org/api/latest/org/nd4j/linalg/api/ndarray/INDArray.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.