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

2018年5月 2日 (水)

JupyterLabでも好きな外部エディターを使いたい!

JupyterLab内蔵のEditorはいまのところオートコンプリートが効かないので、つかえねーよという方も多いかと思うんだけど、JupyterLabのエディターにどうやってオートコンプリートつけるかはいろいろ議論中らしいですなぁ。正式版ではどうなるのだろうか。

Notebook内のCellの編集でオートコンプリートできるのは、Notebook起動した時点で専用のプロセスがもう起動しているが、エディターにはまだPythonのプロセスが走ってない状態がありえるから同じ方法ではできないし("Create Console for Editor"するまではまだない)、どのバージョンのPythonなのかとかいろいろ不確定な要素もあるし、良い仕様を模索している感じかなぁ。個人的には#!/usr/bin/envとかがあれば、そこにあるインタプリターつかって、それ以外はJupyterが走っているPythonをデフォルトにするとかでいいじゃないかとかおもっちゃうが。その辺、Sublime Textはどう処理しているのだろう。。。

しかし、ちょっと試したところ下に書いたようにただ単にファイルを好きな外部エディターで開いて編集してしまって、JupyterLabのエディターで保存しようとするとRevertするかOverwriteするかきかれるのでRevertすればいいと判明。あとはIPythonコンソールをJupyterLabから開いて%runマジック使って実行する場合、最新のファイルの内容で実行されるので、JupyterLabのエディターを最新のバッファーに保つ意味はないようなので、こまめにRevertするような必要はなさそうだし、これでいっか。

Revert

さらに、SSH接続した場合でもOKだった。試したのはウィンドウズでX11 forwardingに定評があるらしいMobaXterm経由で同一ネットワーク上のLinuxマシンへとSSHして、そこからsublコマンドでLinuxサーバー上でSublime Text起動し、GUIをウィンドウズ7へX11 forwardingし、JupyterLabで制作したファイルを開いて編集したら、Sublimeでした編集がJupyterLabへと反映されたし、その逆もできることを確認した。JupyterLabのエディターでした変更はただ単にCtrl+Sでセーブすれば一瞬でSublime側にも反映されるが、Sublimeでした変更はJupyterLabのエディターへいって保存しようとするとファイルに変更があったから[Revert]するか[Overwrite]するか聞かれるのでRevertを選択してリロードすることになるので2つほど操作が余計なのが残念。これってJupyter側でエディターの設定でリロード設定を変えられないだろうか?あとでチェックしておこう。

MobaXterm + SublimeText + JupyterLab はワタシ的にはかなり素晴らしかった。MobaXtermがX11 forwardingをだいぶ高速化しているっぽい。

Linux Mint 18マシンからssh -X 192.168.1.100で同様にX11 forwardingしてみるとSublimeの描画が非常に遅いので、-CオプションをつけるとXセッションのコンプレッションがされて高速化されて、MobaXtermとあまり変わらない速度になった。快適。

MintのsshでもMoboXtermと同じでJupyterLabのエディターで保存しようとしてRevertしないといけないが、一応使えた。もっといい方法がないかとは思うがしばらくはこれで行くか。

追記) Get xpra to work on Ubuntu 14.04を参照して、xpra v2.2.6でもできたので覚書。

サーバーにSSHして、

xpra start :1234 --start-child=subl --no-notification --no-pulseaudio

してサブライム起動。

クライアントサイド(Linux Mint18)のxpra launcherを起動して、SSHを選択。IPのあと、ポート番号:ディスプレイ番号を入力して接続。上の場合は、22:1234となる。

xpraの方が速いと言われているが速さ的にはsshでコンプレッションしたのと変わらない気がする。。。しかし、xpraなら切断してからセッションに再接続できるのがやはり便利だ。

Sublimeどうしても使いたいのでなければ、普通にsshしてからtmuxが簡単か。nanoかvimでも覚えようかな。

ローカルエリア内のJupyterLabサーバーにLAN経由で接続する。

自宅でDeep learning専用Linuxマシンを組んで、ルーターのそばに置いて、トレーニング中の騒音を遠ざけているので、サーバーにはSSH経由で接続してゴニョゴニョやるか、GUIが必要なときはTeamViewerでやっていたが、JupyterLabのサーバー立てておけば、それでほぼオーケーな気がしてきたので、やってみたので自分用覚書。

Jupyterlab_darktheme

Settingsからthemeをダークにできるのね。

参考サイト: Expose jupyter notebook over the network

まずは、クライエントとなるPCからSSH経由でサーバーにログインする。ウィンドウズならPuTTYで普通にログインする。

Jupyter labはcondaで環境作って入れたのでenvに切り替えてから

jupyter lab --ip 192.169.1.100

という感じにサーバーを建てる。 --ipのオプションをいれないとデフォルトのlocalhostのみを聴きに行く関係、LAN経由でアクセスするとたどり着けないのでIP(例として192.169.1.100)を指定しておく。

あとはクライエントのPCでサーバー開始したときにコンソールに出てきたトークン付きのURLをブラウザにコピペする(初回のみ)。次からは、192.169.1.100:8888を開けばOK。インターネット経由ではないのでポートフォワーディングとかいらない。

2017年8月 1日 (火)

Juliaやってみよう。五日目。Pythonと速度比較。

def test():

    Ne=800;                 Ni=200;
    re=rand(Ne,1);          ri=rand(Ni,1);
    a=vstack([0.02*ones((Ne,1)), 0.02+0.08*ri]);
    b=vstack([0.2*ones((Ne,1)),  0.25-0.05*ri]);
    c=vstack([-65+15*re**2,  -65*ones((Ni,1))]);
    d=vstack([8-6*re**2,       2*ones((Ni,1))]);
    S=hstack([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 in range(1000):            # simulation of 1000 ms

        I=vstack([5*randn(Ne,1), 2*randn(Ni,1)]); # thalamic input
        fired=find(v>=30);    # indices of spikes
        if fired.any():

            if firings == []:
                firings=vstack([t+0*fired,fired]).T
            else:
                firings=vstack([firings, vstack([t+0*fired,fired]).T]);

            v[fired]=c[fired];
            u[fired]=u[fired]+d[fired];
            I=I+sum(S[:,fired],1).reshape(-1,1);

        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

全快の記事では、Izhikevichモデルを1000 msほどシミュレーションした時のjuliaの実行時間は785 msでした。

速度比較のため、上記のようなnumpyバージョンを作ってみたところ、253 msでした。

Python版ではfiredを調べて空だったらシナプス入力の計算を端折るようにしたので、そのせいで速い可能性もあるので、juliaも同様に

if length(fired) > 0

という風にチェックを入れたら625 msまで速くなった。それでもPythonが三倍くらい速いとかあり得ない。なにかおかしい。

もしかしたらjuliaのJITが温まる前なのかな。ループを長くしたら逆転するかも。PypyのJITが温まるまで4秒くらいとか聞いた気がするので、シミュレーションを1000 msから30000 msにしてみる。

Python2   23.4 s
julia    34.48 s

結果、差はだいぶ縮まったが、それでもPythonがちょっと速い。これならJITのあるjuliaが有利な条件だと思うけども。ふーーむ。juliaの偉い人が颯爽とアドバイスくれたりないかなぁ・・。

まあKyle Barbary氏の2014年のブログ記事の信憑性がましてしまった。

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版よりも新しいモデルなのに安いじゃないか。うむ。これなら手がだせそう!

より以前の記事一覧

広告欄


広告欄

Amazon

  • ブログ記事にした商品のアフィ

    デジピはヤマハが音質・キータッチとも一番良いです。

    レビュー記事かいた程おすすめのワイヤレススピーカー。

    安いタブレットとして買い替えに最適

    業務用あれな人向け。家でもキムワイプ

    速くKindle化して欲しい

    シネッセンス細胞関連の緑茶由来のサプリメント。

やっつけタイムライン

はてブ

人目の訪問です。

  • follow us in feedly

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

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

    当ブログはElementaryOSに浮気しつつも超安定なLinuxMintを応援しています。






    Jenny Mayhem
2018年6月
          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
無料ブログはココログ

IT技術注目記事