發布Compute.scala,多維數組上的科學計算庫
04-26
同學們,愚人節快樂,
今天我很榮幸向大家介紹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原生的
map
、reduce
等集合操作,而且依然可以運行在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的
permute
和broadcast
極慢,大概比Compute.scala慢上百倍,導致我們的卷積評測根本跑不出能看的結果(註:和ND4J同一家作者的Deeplearning4J用了文檔上沒記載的內部特殊方式使用permute
和broadcast
,並不像上述評測里這麼慢)。
註:這個評測結果並不是愚人節笑話。
後續工作
我們剛剛完成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如何利用機器演算法人工智慧教計算機閱讀