最近在学习Deep Learning。ND4j是一个类似于Python Numpy的Java版本实现,支持CPU和GPU Backend。很是好奇,这两者性能到底能差多少,于是做了一个小的测试。
安装CUDA Toolkit 8.0
最新的CUDA Tooklit版本是9.1,但是目前最新ND4j的Release版本(0.9.1)还不支持。(看了ND4j论坛里的讨论,master branch已经支持9.1)0.9.1只支持CUDA 7.5和8.0,我的实验中,安装了8.0版本。在这里下载Installer和Patch。
安装完成后,机器要重启一下。
ND4j的Maven配置
在Maven里通过切换Nd4j的artifactId来设置CPU或GPU Backend。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <nd4j.version>0.9.1</nd4j.version> <!--<nd4j.backend>nd4j-native-platform</nd4j.backend>--> <nd4j.backend>nd4j-cuda-8.0-platform</nd4j.backend> </properties> <dependencies> <dependency> <groupId>org.nd4j</groupId> <artifactId>${nd4j.backend}</artifactId> <version>${nd4j.version}</version> </dependency> ... </dependencies> |
nd4j-native-platform是CPU Backend,nd4j-cuda-8.0-platform是GPU Backend。
一个简单的测试
下面是一个简单的测试代码,两个10K by 10K的Matrices做Outer Product。
1 2 3 4 5 6 7 8 9 10 11 12 |
final int dimension = 10000; System.out.println("Do something big..."); Stopwatch sw = Stopwatch.createUnstarted(); sw.start(); INDArray bigND = Nd4j.rand(dimension, dimension); INDArray bigND2 = Nd4j.rand(dimension, dimension); INDArray bigND3 = bigND2.mmul(bigND); sw.stop(); System.out.println("Spent " + sw.elapsed(TimeUnit.MILLISECONDS) + "ms"); |
我的CPU是i7-5820K,GPU是GTX 970 3.5GB。测试结果真的非常让人吃惊 – GPU 497ms, CPU 7827ms. 差了约16倍。
我终于知道NViDIA的股价为什么涨这么多了!😁