-
-
Save r9y9/3d0c6a90dd155801c4c1 to your computer and use it in GitHub Desktop.
push!(LOAD_PATH, ".") | |
using BNMF | |
using PyCall | |
# bp_nmf のコードと比較するために、librosaを使う | |
@pyimport librosa | |
function spectrogram() | |
x, ss = librosa.load("test.wav", sr=16000) | |
X = abs(librosa.stft(x, n_fft=1024, hop_length=256)) | |
return X | |
end | |
function test_gap(X) | |
srand(98765) | |
p = GaPNMF(X, K=100) | |
fit!(p, epochs=100, verbose=true) | |
nothing | |
end | |
function benchmark(N) | |
X = spectrogram() | |
elapsed = Array(Float64, N) | |
for i=1:N | |
tic() | |
test_gap(X) | |
elapsed[i] = toc() | |
end | |
println("Mean elapsed time: $(mean(elapsed))") | |
end | |
benchmark(10) | |
versioninfo() |
# -*- coding: utf-8 -*- | |
import gap_nmf | |
import librosa | |
import numpy as np | |
import scipy | |
import time | |
def spectrogram(): | |
x, _ = librosa.load('test.wav', sr=16000) | |
X = np.abs(librosa.stft(x, n_fft=1024, hop_length=256)) | |
return X | |
def test_gap(X): | |
obj = gap_nmf.GaP_NMF(X, K=100, seed=98765) | |
score = -np.inf | |
for i in range(100): | |
obj.update() | |
# obj.figures() | |
lastscore = score | |
score = obj.bound() | |
improvement = (score - lastscore) / np.abs(lastscore) | |
print('iteration {}: bound = {:.2f} ({:.5f} improvement)'.format( | |
i, score, improvement)) | |
def benchmark(N=100): | |
X = spectrogram() | |
elapsed = [] | |
for n in range(N): | |
s = time.clock() | |
test_gap(X) | |
e = time.clock() - s | |
elapsed.append(e) | |
print(e) | |
print("Mean elapsed time:", np.mean(elapsed)) | |
benchmark(10) | |
np.show_config() | |
scipy.show_config() | |
librosa.show_versions() |
2014/08/20
手元のmacbook airで計算した結果
Julia: Mean elapsed time: 21.92968243
Python: Mean elapsed time: 18.3550617
Juliaの方が1.2倍くらい遅い結果になった
In [1]: import scipy
s
In [2]: scipy.__version__
Out[2]: '0.14.0'
In [3]: import numpy
In [4]: numpy.__version__
Out[4]: '1.8.2'
一応めもっておく。あんま意味ないかもだけど…
Devectorize.jl とか NumericExtentions.jl とか、@inbounds とかソートアルゴリズム変えるとか、その他もろもろ試したけど速くならなくてつらい
バージョン情報まとめ:
Juliaはちょうど最近0.3.0が出たので、0.3.0にしました
Mac OS X 10.9.4
Julia Version 0.3.0
Commit 7681878* (2014-08-20 20:43 UTC)
Platform Info:
System: Darwin (x86_64-apple-darwin13.3.0)
CPU: Intel(R) Core(TM) i7-2677M CPU @ 1.80GHz
WORD_SIZE: 64
BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Sandybridge)
LAPACK: libopenblas
LIBM: libopenlibm
LLVM: libLLVM-3.3
Ubuntu 14.04 LTS
Julia Version 0.3.0
Commit 7681878 (2014-08-20 20:43 UTC)
Platform Info:
System: Linux (x86_64-linux-gnu)
CPU: Intel(R) Core(TM)2 Duo CPU E7400 @ 2.80GHz
WORD_SIZE: 64
BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Penryn)
LAPACK: libopenblas
LIBM: libopenlibm
LLVM: libLLVM-3.3
ubuntu で実行した結果
Julia: Mean elapsed time: 27.035485086199998 [sec]
Python: Mean elapsed time: 38.5021166 [sec]
juliaのほうが1.2倍速かった
はい、lapackがubuntuには入っていませんでした。lapackを入れてからnumpy, scipyをインストールし直した結果:
Python Mean elapsed time: 21.8907655
38.5 sec. -> 21.9 sec. (約1.75倍の高速化)
lapackつよい
まとめ
- Juliaも結構速いけど、numpy, scipyはやはりつよい
Mac OS X
Julia: Mean elapsed time: 21.92968243
Python: Mean elapsed time: 18.3550617
Ubuntu 14.04
Julia: Mean elapsed time: 27.035485086199998
Python: Mean elapsed time: 21.8907655
TODO
- Ubuntuのjuliaが遅い理由を調べる。fortranかgcc/g++によるものかなぁと踏んでる
- Juliaのコンパイルオプションをいじって検証
今の自分ならjuliaのコードをめっちゃ速くできる自信があるけど、(続く
Ubuntu 16.04
Julia
Mean elapsed time: 14.6447493191
Julia Version 0.7.0-DEV.565
Commit d3db312* (2017-06-13 07:52 UTC)
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz
WORD_SIZE: 64
BLAS: libopenblas (NO_LAPACKE DYNAMIC_ARCH NO_AFFINITY Prescott)
LAPACK: liblapack
LIBM: libopenlibm
LLVM: libLLVM-4.0.0 (ORCJIT, skylake)
Python
Mean elapsed time: 33.2673037
blas_mkl_info:
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ryuichi/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/ryuichi/anaconda3/include']
blas_opt_info:
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ryuichi/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/ryuichi/anaconda3/include']
lapack_mkl_info:
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ryuichi/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/ryuichi/anaconda3/include']
lapack_opt_info:
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ryuichi/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/ryuichi/anaconda3/include']
lapack_mkl_info:
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ryuichi/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/ryuichi/anaconda3/include']
lapack_opt_info:
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ryuichi/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/ryuichi/anaconda3/include']
blas_mkl_info:
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ryuichi/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/ryuichi/anaconda3/include']
blas_opt_info:
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ryuichi/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/ryuichi/anaconda3/include']
INSTALLED VERSIONS
------------------
python: 3.6.0 |Anaconda custom (64-bit)| (default, Dec 23 2016, 12:22:00)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
librosa: 0.5.1
audioread: installed, no version number available
numpy: 1.12.1
scipy: 0.19.0
sklearn: 0.18.1
joblib: 0.11
decorator: 4.0.11
six: 1.10.0
resampy: 0.1.5
numpydoc: installed, no version number available
sphinx: 1.5.1
sphinx_rtd_theme: 0.2.4
sphinxcontrib.versioning: 2.2.1
matplotlib: 2.0.0
numba: 0.32.0
Julia 実装: https://github.com/r9y9/BNMF.jl
Python実装: https://github.com/dawenl/bp_nmf/tree/master/code/gap_nmf