python,scikit-learn, scipy, C++, CUDA Cのk-meansベンチマーク用コードがあったのでやってみた。benchmark codeはこのサイトから拝借させてもらった。
K-Means benchmark(Scipy編)¶
%download https://raw.githubusercontent.com/goldsborough/k-means/master/python/k_means.py
次にテストに使用するデータをダウンロードしてくる。
%download https://github.com/goldsborough/k-means/blob/master/data/100k.csv?raw=true
次にダウンロードしたコードを以下のようにして実行する。
!python k_means.py -k 5 -d 100k.csv -m scipy -i 300 -r 5
k = 5, data = 100000, method = scipy, iteration = 300, run = 5の条件で走らせたベンチマークの結果は約1秒だった。
K-Means benchmark(Scikit-learn編)¶
Scikit-learnもScipyと同じ条件でベンチを走らせる。
!python k_means.py -k 5 -d 100k.csv -m sklearn -i 300 -r 5
scikit-learnはscipyよりもほんのちょい速い結果になった。正確に言うと、
0.99973435/0.94455233
scikit-learnはscipyよりも1.06倍処理が高速だった。
K-Means benchmark(Python編)¶
pythonもscikit-learnやScipyと同じ条件でベンチを走らせる。
!python k_means.py -k 5 -d 100k.csv -m custom -i 300 -r 5
予想通りpythonは一番の鈍足だった。これまで最速のsk-learnに比べ
4.23686709/0.94455233
4.5倍も実行速度が遅かった。と言っても実際にはnumpyっぽい。
K-Means benchmark(C++編)¶
先ず下記のサイトからC++ベンチコードをダウンロードしてくる。
%download https://raw.githubusercontent.com/goldsborough/k-means/master/cpp/k-means.cpp
!g++ -O3 -std=c++11 k-means.cpp -o kmeans
usage: k_means data-file k iterations runsの書式に合わせて実行する。
!./kmeans 100k.csv 5 300 5
0.94455233/0.205814
C++版はこれまで最速のSK-learn版より4.6倍も処理が高速だった。
C++Eigen編¶
%download https://raw.githubusercontent.com/goldsborough/k-means/master/cpp/k-means-eigen.cpp
!g++ -O3 -std=c++11 k-means-eigen.cpp -o k-means-eigen
Eigen/Denseヘッダーファイルが探せないみたいなので教えてあげる。
!g++ -O3 -std=c++11 -I/usr/local/include/eigen3/ k-means-eigen.cpp -o k-means-eigen
!./k-means-eigen 100k.csv 5 300 5
苦労の割に、かなり期待はずれの結果に終わった。
K-Means benchmark(CUDA C編)¶
%download https://raw.githubusercontent.com/goldsborough/k-means/master/cuda/k-means-simple-sm.cu
!nvcc -O2 -std=c++11 k-means-simple-sm.cu -o gpu
!./gpu 100k.csv 5 300 5
0.205814/0.0591697
CUDA版は実行速度がC++版の3.5倍高速だった。
CUDA/C バージョン2¶
%download https://raw.githubusercontent.com/goldsborough/k-means/master/cuda/k-means-fast.cu
!nvcc -O3 -std=c++11 k-means-fast.cu -o k-means-fast
!./k-means-fast 100k.csv 5 300 5
0.0591697/0.0358488
バージョン2はバージョン1よりも約1.7倍処理が高速だった。