发布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支持各个厂商的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开搞。


相关链接

文章被以下专栏收录