發布Compute.scala,多維數組上的科學計算庫

同學們,愚人節快樂,

今天我很榮幸向大家介紹Compute.scala。Compute.scala是個科學計算庫,可以利用GPU、CPU和其他設備並行計算多維數組。它是下一版本DeepLearning.scala v3.0的新後端,用來解決我們在DeepLearning.scala v2.0的ND4J後端中遇到的各種性能問題:

  • Compute.scala可以把多個操作動態合併成一個核函數。執行複雜計算公式時能比以前大大加速。
  • Compute.scala可以把內存、顯存和其他原生資源管理起來,消耗的資源要比ND4J依賴垃圾收集的做法少得多。
  • Compute的維度轉換操作(比如permute, broadcast, reshape)都是視圖,不額外佔用顯存或內存。
  • Compute的多維數組可以和JVM的集合互相轉換,從而可以支持Scala原生的mapreduce等集合操作,而且依然可以運行在GPU上。

性能評測

我們最近做了一些性能評測,對比Compute.scala和ND4J的性能:

  • Compute.scala vs ND4J on an NVIDIA Titan X GPU
  • Compute.scala on an AMD RX480 GPU

從性能評測結果看:

  • Compute.scala支持各個廠商的GPU,ND4J只支持NVIDIA GPU。
  • 在大數組上,Compute.scala比ND4J快。比如把65536×32的矩陣和32×32的矩陣相乘,那麼Compute.scala要比ND4J快12倍多。
  • 運行包含多個原子操作的複雜公式,Compute.scala比ND4J快。比如當對32×32×32的數組調用一個tanh時,Compute.scala只比ND4J快五倍多,但是如果執行的表達式包含了100個tanh,Compute.scala就比ND4J快三十倍多。
  • 在很小的數組上執行單個簡單操作時,ND4J比Compute.scala快。
  • ND4J的permutebroadcast極慢,大概比Compute.scala慢上百倍,導致我們的卷積評測根本跑不出能看的結果(註:和ND4J同一家作者的Deeplearning4J用了文檔上沒記載的內部特殊方式使用permutebroadcast,並不像上述評測里這麼慢)。

註:這個評測結果並不是愚人節笑話。

後續工作

我們剛剛完成Compute.scala的最小可用原型,版本號v0.3.1。Compute.scala的功能仍然有待繼續完善,我們將在正式版本發布以前完成以下功能:

  • 支持單精度浮點數以外的數據類型(#104)
  • 增加更多的OpenCL數學函數(#101)
  • 進一步性能調優(#62, #103)

歡迎大家來貢獻代碼和文檔。新貢獻者可以從good first issues開搞。

相關鏈接

  • Compute.scala on Github
  • Compute API Documentation

推薦閱讀:

基於 TensorFlow 的第一個神經網路
機器學習導論——Day8、9
如何正確使用「K均值聚類」?
複習:PCA有關
Facebook如何利用機器演算法人工智慧教計算機閱讀

TAG:Scala | 科學計算 | 機器學習 |