2021年5月 5日 (水)

Noteの記事をPythonでバックアップしといた。

Noteは今の所自分に直接は検閲された感じもないし、割と言論の自由があるんじゃないかと思ってはいるんだけど、「ユーザーをブロックする」という機能があって、Noteのヘルプページによると:

ブロックすると、以下の状態になります。

  • 相手はあなたの記事にスキできなくなります
  • 相手はあなたの記事にコメントできなくなります

だそうだ。

でもamisima7さんの場合

「スキ禁、コメ禁、のほかに、UP禁

私は誰かに通報されTELとか、運営に睨まれてる可能性があるらしいです(^_^;)」

という事で、ブロックでは説明できない現象もある模様。

cakesという同じくNoteがやっているサイトでは炎上した記事の削除対応しないNoteに対して叩くような記事もあり、まあちょっと圧力を感じる。

Noteには頑張って欲しいが、いつツイッターの様に検閲し始めるか分かったもんじゃないので対策は必要。

という事で先ずはいつアカウントが凍結したり記事が削除されても良いようにバックアップを取った。

 

サクサクっとPythonでBeautifulsoup4とrequestsで記事一覧ページから全URLのリストを取得して逐次htmlを保存という非常に基本的なアプローチで十分だった。

 

誰得だけどコードを置いておきます。Python3で適当に例によってpython -m venv venvで環境をつくってactivate後にpip install requests Beautifulsoup4でなんとかなるでしょう。from_notesとnotesというフォルダを作ってそこに下のスクリプトを保存して、あとはNoteに行って、自分の記事の一覧ページを一番下までスクロールして全部の記事がでるまで読み込む。これをfrom_notesというフォルダの中へ保存で準備完了。 

 

import os
import sys
from time import sleep
import random
import pickle
import requests
from bs4 import BeautifulSoup
def sleep_progress(t):
  for t_ in range(t):
    sys.stdout.write(f'\r{t_} s / {t}')
    sys.stdout.flush()
    sleep(1)
sys.stdout.write('\r')
# 記事のページを一番下までスクロールして全部の記事がでるまで読み込む
# これをfrom_notesというフォルダ作ってそこへ保存。
# notesというフォルダに記録するのでそっちも作っておく
# 
# note_bk
#   from_notes/
#   notes/
#   venv/
#   notebk.py
fp = './from_notes/note ――つくる、つながる、とどける。.html'
with open(fp, 'r') as f:
  soup = BeautifulSoup(f, 'html.parser')
# 全ての記事のURLを見つける
links = soup.find_all('a', class_='o-articleList__headingLink')
total = len(links)
# ブラウザのフリするため
headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
    }

# 一度保存したページのurlを覚えておく。
if os.path.exists('done.pickle'): with open('done.pickle', 'rb') as f: saved = pickle.load(f) else: saved = set() for n, link in enumerate(links): href = link.attrs.get('href') if href in saved: print (f'{n+1:02}/{total}: 保存済み {href}') continue if href is None: # shitagaki print (f'{n+1:02}/{total}: 下書き') else: t = random.randint(10,60) print (f'{n+1:02}/{total}: {href}, 保存後は{t}秒待つ。') r = requests.get(href, headers=headers) s = BeautifulSoup(r.text, 'html.parser') title, _, type_ = s.title.text.split('|') title = title if len(title)<20 else title[:20] # ファイル名長過ぎる時用 with open(f'./notes/{title}.html', 'w', encoding='utf8') as fp: fp.write(s.prettify()) saved.add(href) sleep_progress(t) # 良い子なのでアグレッシブにダウンロードしない配慮 # 保存したページのURLをピックルしておく。 # 後日のバックアップで無駄なダウンロードしない配慮。 with open('done.pickle', 'wb') as f: pickle.dump(saved, f)

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でも好きな外部エディターを使いたい!" »

ローカルエリア内の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。インターネット経由ではないのでポートフォワーディングとかいらない。

続きを読む "ローカルエリア内のJupyterLabサーバーにLAN経由で接続する。" »

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年のブログ記事の信憑性がましてしまった。

続きを読む "Juliaやってみよう。五日目。Pythonと速度比較。" »

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バージョンを作らねば。

続きを読む "Juliaやってみよう。四日目。@timeでプロファイリング" »

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そのまま。

続きを読む "Juliaやってみよう。三日目。MATLABコードを翻訳してみる。" »

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がベクターだと知らないとスカラーに見えてしまう。

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

続きを読む "Juliaやってみよう。二日目。Juliaのアップデート、IJulia" »

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

続きを読む "Juliaやってみよう。一日目。GRでプロット。" »

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;

続きを読む "SAS University EditionでJupyter Notebookしてみる。" »

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がビルドできないと始まりませんし、これがビルドできれば残りはすんなり行くと思います。

続きを読む "CaffeをWindows 7でcuDNN付きでビルド。" »

より以前の記事一覧

しろののツイッタータイムライン

  • ツイッターは5つ目も凍結されました。6つ目での復活も不可能。なのでnoteに注力しています。

    と思ったら、イーロン・マスクの買収が公になってアカウントが復活できました。ありがとうマスク。

    トランプ関連記事の一覧リスト

オススメたち

2024年12月
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        

はてブ

無料ブログはココログ