同学们,愚人节快乐,
今天我很荣幸向大家介绍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支持各个厂商的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的功能仍然有待继续完善,我们将在正式版本发布以前完成以下功能:
欢迎大家来贡献代码和文档。新贡献者可以从good first issues开搞。