2017-08-31 118 views
1

我正在嘗試用H2O(3.14)來訓練機器學習模型。我的數據集大小是4Gb,而我的計算機RAM是2Gb,JDK 1.8是2Gb。參考article,H2O可以處理2Gb RAM的大數據集。如何用H2O處理大數據集

  • 在更大的數據和GC的說明:我們做一個用戶模式交換到磁盤時,Java堆已滿,即你正在使用更多的大數據比 物理DRAM。我們不會死於GC死亡螺旋,但我們會降低到核心外的速度。我們將盡可能快地達到 允許的磁盤。我親自測試了將12Gb數據集加載到2Gb (32位)JVM中;大約需要5分鐘才能加載數據,另外需要5分鐘來運行Logistic迴歸。

解決此問題的一些問題:

解決方法1:

我配置的選項java -Xmx10g -jar h2o.jar Java堆。當我加載數據集。 H2O信息如下:

但是,JVM消耗了所有的RAM內存和Swap,然後操作系統暫停了java h2o程序。

解決方法2:

我安裝H2O spark。我可以加載的數據集,但火花與一個完整的交換內存以下日誌掛:

+ FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM! 
09-01 02:01:12.377 192.168.233.133:54321 6965 Thread-47 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM! 
09-01 02:01:12.377 192.168.233.133:54321 6965 Thread-48 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM! 
09-01 02:01:12.381 192.168.233.133:54321 6965 Thread-45 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.3 MB + FREE:426.7 MB == MEM_MAX:2.67 GB), desiredKV=803.2 MB OOM! 
09-01 02:01:12.382 192.168.233.133:54321 6965 Thread-46 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.4 MB + FREE:426.5 MB == MEM_MAX:2.67 GB), desiredKV=840.9 MB OOM! 
09-01 02:01:12.384 192.168.233.133:54321 6965 #e Thread WARN: Swapping! GC CALLBACK, (K/V:1.75 GB + POJO:513.4 MB + FREE:426.5 MB == MEM_MAX:2.67 GB), desiredKV=802.7 MB OOM! 
09-01 02:01:12.867 192.168.233.133:54321 6965 FJ-3-1 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.4 MB + FREE:426.5 MB == MEM_MAX:2.67 GB), desiredKV=1.03 GB OOM! 
09-01 02:01:13.376 192.168.233.133:54321 6965 Thread-46 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=803.2 MB OOM! 
09-01 02:01:13.934 192.168.233.133:54321 6965 Thread-45 WARN: Swapping! OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM! 
09-01 02:01:12.867 192.168.233.133:54321 6965 #e Thread WARN: Swapping! GC CALLBACK, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=803.2 MB OOM! 

在這種情況下,我認爲gc收集正在等待清理掉一些不用的內存。

如何在有限的RAM內存中處理大型數據集?

+0

爲什麼'r'標籤? – shmosel

+0

我刪除了'r'標籤。我的客戶端是一個'r'程序 – khant

回答

1

如果這是以任何方式商業化,購買更多的RAM,或支付幾美元在雲服務器上租用幾個小時。

這是因爲在太小的機器上進行機器學習的額外時間和精力是不值得的。

如果是一個學習項目,根本沒有預算:將數據集切成8個相同大小的部分(*),然後使用第一部分來製作和調整模型。 (如果數據不是隨機排列的,請將它分成32等分,然後連接部分1,9,17和25;或類似的東西)。

如果您確實真的需要構建模型使用整個數據集,然後仍然執行上述操作。但是,然後保存模型,然後移動到8個數據集中的第二個。在這一點上,您將已經調整了超參數,因此您只需生成一個模型,並且它會很快。重複3到8部分。現在你有8個模型,並且可以在一個合奏中使用它們。

*:我選擇了8,它給了你一個0。5GB數據集,這是可用內存的四分之一。對於早期的實驗,我實際上建議進行更小的實驗,例如, 50MB,因爲它會使迭代速度更快。

一對夫婦更多的心思:

  • H2O壓縮在內存中的數據。因此,如果4GB是未壓縮的數據大小,您可能會用較小的內存。 (但是,請記住,建議使用的內存大小是數據大小的3-4倍。)
  • 如果您有一些擁有類似小內存計算機的朋友,則可以將它們聯網在一起。 4到8臺計算機可能足以裝載您的數據。它可能運行良好,速度可能非常慢,這取決於算法(以及網絡的速度)。
+0

是否有任何解決方案用像keras框架這樣的生成器方法來擬合模型? – khant

+0

@khant不是我所知道的。 H2O理念是內存機器學習,它可以在羣集上高效工作:不斷添加機器,直到總羣集內存足夠大以滿足您的數據集。 (我只是給我的答案增加了幾個想法,希望它有幫助。) –

1

從2014年引用的文章已經過時了很多年,是指H2O-2。 H2O內用戶模式交換到磁盤的概念當時是實驗性的。

但是這在H2O-3(它成爲2015年初的主要H2O代碼庫)中從未得到支持,因爲性能很差,正如引用的StackOverflow文章所解釋的那樣。