カテゴリー「Python」の103件の記事

2017年7月16日 (日)

Juliaやってみよう。四日目。@timeでプロファイリング

今日は、昨日のIzhikevichモデルのコードの簡単なプロファイリングしてみる。Pythonに翻訳した時とどっちが速いのかというのが知りたい。結果次第ではjuliaは使わないかもしれない。ちょっと古い記事だけど、ある程度アレイが大きくなるとNumpyの方が速いというベンチマークもあるので、自分が使うような用途で確認してみたい。

@time

公式ドキュメンテーションのパフォーマンスのコツによると、基本的には@timeというマクロがあるので、それを使うと良いようだけど、グローバルのスコープで実行するとオーバーヘッドがあって遅くなる(からのForループでも100マイクロ秒くらい)ので、測りたい部分をfunctionにして測るのがよいらしい。

昨日のコードをfunctionの中にいれてやって、

function test()

    Ne = 800; Ni = 200;
    re = rand(Ne, 1); ri = rand(Ni, 1);
    a = [0.02 * ones(Ne, 1); 0.02 * ones(Ni, 1)]
    b = [0.2 * ones(Ne, 1);  0.25-0.05*ri]
    c = [-65 + 15 * re .^ 2; -65*ones(Ni, 1)]
    d = [8-6*re .^ 2; 2*ones(Ni,1)]
    S = hcat(0.5 * rand(Ne+Ni,Ne),  -rand(Ne+Ni,Ni));

    v=-65*ones(Ne+Ni,1);    # Initial values of v
    u=b.*v;                 # Initial values of u
    firings=[];             # spike timings

    for t=1:1000            # simulation of 1000 ms
        I=[5*randn(Ne,1);2*randn(Ni,1)]; # thalamic input
        fired=find(v.>= 30);    # indices of spikes
        firings=[firings; hcat(t+0*fired, fired)];
        v[fired]=c[fired];
        u[fired]=u[fired]+d[fired];
        I=I+sum(S[:,fired], 2);
        v=v+0.5*(0.04*v.^2+5*v+140-u+I); # step 0.5 ms
        v=v+0.5*(0.04*v.^2+5*v+140-u+I); # for numerical
        u=u+a.*(b.*v-u);                 # stability
    end

end

あとは

@time test()

としてやる。

うちのPCでは

0.785356 seconds (326.64 k allocations: 365.923 MiB, 24.83% gc time)

という感じでした。

numpyバージョンを作らねば。

2017年7月15日 (土)

Juliaやってみよう。三日目。MATLABコードを翻訳してみる。

まあ、多少慣れてきたのでMATLABのコードを翻訳してみる。

お題は、Izhikevichモデルの有名な1000個のニューロンのシミュレーションするモデル。短いし、まあ、こーゆーことをやるための言語だし。

MATLABのオリジナルはこちら。

% Created by Eugene M. Izhikevich, February 25, 2003
% Excitatory neurons    Inhibitory neurons
Ne=800;                 Ni=200;
re=rand(Ne,1);          ri=rand(Ni,1);
a=[0.02*ones(Ne,1);     0.02+0.08*ri];
b=[0.2*ones(Ne,1);      0.25-0.05*ri];
c=[-65+15*re.^2;        -65*ones(Ni,1)];
d=[8-6*re.^2;           2*ones(Ni,1)];
S=[0.5*rand(Ne+Ni,Ne),  -rand(Ne+Ni,Ni)];

v=-65*ones(Ne+Ni,1);    % Initial values of v
u=b.*v;                 % Initial values of u
firings=[];             % spike timings

for t=1:1000            % simulation of 1000 ms
  I=[5*randn(Ne,1);2*randn(Ni,1)]; % thalamic input
  fired=find(v>=30);    % indices of spikes
  firings=[firings; t+0*fired,fired];
  v(fired)=c(fired);
  u(fired)=u(fired)+d(fired);
  I=I+sum(S(:,fired),2);
  v=v+0.5*(0.04*v.^2+5*v+140-u+I); % step 0.5 ms
  v=v+0.5*(0.04*v.^2+5*v+140-u+I); % for numerical
  u=u+a.*(b.*v-u);                 % stability
end;
plot(firings(:,1),firings(:,2),'.');

一晩格闘した結果、小生なりのJuliaへの翻訳がこちら。 オリジナルにはないVmを追加している。

using PyPlot

Ne = 800; Ni = 200;
re = rand(Ne, 1); ri = rand(Ni, 1);
a = [0.02 * ones(Ne, 1); 0.02 * ones(Ni, 1)]
b = [0.2 * ones(Ne, 1);  0.25-0.05*ri]
c = [-65 + 15 * re .^ 2; -65*ones(Ni, 1)]
d = [8-6*re .^ 2; 2*ones(Ni,1)]
S = hcat(0.5 * rand(Ne+Ni,Ne),  -rand(Ne+Ni,Ni));

v=-65*ones(Ne+Ni,1);    # Initial values of v
u=b.*v;                 # Initial values of u
firings=[];             # spike timings

Vm = [];                # added

for t=1:1000            # simulation of 1000 ms
  I=[5*randn(Ne,1);2*randn(Ni,1)]; # thalamic input
  fired=find(v.>= 30);    # indices of spikes
  firings=[firings; hcat(t+0*fired, fired)];
  v[fired]=c[fired];
  u[fired]=u[fired]+d[fired];
  I=I+sum(S[:,fired], 2);
  v=v+0.5*(0.04*v.^2+5*v+140-u+I); # step 0.5 ms
  v=v+0.5*(0.04*v.^2+5*v+140-u+I); # for numerical
  u=u+a.*(b.*v-u);                 # stability
  Vm = [Vm; v'];
end;

scatter(firings[:,1], firings[:,2], s=1);

いやー、なんかほとんどおんなじだ。JuliaはMATLABと同じでインデックスが1から始まるし、MATLABキラーだな。forループがendで終わってPythonよりMATLAB感がつよい。

PythonでNumpy使い始めたら、MATLABはv(2:5)とかベクターをスライスするときも括弧使うのが、ちょっと変な仕様だと気づいたけど、JuliaもNumpyのようにv[2:5]とスクエアブラケットでのインデックシングでしっくり来る。納得の変更・改善ばかり。後出しジャンケンは強い。

import numpyってしてないのに、素のJuliaでrandとか、onesとか使えるのがすごい。こういうアレイとかも実装はjuliaでJITまでついてくるんだからすごいな。pypyプロジェクトがnumpypyのRPythonでの実装に数年かかっているのをみると、juliaのアプローチの優秀さが分かる。numpypyは99%実装できたみたいだけど、まだ遅いので使い道ない・・。 numpyでいうvstackとかhstackはvcat, hcatらしい。

GRではscatterがよくわからなかったのでPyPlotでプロットした出力がこちら。

Izhikevich_plot

上のコードではVmはプロットしてないけど、するならこんな感じ。。

plot(Vm[:,32])
ylim([-90,100]);

ylimとかnumpyそのまま。

2017年7月13日 (木)

Juliaやってみよう。二日目。Juliaのアップデート、IJulia

さて、昨日に引続き、今日もちょこちょこやっていきます。

今日は、Juliaをv0.5からv0.6にアップデートして、それからJupyter notebookのJulia用であるIJuliaで遊んでみます。

Juliaをアップデート

ウィンドウズなので、Ubuntuのようにapt-getする訳にはいきません。

sudo apt-get dist-upgrade julia

スタートボタンからJuliaを見に行くとUninstallerがありました。たぶん旧バージョンを残したまま、新しいのをインストールすることもできるっぽいですが、べつにまだ始めたばかりで旧バージョンでしか動かないようなコードもないので、今回はまっさらにアンインストールして、最新版をインストールでいいか。

C:\Users\ユーザー名\AppData\Local\Julia-0.6.0

インストール先にバージョン名が入っているので、旧バージョンと混在できるのでしょう。あとはウィンドウズのPATHの設定で切り替えるのだと想像。Pythonもそんな感じ。Condaならコマンドで切り替え。

IJuliaのインストール

公式サイトにあったIJuliaのチートシートをみながら使ってみる。

using IJulia

するとPkg.add("IJulia")しろと怒られる。Pkg.status()してみると、パッケージなにもはいっていない。昨日のv0.5は多分以前ちょっとだけIJuliaを起動してみた残骸だったと思い当たる・・。

おとなしく

Pkg.add("IJulia")

してみる。依存性とか勝手に入ると想像した通り、色々とインストールされた。

JupyterがPythonに依存するあたりで、condaがJupyterを最新版に保っていたりとしている感じに見える。結構かかった。

あとは昨日のplotライブラリのGRも追加してみる。

Pkg.add("GR")

うむ。問題なく終了。

IJuliaの起動

using IJulia

したいところだけど、Jupyterって起動したときのcmdのパスから起動するので、まずは適当なパスにcdしたい。

公式サイトのドキュメンテーションみるとFile Systemの項目にcdというコマンドがある。

cd("C:\\projects\\julia\\test1")

なんて感じで大丈夫だった。バックスラッシュは二重にしてエスケープするかフォーワードスラッシュにしないとだめ。あと、cdの後にスペースいれて

cd ( "path" )

なんてやるとエラー。なるほど。あとダブルクォーテーションじゃないと怒られる。PythonならシングルでもOKだし、括弧の前にスペースあっても大丈夫だと思う。この辺のルールは厳密な方が、みんなの書くコードが統一されて読みやすくなっていいと思う。Pythonで多くの人々がこの恩恵を思い知ったのでJuliaにも引き継がれているのかな。

pwd()

とすると現在のワーキングディレクトリが表示される。

using IJulia

してから、

IJulia.notebook()

もしくは単に

notebook()

でJupyter notebookのJulia用、IJuliaが起動。

おお、homedir()で出てくるC:\Users\ユーザー名で起動したぞ。

Pythonだと起動した時のパスでJupyter立ち上がった気がするが、IPython notebookのときの記憶だし、最近は違うのだろうか。

IJuliaのnotebookサーバーの終了の仕方もよくわからない。PythonならcmdにCtrl+C送ればよかったが、juliaのコンソールだとだめっぽい。しょうが無いのでコンソールごと終了。

notebookコマンドにパスを渡して起動してみたい。プロンプトにはてなマークを入力するとプロンプトが

julia>

から

help?>

に切り替わって、そこでnotebookとするとドキュメンテーションがでてきた。なるほどdir=で指定するのね。

Notebook_help

ちなみにエクスプローラーのアドレスをマウスでドラッグして、Juliaのコンソールに落とすとドロップされる。

スタートメニューに追加されているJupyter notebookのショートカットからだとCtrl+C効くけどJuliaのコンソールは相変わらず受付ない。でもHelpにコンソールを終了すれば良いとも書いてあるので、まいっか。

さて、JupyterのHomeの右上にあるnewボタンからJulia v0.6を選択して、ノートブックを作成。Untitledをクリックしてタイトル変更。

Ijulia_gr

適当にプロットしてみた。inlineやんないとプロットが別ウィンドウに出てきた。セミコロンで出力抑制とかPythonだな。つーか、よく考えるとlinspaceを0から始めて100要素なら99で終わるべきだった・・・。

要素ごとの階乗でスペースしてドットしてハットするのは数学っぽくっていいね。numpyだと x ** 2 とやるので、xがベクターだと知らないとスカラーに見えてしまう。

まあなんとなくわかってきたぞ。今日はここまで。

2017年7月12日 (水)

Juliaやってみよう。一日目。GRでプロット。

色々と気になっていたJuliaで遊んでみようのコーナーを思いつきで始めます。

普段はウィンドウズでPython使っているのでウィンドウズ、Pythonユーザー向けに書きます。

まずはなんかPlotしてみたいかな。

まずはJuliaのインストール

右も左も分からないので、まあOfficialからバイナリもってきて遊んでみよう。

https://julialang.org/downloads/

から最新版のウィンドウズ用exeインストーラーを落とせばよいのでしょう。今時は普通は64ビットですね。 執筆時点ではもう0.6リリースなってますね。私は手元に0.5があったので、今日はそのまま使います。

ライブラリのインストール

さて、JuliaにもPlotライブラリが色々とあるようです。どれにしようかな。

plot.lyのJulia版もあるようですが、JSON書くのいやなので、パス。

公式サイトのhttps://julialang.org/downloads/plotting.html

では、PyPlotというそのままな名前のライブラリでmatplotlibをJuliaから呼び出しちゃうという恐ろしいものがあった。うーむ、JupyterがIPython Notebookの時代にそんなデモをみたような。これはPythonを呼びに行っているのでPythonも必須。

せっかくなのでJuliaネイティブなライブラリを試したいので全部C/C+で書いてあるというGRというPlotライブラリを試すことにした。これPythonはもちろん、PyPyでも使えるらしいうえに、matplotlibのバックエンドとしてもつかえて30倍くらい線の描画が速いらしい。すごい。。。

JuliaにはPkgという多分標準ライブラリだと思うけど、パッケージマネージャーがあって、登録されているライブラリはPkg.add()で簡単に導入できるらしい。すごい。PythonもCondaで似たようなことができるけど、Juliaの方が進んでいる。

まずはPkg.status()で、導入されているライブラリを表示してみる。

Juliapkgstatus

ふむ。

それでは、Pkg.add("GR")でGRを導入。

Juliapkgadd

INFO: METADATA is out-of-date — you may not have the latest version of GR INFO: Use `Pkg.update()` to get the latest versions of your packages

へ?METADATAが古い?なんの?Pkg.update()すればいいの?

Juliapkgupdate

おお、PackageマネージャーのMETADATAが古いのですな。最新のGRは0.22.0になっているようです。

なんか裏で色々とcondaが暗躍している模様だが、Pkgの実装はピュアJuliaではないのだろうか。なぞ。

さて、Pkg.installed()としてみると、Pkg.update()がすでに全部アップデートしたようで、GRもバージョンが0.22.0になっている。楽じゃ!condaみたい。

GRで初めてのプロット

Pythonでいうimport分はusingらしいが、importというのもある。違いは調べてもよくわからないが、まあ追々でいいか。GRの公式サイトでもusingだったりimportだったりで、まあどっちでもいいようだ。

あとはPythonのようにplot([0,1,4],[3,2,5])のようにするだけでいいのだそうです。

using GR
plot([0,1,4],[3,2,5])

えい。

でた。

これって、plotはGR.plotと同じだと思うのでusingでもってくるとネームスペースのトップにエイリアスがくるっぽい。

タイトルを追加してみる。今度はGRから始まるネームスペースでやってみる。

GR.title("Yattsuke blog playing with Julia")

シーン・・・。何も起きない。PyPlotならshow()とかdraw()の場面だが、show()だとプロットが死んだ。drawはない。

GRの公式サイトの例だと

GR.updatews()

が正解っぽいが、何も起きない。さて・・・。

plotもう一回すると更新されるが、ドキュメンテーションみてもやっぱりupdatewsで正解っぽいなあ。。

うむ。まあ今回はこの程度で、つぎはIJulia使ってみるメウ。

Juliagrplot

2016年10月 4日 (火)

SAS University EditionでJupyter Notebookしてみる。

昔は大学の研究室でも大金をはたかないと使えなかったSASが、今はSAS University Editionがあって、個人用なら基本部分はタダで使える時代になりました。RとかPythonとかがあるので、時代の流れですね。基本部分しかないのでオラクルとかのdbを直接アクセスとかはできませんが、データがcsvに変換できるならなんでも取ってこれるので、まあ結構使えます。

オフィシャルのアナウンスによると、SAS University Editionは2016年の7月以降のバージョンからはJupyter notebookがついてくるらしいですね。

普通は http://localhost:10080 としてSAS Studioに行きますが、jupyterのサーバーがポート8888を使っているので http://localhost:8888 でアクセスできるはずなんですが、ウィンドウズのVirtualBox上でSAS University Editionのサーバーを走らせるとなんかダメだった。

VirtualBoxのNATのネットワークドライバーのSettingを確認してみるとポートフォワーディングにHTTPとHTTPSしかないのが原因っぽいので追加してみる。

Sasunivnat

Sasportforwarding

一応自分でJupyterのサーバーを使ってPythonでなんかする可能性を考えると18888を8888へ送った方が良いかなと思ったのでそうしてみた。

Sasonjupyter

動いた!

別に特別なことはせずとも、SAS University Editionのサーバーが走っていればJupyterのサーバーもすでに走っているようだ。でもつかってみるとSASってログが冗長だしJupyterにはあんまり向いていない気がする。optionsでログ簡潔にすればいいのかな。

options nosource nonotes;

2016年7月14日 (木)

CaffeをWindows 7でcuDNN付きでビルド。

しばらくTheano/Lasagneでディープラーニングをしてましたが、Caffeのモデル動物園からImageNetのデータで学習済のモデルをLasagneに読み込んで動かしてみたらどうもCaffeよりかなり遅いっぽいので、Caffeを試してみようとおもったんですが、CaffeのPythonモジュールはVS2013で自分でC/C++ソースからビルドしないといけないのですね。これがもうめっちゃ大変でしたが、なんとか丸2日ほど格闘してできたので覚書。ビルドできたPythonモジュールは229MBあり巨大。公式にサポートされているUbuntuでも試したんだけどなぜかmakeできなかったのにウィンドウズでできた不思議。

速度の問題は、たぶん私のTheano/Lasagneの環境になにか問題があるだけで、この論文によるとCaffeとTheanoの速度はあまり違いがないはずなんですが、何が問題なのか未だにわかりません。それにしてもTensorFlowは家庭用PCでGPU一基だとまだCaffe・Theanoよりも遅いですね。

目安として「GPUでCUDAが使えるとCPUの大体10倍速い。CUDAにあわせてcuDNNが使えるとさらに10倍速い。」と言われますが、私の環境ではCaffeはCPUでもGPUでもTheanoの10倍くらい速いのでCUDA周りだけではなく、BLASとかも関係してそう。ふーむ。Theanoは汎用性高く、Caffeはコンピューターヴィジョンに割りと特化しているんで、ImageNetのモデルだとCaffeが有利?それにしても差が大きすぎ。

まあなんにせよ(私の環境では)Caffeは速い!素晴らしいです。CPUでもForwardパスだけなら使えそうな速度が出て満足。GPUでガンガントレーニング回して、デプロイメントはCPUでも行けるという感じ。

私は試してませんが、このブログCUDA付きでビルドしたWindows 7のCaffeがおいてありました。どうしてもビルドできない場合、試して見るんもありかもしれませんが、大丈夫ですかね。

ビルド方法

Caffeは公式にはLinuxしかサポートされていないので、ユーザーがボランティアで移植している状態だったようですが、マイクソソフトが最近CaffeをWindowsに移植しました。これが一番新しく安定してて、ビルドも簡単です。

ビルド方法はhttps://github.com/BVLC/caffe/tree/windowsのReadmeにある方法でだいたいそのままでオッケーです。

まず、マイクソソフトがメンテナンスしているブランチを取ってきます。gitでcloneしてwindowsブランチをcheckoutするか、単にzipをダウンロードするかします。zipの方が簡単。

このマイクソソフト版CaffeはVS2013に同梱されているNuGetというパッケージマネージメントツールをつかって勝手にOpenCVとかBoostとか必要なものを揃えてくれるのでビルドが楽ちんなんですが、それでもいろいろと落とし穴(下記参照)があってC/C++のコンパイルに慣れていない私の場合かなり苦労しました。

あとの手順は

CommonSettings.propsを変更。

CUDA Toolkit 7.5をインストール

cuDNN v4をインストール GPUが対応しているか確認。cuDNNありなしでは10倍くらい速度が違うらしいので最低でもCUDA Compute Capabilityが3.0くらいないと厳しい。今買うならGTX 1070ですかね。Compute Capability 6.2のはず。

玄人志向 ビデオカードGEFORCE GTX 1070搭載 コストダウンモデル GF-GTX1070-E8GB/BLF

Pythonは書いている通りMinicondaを使う。私の場合はMiniconda2ではなくMiniconda3だったので

conda create -n caffe python=2.7 numpy scipy matplotlib scikit-image pip
pip install protobuf

で作りました。

あとはVisual Studio 2013のコミュニティエディションをインストールして、caffe\windowsフォルダにあるソリューションファイルCaffe.slnを開いて、ビルドします。

Caffe_exe

ビルドしたcaffe.exeを起動して、メッセージが出るのを確認。

最後に

caffe\Build\x64\Release\pycaffeのcaffeフォルダをsite-packagesにコピー。

Anacondaのenvからimport caffeができたら終了。

注意点

落とし穴①

Python2.7でも3.5でもCUDA toolkitは7.5をインストールする。Theanoの公式サイトのインストールガイドにはPython2.7はVS2008が必要な関係でCUDAは5.5までしか使えないと書いている。しかし、実際は7.5あっさり使えた。AnacondaのPythonだから?GPUが新し目だとCUDA toolkit 5.5ではサポートないのではまった。

落とし穴②

CUDA関係のヘッダーファイルにUnicode文字があり、これが原因でビルドエラーになる。

対処法は、コンパネの「地域と言語」の設定からNon-Unicodeアプリの言語設定でEnglishを選択する。私はJapaneseにしていたのでこれが原因でエラーになりました。

落とし穴③

CommonSettings.propsをぬかりなく変更する。

7行目  CpuOnlyBuild を fasle か true に設定する。

8行目  UseCuDNN を fasle か true に設定する。 もちろんCpuOnlyBuildがtrueならfalseでないといけない。

9行目  CudaVersion は普通は7.5のままでいいでしょう。

13行目 PythonSupport はもちろん true にする。

21行目 CudaArchitectureはCUDA Compute Capability tableにあるCompute Capabilityの値にする。例えばGeForce GTX 960だと5.0なのでcompute_50,sm_50にして、それ以外を削除するとビルドがちょっと速くなる。初期値にcompute_35,sm_35;compute_52,sm_52とあるが3.0まで落としてもビルドできた。やっぱ3.5以上でないとダメみたい。2.1だとnvccがなぜか怒る。Theanoは2.1でも使えるのでなぜだろう?

公式サイトだと、3.0以上のGPUをLinux上でしかテストしてないので、それ以外の環境では使えるかわからないけどたぶんうごくんじゃない?みたいに書いている。Linuxなら古いGPUも行けるのかも。ウィンドウズではおそらく3.5以上が必須っぽい。

CUDA compute capability: devices with compute capability <= 2.0 may have to reduce CUDA thread numbers and batch sizes due to hardware constraints. Brew with caution; we recommend compute capability >= 3.0.

24行目 CuDnnPathは私の場合空のままで、cuDNNのcudnn64_4.dllやcudnn.lib、cudnn.hファイルはC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5以下の対応するフォルダにコピーした。

48行目 PythonDirをちゃんと設定する。初期値はC:\Miniconda2\になっているけど、私の場合Anacondaの64ビットの2.7のenvをつくったのでそのフォルダ(C:\Miniconda3\envs\caffe)を指定した。

落とし穴④

Visual Studioでビルドする前に色々と設定を確認する。

VS2013の使い方が全然判らないので、このブログのBefore compileとCompileの項目をかなり参考にしました。

とくに「ビルド」メニューのコンフィグレーションマネージャーからすべてのプロジェクトをReleaseとx64にするのを忘れないこと。

ソリューションエクスプローラーからcaffeなどのプロジェクトを右クリックして、プロパティをみて、コンフィグレーションプロパティの一般(General)にあるConfiguration typeをApplication (.exe)にするのを忘れない。

ビルド失敗したらCleanしてからビルドし直す。

などなど。いろいろもう忘れたけど確認することがあります。でかいのでまずはlibcaffeをビルドするのが吉かもしれません。一つを除いてぜんぶlibcaffeに依存しているのでlibcaffeがビルドできないと始まりませんし、これがビルドできれば残りはすんなり行くと思います。

2016年3月 5日 (土)

Theano用にCUDAができるお手ごろGPUを物色中。GTX-960が良さげ

追記。 NVIDIAの最新機種GTX-1080が発表になりましたね。だいぶ安くなったようですが、当方にはまだ高いです・・。でも性能と価格の兼ね合いは最高によさそう。

本当にGPUは必要なのか?

Theanoを使ってCPUのみでディープラーニングって現実的なのだろうか?というのは常々素朴な疑問だったけど、前記事にあるDaniel Nouri氏による有名なLasagne/nolearn/Theanoをつかった深層畳み込みニューラルネットワークのチュートリアルを実際にやってみたら現実的には必須と判明した。6000円くらいの中古GPUでも10-20倍はやいので買うべし。

私の環境(CORE i7-2600とGeForce 550Ti)では、コンボリューションのない、一層の潜れ層しかない単純なネット(チュートリアルのnet1)だと、CPUでも1エポックに0.3-0.4秒なので1000エポックしても400秒程度。十分待てる。GPUはさらに10倍くらい速いけども。でも単純なコンボリューションのないパーセプトロンネットワークでは精度悪くて使いものにならない。

そこでちょっと発展させて、2層のコンボリューション層のあるnet2にいくと1エポックがCPUで116秒になった。1000エポックくらいトレーニングすると20時間くらいかかる。これがGPUだと1エポックが6.4秒くらいになって2時間以内。チュートリアルのノーリさんのもっているGPU(おそらくGeForce GTX TITAN とか)だと20分で終了するそうな。

パラメータチューニング一回に2時間もかかるとなると、すでに大変なのに20時間だと一日一回しかできない。扱っている画像も96x96の小さなものですでにこんなの。

お買い得なGPUは?

じゃあ、CUDA用にいいGPUを買うとするとなにがよいのか?となるんだけど、前にツイートしたようにGTX 980もしくはGTX 980 Tiというのがハイエンド機の中でコスパがよいらしい。

それでもGTX-980はアメリカのebayで5万くらいか。高い。まあTitanの15万にくらべれば・・・。

日本のアマゾンではGTX-980(上)は6万ちょっと超えるくらいか。PCでゲームもする人ならついでにいいかもしれないけど、私の場合、嫁に怒られるだけ。。でも機械学習に本気の人にはこれが良さそうです。CUDA Capability 5.2とは現状最高バージョンがTitanの5.3なのですごい。

GTX680(CUDA Capability 3.0)の3GBモデルというのも予算がきつい人用にオススメされているが、アマゾンでは見当たらず。その代わり2GBのモデルがあった(下)。

それでも中古で3.7万かぁ。。

私の古いGeForce 550TiでもないよりマシというかCPUに比べると段違い。550Tiは米ebayで即決価格が60ドルというのを見たので、CUDA対応のGPUがない人は550-TiのようなCUDA Capabilityが2.1以上の古くて安いGPUを買うのが吉。

GTX-550-Tiの中古が日本のアマゾンで6000円代(上)というのを見つけた。とりあえずという人はこのクラスで十分と思います。

メモリに関しては上のツイートで紹介した記事によると、ニューロンの重み付けの更新に勾配を計算するときにGPUではフーリエ変換を使う場合が多くて、これがメモリを食うらしいので、ディープラーニングするには割りとメモリがいるらしい。とはいえ、6GBくらいあれば十分で、4GBでもまあ大抵の問題はメモリに収まるといっているので、4GBくらいが初心者にはいいかもしれないし、余裕があれば6GBにしておきたいところ。

あとはcuDNNというCUDAを使ったディープラーニング用のライブラリがあって、最近のバージョンでは畳み込みの計算がとても速くなる変更があったらしいが、あまり古いGPU(たとえばGTX 580)だと対象外になるので、注意。たぶんcompute capabilityが3.5以上ないとそもそもcuDNNを有効にできないという可能性が高い。 TheanoはcuDNN3をサポート。Theano公式ドキュメンテーションにはLinuxのみインストール方法がかいてある。ウィンドウズは・・。

ちなみに私のTheanoはcuDNNなしで使っているが、それでもGeForce 550TiはCPUより10-20倍速いです。

まとめるとCUDA compute capabilityが3.5以上でメモリが4-6GBのGPUが狙い目か。GTX-780とか780TiがCUDA compute capability 3.5以上の一番安いモデルだが、メモリが3GBという制限があるためか、上のレビューではまったく触れられていない。

ベンチマークみるとGTX-980 Tiが圧倒的だし、6 GBにできてCUDA compute capability 5.2は長く戦力になりそうで魅力。。でも5-6万はたかい・・。

そこでみつけた掘り出し物がこのGTX-960。

レビュー中にもちらっと触れられているが、このGTX-960はディープラーニング向きのGPUらしく、上であげたぎりぎりのラインをクリアしていて、CUDA compute capability 5.2で4 GBで新品が2.8万円程度。上の中古GTX-680の2GB版よりも新しいモデルなのに安いじゃないか。うむ。これなら手がだせそう!

2016年2月27日 (土)

ウィンドウズでLasagne/nolearn/Theanoで深層畳み込みニューラルネットワークしてみる

Lasagneの開発コアメンバーでもあり、nolearnという機械学習のPythonライブラリを作ったDaniel Nouri氏による有名なLasagne/nolearn/Theanoをつかった深層畳み込みニューラルネットワークのチュートリアルをやってみているが、インストールに苦労したので覚書。(ところで発音はダニエル・ノーリでいいのかな。モロッコ系の名前らしいが。ツイートはドイツ語と英語でくるのでドイツ人なのかな。)

Lasagne/nolearn/Theanoと、これらのライブラリの関係がややこしいが、Theanoは多次元配列の計算をMathematicaみたいにシンボリックな表記で記述して、それをCPUやGPUをつかって計算するCコードを生成するライブラリでニューロンの学習に必要な勾配の計算に特化している、LasagneはTheanoをつかってニューラルネットワークをやる時のライブラリ。nolearnはTheanoやLasagneなどをつかって深層畳み込みニューラルネットワーク学習ができるライブラリで、特にLasagneをよくサポートしている。Theanoだけでも深層畳み込みニューラルネットワーク学習はもちろんできるが、その場合数式をちゃんと書かないといけないと思うので、Lasagneを使うと楽。Lasagneはラザニアの複数形らしい。

一般的な機械学習用のScikit-learnとくらべるとTheanoはおもにニューラルネットに特化しているので、ちょっと別用途というかAPIも違って混じらない感じなのだけど、nolearn経由でLasagneを使うとScikit-learnのような感じでディープラーニングできるということらしい。

さて、最初はLinux Mint 17でチュートリアルどおりにCUDA tooklitいれてTheano/Lasagneのインストール進めて全く問題なくできたのでリナックス最高!とおもったが、(無謀にも)同じことをウィンドウズでやってみるとまずTheanoのインストールが大変だったのと、Lasagneとnolearnもバージョンも新しくないと行けないのでやっぱりハマった。あとで考えるとLinuxではチュートリアルどおりPython27で最新のCUDA toolkitいれて、Theanoはリリースの0.7でLasagneはチュートリアルのrequirement.txtにあるバージョンで、nolearnはLasagneの依存性として勝手に入ったので簡単だったが、ウィンドウズではPython27では最新のCUDA toolkitが使えない関係でPython 3.5にしたのが困難の始まりだった。

参考: ウィンドウズでCUDA付きでTheanoインストール!Python3.5でもできた。

結論から行くと

チュートリアルのコードが動いたライブラリのバージョンの組み合わせは

PythonはAnacondaのPython 3.5.1 |Continuum Analytics, Inc.| (default, Jan 29 2016, 15:01:46) [MSC v.1900 64 bit (AMD64)]上で

Theano==0.8.git

Lasagne==0.2.git

nolearn==0.6a0.dev0

だった。

インストールはふつうにTheanoをpip installすると現在は0.7のリリース版になり、Lasagneとnolearnもちょっと古いのを入れるとLasagneのインポート中にnolearnがmseというサブモジュールをインポートしようとしてエラーになる。

これはnolearnのバージョンが低いのが原因なので、最新のnolearnのインストール方法に従って新しいnolearnを入れようとするとまず、

pip install -r https://raw.githubusercontent.com/dnouri/nolearn/master/requirements.txt

で依存性パッケージいれてから、

pip install git+https://github.com/dnouri/nolearn.git@master#egg=nolearn==0.7.git

をしろとある。Linuxならこれでうまくいくのかもしれないが、ウィンドウズだと依存性パッケージのインストール中にすでに入っているscipyをビルドしようとしてエラー。

なので、requirements.txtの内容を確認して、手動でconda installしまくって依存性パッケージを入れる。condaにないLasagneは

pip install https://github.com/Lasagne/Lasagne/archive/master.zip

とすると0.2.dev1がはいる。

Theanoはgitで普通にcloneした最新ソースのmaster/HEADのままpython setup.py installすると0.8.0.dev0がインストールされた。

この状態でnolearnを入れる。

pip install git+https://github.com/dnouri/nolearn.git@master#egg=nolearn==0.7.git

すると0.7をリクエストしている割に0.6a0.dev0がインストールされたがチュートリアルのコード動いたので結果オーライ。

Linuxだとなぜかこの辺が全然問題なくチュートリアルどおりできてしまうのは、機械学習関連はやっぱり開発者もユーザーも圧倒的にLinuxが多いからだろうなぁ。

2016年2月18日 (木)

ウィンドウズでCUDA付きでTheanoインストール!Python3.5でもできた。

Cpuandgpu1

前書き

TheanoはPythonでディープラーニングするときに人気なライブラリで、CUDAをサポートしているのでそれなりなGPUがあるPCではCPUより10倍くらい速くなります。私のちょっと古いGeForce 550Tiで7-20倍くらい。ハイエンドなGPUならもっともっと速いでしょう。Theano公式サイトは最大140倍とも。

ディープラーニングをバリバリやっている人はみんなLinuxを使っているようですが、それはCUDAをまともに使うのがウィンドウズではめんどいのが一因と思われます。下に触れますが、特にPython3ではなくPython2系を使いたい場合はいろいろ面倒で制約もあります。

でもウィンドウズでもTheanoからCUDAをつかってDeep Learningするのは不可能ではなく、Theano公式サイトのウィンドウズでPython2.7向けのインストール方法を参考にそのままやれば、一応インストールできました。

公式サイトのガイドがPython27のままなので躊躇しますが、実はPython3系の方がインストールが簡単で、さらに最新版のCUDA Tookit 7.5もつかえるので、ウィンドウズでCUDA付きでTheanoを使う場合はPython3.4がオススメです。最新のPython 3.5はちょっと面倒です。

インストール方法をちょっとググると、GithubのWikiとかstackoverflowの回答とかが検索結果の上位にきて、どちらもPyCUDAをまず入れるとあるので、PyCUDAが必須のように錯覚しますが、実はそうではないのでまったく無視して構わないです。実際に、公式サイトのインストール方にはPyCUDAに触れてません。

TheanoはGPU用のArrayを自前で定義していて、普通はそっちを使います。ただしfloat32しかサポートしていないアレイなので、パフォーマンス上のチューニングの関係でfloat32以外のアレイを使いたい場合、すべてのCUDA APIを網羅しているPyCUDAを混ぜて使うようです。

さて、ウィンドウズでPython2.7系でTheanoとCUDAを使うときの最大の制限はCUDA Toolkitのバージョンを5.5まで落とさなければならないことです。執筆時の最新版は7.5なのでだいぶ古いですね。

これは公式のPython27がC++ Visual Studio 2008 (VS2008)でコンパイルされている関係上、VS2008をサポートしている最後のCUDA Toolkit 5.5を使う必要があるということが原因らしいです。ただし、困ったことにVS2008は古すぎて配布が終わっています。まあ回避方法がありますが。

また、インストール始める前にGPUがCUDA対応か?さらには古いGPUでCompute Capabilityが2.0以下の場合、Theanoが対応していない可能性があるので、初めにちゃんと確認するのをオススメします。私はQuadro FX 580でひどい目に会いました。

Using gpu device 0: Quadro FX 580
WARNING (theano.sandbox.cuda): You are probably using an old GPU, that Theano do
es not support. This means GPU code will most likely be slow AND may crash when
we try to use features that your GPU does not support.

CUDAが使えるGPUの表には、私のFX 580は古すぎてもはやのってないですが、本体にはCUDAのステッカーが貼ってあるし、FX 580のスペックみるとCUDA OKになっています。

しかし、問題はTheanoの方でTheanoは古いGPUはサポートしていないのでした。(´・ω・`)

TheanoがダメだったFX 580はCompute Capabilityが1.1でOKだったGeForce 550TiはCompute Capability 2.1なので、2.1以上のGPUなら多分Theanoも対応しているでしょう。

Python 3.4の場合

下に書くように最新のPython 3.5でも出来ましたが、ちょっと面倒です。3.4ならAnacondaで依存性ライブラリが全部揃うので簡単です。(追記、3.5でも同様にAnacondaで簡単にできるようになりました。)

インストール方法はこのブログを参考によくまとまっています。

私の場合は、Theano公式サイトのウィンドウズでのインストール方法のTDM-GCC-64がすでにあったので、MinGWは入れずにこれを使いました。要は、TDM-GCC-64のbinにあるg++.exeにパスを通しておけばTheanoのコンパイルが通るようです。

基本的には

1. CUDA Tooklit 7.5 64ビットをダウンロード。1 GB近い。インストール時にVS2013が必要なのでまだインストールしない。

2. 先にVisual Studio 2013のコミュニティエディションをインストール。C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\vcvarsall.batにパスを通しておくと楽。

3. VS2013のインストール完了後、再起動してからCUDA Toolkitをインストール。

4. C:\ProgramDataフォルダの下にあるCUDA ToolkitのdeviceQueryのサンプルを探して、同じフォルダにあるvs2013.slnを開く。

5. VS2013が開くのでこれをCTRL+F5でテスト。CMDが開いてメッセージの最後がPASSになっているのを確認。これでGPUのコンパイラnvccが使えるようになった。

6. MinGWかTDM-GCC-64をインストール。パスを汚したくない場合はパスに登録しないであとで起動スクリプト作成する。私はTDM-GCC-64でOpenMPにチェックして、C:\TDM-GCC-64にインストールした。OpenMPはマルチプロセスのライブラリなのでマルチコアのCPUでパフォーマンスの向上が期待できる。

7. ミニコンダもしくはアナコンダでconda create -n myTheanoEnv python=3.4 numpy, scipy, libpythonとして専用の環境を作成。必要に応じて activate myTheanoEnvしてconda install ipython matplotlib nose などを追加する。

8. Theanoをgit clone https://github.com/Theano/Theano.gitしてから、最新リリースの0.7をチェックアウト git checkout tags/rel-0.7

9. activate myTheanoEnvしてさっき作ったcondaの環境に切り替えてからtheanoのフォルダからpython setup.py installして、theanoをインストール

10. C:\Users\Usernameのユーザープロファイルにある.theanorcファイルを編集して、GPUを使うように設定する。

[global]
device = gpu
floatX = float32

[nvcc]
flags = --use-local-env  --cl-version=2013

11.theanoの初回インポートはコンパイラーががんばるので時間がかかる。VS2013とGCC(MinGWかTDM)にパスが通っていれば activate myTheanoEnv してからpython起動して、普通にimport theanoでよい。パスを汚したくない場合は起動スクリプトを作成する。

スクリプトの例

REM start script for anaconda python34

REM configure path for msvc compilers
CALL "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" amd64

REM activate conda env
CALL activate myTheanoEnv 

REM add tdm gcc stuff
set PATH=C:\TDM-GCC-64\bin;C:\TDM-GCC-64\x86_64-w64-mingw32\bin;%PATH%

REM return a shell
cmd.exe /k

このスクリプトを起動して出てきたCMDにはパスがいろいろと通っているので、このコマンドプロンプトからpythonを起動してTheanoを使う。

Python 3.5の場合

追記)Python3.4と同様にできるようになったっぽいです。python35.dllについてごちゃごちゃやらずlibpythonをconda installするだけでOKです。まあなんかのために残しておきます。

これもほぼ上の3.4と同じですが、libpythonについてはconda install libpythonが失敗するので、Theano公式サイトのインストール方法にあるとおり、自分でgendefとdlltoolをつかってpython35.DLLからpython.aをつくってlibsにおきます。

私の場合ミニコンダなので

conda create -n myTheanoEnv python=3.5 numpy, scipy

としてから、C:\TDM-GCC-64\x86_64-w64-mingw32\binにあるgendefをつかって

gendef C:\Miniconda3\envs\myTheanoEnv\python35.dll

とし、これでできた python35.def をつかって、

dlltool --dllname python35.dll --def python35.def --output-lib C:\Miniconda3\envs\myTheanoEnv\libs\libpython35.a

としてaファイルをPythonのlibsフォルダーに作成。これでlibpythonのTheanoが必要な部分がインストールされたはず。

このlibpythonが3.5でconda installできないの問題はAnacondaのサポートによるとMinGWの方の問題で、MinGWがVS2013との互換性をサポートするまで対応しないといっているので、時間かかるかも。

Python2.7の場合

上に書いたようにPython3系の方がインストール簡単で、最新のCUDA Toolkitが使えるので、Python2.7でないといけない理由がない限りPython3がオススメです。

CUDA Toolkit 5.5のインストールの過程でCUDA Toolkitが対応しているマイクソソフトのVisual Studio C++が必要ですが、これはVS2008が入手困難なので公式のインストール方法では、代わりにVS2010を使ってます。

ただし、VS2010のExpress版(製品版ではなくフリーの方)は64ビットのコンパイラを同梱していないという罠があり、CUDA Toolkitを64ビットのPCで使う場合(つまりほぼすべてのWindows 7/8マシン)、困ります。

これには対処法があって、Microsoft SDK 7.1という別の開発者向けのパッケージについてくる64ビットのコンパイラを取ってきてこれとVS2010がインストールされた状態でCUDA Toolkitのインストールをします。

ちなみにMicrosoft SDK 7.1のインストール時にRuntimeもインストールするをチェックするとインストールに失敗する可能性が高いです。Microsoft SDK 7.1はけっこう古いので、Windows Updateがより新しいRuntimeをインストールしたりするとインストール時のバージョンのチェックで想定外のエラーになってインストールが失敗するっぽいです。RuntimeをアンインストールするかRuntimeのインストールのチェックを外すかしないと解決しません。

CUDA ToolkitのインストールができたらC:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.5\Bin\win32\ReleaseにあるDeviceQuery.exeをCMDから実行して、GPUが認識できているかテストします。最後の方に”PASS”とあればおkです。これでCUDA Toolkitの方は一応おしまい。

ちなみにRemote Desktopで接続してきて、DeviceQueryするとインストールが正常でもGPUが見つからないと怒られるので、もしかしたらCUDAを使う場合、家から職場のPCに接続して仕事するみたいなことができないかもしれません。

Theanoは自分が吐いたCコードのコンパイルに主にg++.exeを使いますが、前述のとおりPython27の場合、Pythonとの互換性を保つためにPython27と同じコンパイラも必要なので、やっぱり配布終了したVS2008が必要になります。

しかし、マイクソソフトが「 Microsoft Visual C++ Compiler for Python 2.7」というツールを用意してあり、これでVS2008のPythonのビルドに必要な部分が取ってこれます。下のenv.batにあるように後でTheanoがこれを使うように環境設定してやります。

その後は、Theano公式サイトのインストール方法にあるようにTDM-GCCをとってきて、さらに、オススメされているWinPythonの2.7系をインストールします。私はせっかくなので64ビット版にしました。

WinPythonをインストールしたあとは、ガイドにしたがってenv.batを制作します。TDM-GCC-64へのパスや、WinPython-64bit-2.7.9.4のところは適当に自分の環境に合わせます。ガイド中でPython Shellといっているのはenv.batででてくるCMDのことです。

その下のgendef も上のPython3.5の場合にある要領でやってようやくTheanoのインストールです。 ガイドにしたがって0.7系をつかいます。普通にCloneすると0.8-devになって、nolearnとlasagneと使う場合、nolearnとlasagneも最新のdev版をつかわないとうまく行かなかったので、Theanoだけならリリース最新版の0.7にしたほうが無難です。

参考:「ウィンドウズでLasagne/nolearn/Theanoで深層畳み込みニューラルネットワークしてみる

.theanorcの部分もそのままやってうまくいきました。WinPythonの場合PROFILEフォルダではなくSettingsというWinPythonのサブディレクトリに.theanorcがあるので注意。

--use-local-env --cl-version=2008の部分は重要で、これがないとnvccがVSを見つけられずエラーになります。nvccはGPU用のNVIDIAのコンパイラです。

まあこんな状況でできないことはないですが、インストールはけっこう大変ですし、Python27の場合、最新版のCUDAは使えません。新しいCUDA Toolkitはより新しくてパワフルなGPUをサポートしてますので、ちゃんとパフォーマンスが欲しい人はPython3にするか、多くの人々がしているようにLinuxでやったほうが無難ですね。

私は、Linux Mintで最初家のマシンでTheanoのシステム構築しましたが、Linuxタコな初心者でも普通にできました。つーか、Linux Mintが快適なので家のメインPCはWindows 7からMintに乗り換えてしまいました。

さてめでたくウィンドウズでTheanoをCUDA付きで使えるようになりました。

Pythonディストリビューションについて

Theanoチームがこのガイド中に

We highly recommend the Pierre Raybaut’s WinPython distribution - it is compiled for both 32- and 64-bit systems, links against the fast MKL BLAS implementation, supports installation of auxiliary packages from Chris Gohlke and is free.

といってWinPythonをオススメしているのですが、私はWinPythonがGohlkeさんのパッケージと互換性があるのを知らなかったので、これをみて色々とあるウィンドウズのPythonディストリビューションの中、個人的にはWinPythonがもしかしたら最強なのではとおもいました。なぜかというと例えばAnacondaという人気なディストリビューションがありますが、これはPythonにしてもNumpyにしてもAnacondaがソースコードからビルドしたものを配布しています。なのでNumpyに強く依存しているライブラリ(つまりたくさんの科学分野用のライブラリ)はGohlkeさんのパッケージとは互換性があまりありません。AnacondaがウィンドウズでもOpenCVとかPyCUDAとかはをちゃんと用意してくれれば問題ないですが、私の場合OpenCVは超重要なので困ります。

追記) とおもったらAnacondaにひっそりとopencv_contrib付きと見られるビルドをみつけた。メインのレポジトリではなく、おそらくユーザーが提供しているビルドっぽいが、conda install -c https://conda.anaconda.org/menpo opencv3とするとopencv 3.1.0がインストールされる。しかも、opencv_contribにある実験的なモジュールもCUDAも付いているビルドで、ウィンドウズでもUbuntu/LinuxMintでもちゃんと使えたので、Anacondaをかなり見直しました。

AnacondaでもPython3系でTheanoの環境構築できたので、Anacondaで大抵は大丈夫かな。AnacondaでだめならWinPython+Gohlkeさんのパッケージというのを覚えておこう。

2016年2月11日 (木)

ウィンドウズでOpenCV 3.1.0をopencv_contrib付きでPython用にビルド。

Opencvlogowhite1_2

今更ながらopencv_contribにある実験的なモジュールの数々が宝の山であることを発見。昔はC++しかアクセスできなかったが、opencv3.0.0あたりからPythonからもだいぶ利用可能になっているらしい。opencv_contribのモジュールは公式なバイナリには含まれないので、Python27(32-bit)用に自分でビルドに挑戦。だれか配ってくれよとおもったが、ぐぐっても「ビルドは簡単だから自分でやれ」とのお言葉ばかりで、バイナリは落ちていない模様。

追記! GohlkeさんのところにPython3.5のopencv_contrib付きビルドがあった。64ビットと32ビット両方。Python27はなし。これは本格的に3.5に乗換るときが来たということか。

さらに追記・・。Gohlkeさんのopencv_python-3.1.0+contrib-cp35-none-win_amd64.whlをアナコンダの64ビットのPython3.5で試したところインポートできなかった・・。多分64ビットNumpyのコンパイラーの不一致のせい。GohlkeさんのNumpyはMKLサポート版で公式のPythonをビルドした同じVisual Studioでビルドしてある。AnacondaのNumpyはMKLなしなのかな。とにかく相性悪い模様。

追記) Anacondaにひっそりとopencv_contrib付きと見られるビルドをみつけた。公式のレポジトリーにはないので油断してた。。。conda install -c https://conda.anaconda.org/menpo opencv3とするとopencv 3.1.0がインストールされる模様。menpoって?ググってもようわからん。Linuxではsource activate後にlib_opencv_highgui.soにパスを通さないとVideoCapture使えないのが注意だが、ちゃんと使える。AnacondaにはウィンドウズでもLinuxでもopencv_contrib付きのすばらしいOpenCV3があるという結論。見直した。自分でビルドしなくてもいいかも。

参考資料:

上の「にせねこメモ」さんのところではVS2013を使っていますが、私の場合Install OpenCV-Python in Windowsにあるとおり、上の「Install OpenCV-Python in Windows」に従ってVisual Studio 2012をつかってビルドしました。

なのでVS2012がなければこれをインストールしておく。 こちらからisoファイルをダウンロードできる。これを WinCDEmu Portableなどでマウントしてインストール。

1.適当にフォルダ作成 temp。

2.temp内でgit cloneコマンドで

opencvをクローン

git clone https://github.com/Itseez/opencv

opencv_contribをクローン

git clone https://github.com/Itseez/opencv_contrib

最新のバージョンでビルドがうまくいかないときはリリースまで戻る。

git tag

としてでてくるタグで3.1.0とか3.0.0とか選んで、

git checkout tags/3.1.0

としてリリース版をチェックアウトする。contribの方も同様にバージョンをあわせる。

gitが面倒なら[DOWNLOAD ZIP]ボタンからzipでもおk.

これで

 temp/opencv
 temp/opencv_contrib

のフォルダができているはず。

3.公式にしたがってtemp/opencvの下にbuildフォルダを作成。

temp/opencv/build

4.今作ったまっさらなbuildフォルダにコマンドラインで移動し、ここでcmakeする。cmakeコマンドは現在のフォルダにもろもろと大量のファイル・フォルダを作成するので、移動しておくのが大事。(失敗から学んだ人の言葉)

cmakeはなければ適当に最新版をインストールして、パスを通しておく。

公式では

cmake -DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules opencv_source_directory

でコンフィグレーションするとある。相対パスが効いたのでtemp/opencv/buildからなので

cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ../

でおk.これでConfigureとGenerateが終了。cmakeがPythonのヘッダーとかNumpyのヘッダーとか勝手に見つけてくれる。

もしVS2012以外のジェネレーターが選択されている場合

cmake -G

で出てくるリストを参考に

cmake -G "Visual Studio 11 2012" -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ../

のようにジェネレーターを指定してやるか、

cmake-gui

としてGUIを呼び出して、Fileからキャッシュの削除をして、Configureボタンを押すとジェネレーターを聞いてくるのでVisual Studio 11 2012と"Use default native compilers"を選ぶ。で、Generateボタンを押して完了。

5.VS2012などでビルド

cmakeでプロジェクトファイルの準備が済んだら、makeをしろと公式にはあるがそれはLinux/Macの話。ウィンドウズなのでおとなしくマイクソソフト謹製のコンパイラを使う。

cmakeコマンドが成功していれば、OpenCV.slnというファイルができるはずなのでダブルクリックしてVS2012とかを立ち上げる。

VS2012でビルドのターゲットをDebugからReleaseに変えて、ソリューションエクスプローラーからALL_BUILDを右クリックしてビルドを選択。

リリースにするのを忘れるとdebugバージョンでビルドすることになり長々とビルドをした最後のあたりでpython27_d.lib がないと怒られる。(失敗から学んだ人の言葉2)これはPythonのディベロップメント用のファイルを持っていなからと思われる。

6.できたバイナリを手作業でサイトパッケージにコピー

cv2.pydは opencv\build\lib\Release にある。これがわかりにくい。(失敗から学んだ人の言葉3)

もろもろのDLLは opencv\build\bin\Release にある。

cv2.pydとDLLをごっそりサイトパッケージにコピー。

さらに、ここが重要:

opencv_ffmpeg310.dllをC:\Python27にもコピーする。

python.exeがあるC:\Python27にもffmpegのDLLがないとcv2.VideoCaptureでビデオファイルを開こうとしてもエラーになります(失敗から学んだ人の言葉4)。

前のバージョンが残っている場合はアンインストールする。手作業でやる場合cv.pyとcv2.pydとopencv_**.dlもろもろとtbb.dllをsite-packagesから他のフォルダに避難しておく。opencv_ffmpegXXX.dllをC:\Python27から避難するのもわすれずに。cv2.pydを選んで日付順にソートすると見つけるのが楽。

7.テスト

>>> import cv2
>>> cv2.__version__
0: '3.1.0-dev'
>>> fp = r'C:/Users/Public/Videos/Sample Videos/Wildlife.wmv'
>>> cap = cv2.VideoCapture(fp)
>>> cap.isOpened()
1: True

やったー。。

8.おまけ TBBでマルチコアを使う。

欲を言えばtbbがオンになっていないのでマルチコアが使えてないのがちょっと悲しい。場合によっては爆速らしいしやってみる。設定するオプションがいっぱいなのでコマンドラインよりcmake-guiでやったほうがいい。

  • OpenCVとcontribは3.1.0のリリースソースをチェックアウト
  • cmake-guiでOPENCV_EXTRA_MODULES_PATHがちゃんと設定されているか確認。一度上でコンフィグしているので大丈夫なはず。
  • opencv\depというフォルダをつくってそこに最新版tbbの44のソースとバイナリを解凍。ソースだけだとtbb.libがないと怒られた気がする。
  • cmake-guiでWITH_TBB をイエス
  • cmake-guiでBUILD_TBBはチェックすると怒られるのでしない
  • TBB_INCLUDES_DIRSに C:\temp\opencv\dep\tbb44_20151115oss

でなんかできたっぽい。tbb.dllは自分でビルドするなと書いてあるのでダウンロードしてきたものをそのまま使う。

より以前の記事一覧

広告欄


やっつけタイムライン

広告欄

はてブ

人目の訪問です。

  • follow us in feedly

    かなり更新が不定期なため、RSSリーダーをオススメします。現在Feedlyに122人登録頂いています。多謝!RSSを表示

    ブログランキング用 にほんブログ村 IT技術ブログ Pythonへ ブログランキングならblogram






    Jenny Mayhem
2017年7月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

IT技術注目記事

無料ブログはココログ