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

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は自分でビルドするなと書いてあるのでダウンロードしてきたものをそのまま使う。

2016年1月 4日 (月)

ウィンドウズ版のPythonでメモリに困った場合の対処法

3230008811

のんびりしているエンジニアの日記の「Pythonで少なくメモリを使用する方法」に触発されてわたしも書いてみます。

私自身、仕事でPythonで画像処理とかよくするのですが、そうするとMemoryErrorをくらっちゃうことが多々あります。

基本的には「のんびりしているエンジニアの日記」にあるような対処をして、ピークメモリが減るようにリファクターとかしてしのいでますが、どうしてもピークメモリすらウィンドウズでPythonのインスタンスに割り当てられる限界の2GBを突破してしまい、OSが64ビットだろうが、PCに16GBのメモリをつんでいようが2GBに達した時点でMemoryErrorを食らいます。

Windows 7は64ビットだからといって安心してはいけません。ウィンドウズは32ビットのプログラムにメモリを出し渋る仕様なのです。がーーーん・・・。

これは64bitのPythonに移行するのがめんどいので、私の環境がいまだにpython.exeが32bitなためで、64ビットのPythonを使えば別にそれでOKです。

ただ、色々な事情で32ビットのPythonを使い続けている人もまだけっこういるとおもわれます。

そんな場合でも実はマイクロソフトから配布されているEDITBINというコマンドラインツールを使って、2GBの限界を突破して、おそらく32bitの限界の4GBまで?いけるようになります(Pythonのバグトラッカーをみると限界は3GBみたいですね)。

やり方

EDITBINは「Microsoft Visual C++ 2008 Express Edition」に付属するツールなのでまずこれをインストールします。

つぎに「C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin」にあるeditbin.exeを発見します。

つぎに以下のコマンドを実行します。普通のCMDでもいいですが、Microsoft Visual Studio Command Promptを使うとeditbin.exeにパスが通っているのでらくです。

editbin /LARGEADDRESSAWARE "C:\Python27\python.exe"

として、Pyhonのインタプリターの実行ファイルのフラグを書き換えます。

これだけで、ウィンドウズOSがPythonに割り当てるメモリが増えますので、2GBの壁を突破できるわけです。これはPythonに限らず一般的に使える方法ですので、Rubyとかゲームソフトとかにも応用できるとおもいます。

editbinのオプションはこちらのmsdnサイトを参考にしてください。

まあさっさと64bitに移行すればいいだけなんですけどねぇ。。サードパーティーライブラリーも十分対応済みなのでぜんぜん可能だと思うんですが、数年前からの遺産の蓄積があるので腰が重いです。

Linuxならこんなこと心配する必要ないですけどね。。

2016年1月 3日 (日)

デイビッド・ビーズリーのユニットテストで魚が死んだ話。

自称ファンクラブ(非公式)を宣言して以来、やっぱりほぼほったらかしになりましたが、ビーズリー節炸裂な面白いツイートがあったので紹介して、ファンクラブの活動のアリバイ作り。

なんか魚を飼っていたらしいデイビッド曰く:

「水槽の水質検査紙が言うには全く問題なしらしいが、魚は全部死んでいる。バカげたテストだよ。 なんでテストなんか気にする必要があるってんだ。これじゃテストしたせいで魚が死んだみたいだよ、ほんとに。」

というボヤキが入ります。

ここでいうテストという言葉は二重の意味があってなんかプログラミングしているときに規模が大きくなってくるとユニットテストとかコードがちゃんと動作しているのかテストするためのコードを書いたりするのがよいということになっています。でもちゃんとしたテストなんか書くのはめんどいし、効果がほんとにあるのかはケースバイケースだったりで、懐疑的な人も多い。でも、教科書的なというか教義的にテストの重要性を強調するようなトークとかPyConとか行くとよくあったりするわけです。

耳にタコができるくらいテストの重要性を聞かされるので、コアなプログラマーはテストという言葉に敏感なんですね。それで水質検査のテストが全く意味を成さないのを皮肉っているわけです。

そうするとフォロワーさんたちが悪乗りしてきて、

「テストが通ったんだったら魚が死ぬ方がおかしいよ。」

とか、

「うちの水槽を確認したけど魚大丈夫だよ。テスト環境を最新にしているかい?」

とか会社とかでチームでコーディングしている状況で実際にありそうな返事でボケてきます。

茶々入れは更に続き、

「ペットショップはDockerを使わないと駄目だね。ただ魚を売るんじゃなくって、水槽も一切合切全部の環境を売る。そうすれば差異がなくなるのに。」

とか最近はやりのDockerを絡めてきます。ボケにボケで返すわけですね。

DockerというのはLinuxの環境をGitみたいにコミットできるあれですね。Python2.5で動くプログラムを最新のUbuntuで動かしたらPythonが3だったとか2.7.9だったとかで動かないみたいな問題を解決するためプログラムの動作環境そのものをパッケージ化してバージョン管理してしまう。

ときて、魚にはPlecoさんという名前をつけていた魚は水槽の底で動かない。

度々ツイートに出てくるデイビッドの子供は死んだ魚をトイレに流すのに興奮状態。

a case of ichってなんじゃ?とおもったら、おそらく感染症の一種っぽいです。黄色い斑点が魚の体表にできるらしいです。

というわけで感染症で魚が全滅してしまったのではないかという感じ。

真面目な話、水質検査のスティックでテストできるのはせいぜいpHとか重金属の汚染度とかくらいだと思うので、細菌に感染してた場合はテストはパスしてしまうでしょうから、やっぱり細菌とかが怪しいですね。

まあ、とりとめのないやりとりですが、いたずら好きな少年のようなやりとりがいかにもビーズリー節ですね。面白さが伝えきれたかは自信なし。

デイビッド節がお気に召された方は、ぜひPyCon2012でデイビッドが行ったPyPyについてのトーク「Let’s talk about something diabolical」がとっても面白いので御覧ください。このトークがファンになったきっかけです。この人はdiabolicalという単語が大好きで、よく使います。

2015年10月17日 (土)

WindowsでLANネットワーク上にリモートGitレポを作成。

Gitで自分用のPythonプロジェクトをローカルのレポジトリーで管理していたが、同僚と共有することになり、メールで最新版をやりとりするのに疲れたので、職場のネットワークドライブ上にGitのレポジトリーをおいて同僚にgitでpullしたり最新版にバグがあったら自分でロールバックしてもらうようにしたら、こっちの負担が減るのでやってみた。似たようなことはTortoiseSVNでもやっていたので簡単なはず。

ネットワークドライブ上にレポジトリーとなるフォルダを用意する。例としてKドライブ上にK:/Git repo/project1というフォルダを作った場合で考える。

Desktoplogo1

GitHub DesktopについてくるGithub Shellを起動して、Kドライブへ移動する。ここで、いきなり

CD K:/Git repo/project1

とやってもCドライブからなにも変わらないので、ウインドウズではUNCパス上にCDできないと思っている人がけっこういるが、これはドライブの切り替えを忘れているだけで、実はできる。

まずは

K:

としてからCDすると、見事にKドライブのレポジトリー用フォルダへ移動できる。

そして、あとは普通に

git init --bare

として、まっさらなレポジトリーを作成して、

C:

としてCドライブへ戻ってくる。ローカルのレポジトリーのあるフォルダへ移動して、

git remote add origin K:/Git repo/project1

としてPushするリモート先を登録。

git push origin master

とするとプッシュされる。

あとは同僚にGitHub Desktopの基本を教えて終了。簡単だった。もっと早くやっとくべきだった。

確認してないけど、上記の記事についたコメントによると、ドライブの切り替えとかすっ飛ばしてCドライブのローカルのレポジトリーフォルダから

git init --bare K:/Git repo/project1

とするだけでいいみたいだった。

もちろん小規模なチームなのでプライベートレポジトリー無料なBitbucketでもよかったんだけども、社外にはソースを出せない場合とか便利なのでは。

2015年10月10日 (土)

matplotlibで軸に大小の目盛り(主目盛、補助目盛)をつける

日本語でmajor tickとminor tickのことをなんて言っていいのかわからないので変なタイトルですが、プロットしたx,y軸につける等間隔の刻みのことです。(目盛りであってるか。メモリと最初書いたので変な気がしてしまった。主目盛、補助目盛というようです。)

デフォルトではマイナーチックはオフだそうなので、自分でオンにしてやらなければいけないようです。

公式のサンプルコードmajor_minor_demo1.pyはimport matplotlib.pyplot as pltのネームスペースでの例なので、私がよく使うpylab環境で同じことをするときの覚書です。

マイナーチックをつけるだけならMultipleLocatorをセットするだけでよく、

from pylab import *

で、MultipleLocatorもFormatStrFormatterもインポートされているようなので、現在アクティブなaxisをgca()でとってきて

gca().xaxis.set_minor_locator(MultipleLocator(5))

という感じでオーケーでした。MultipleLocator(5)ならばマイナーチックは5刻みです。

メージャーチック20でマイナーチック5の例

Minor_ticks

from pylab import *

fig = figure(facecolor='w')
ax = subplot(111)
ax.plot(arange(100)**2)
ax.xaxis.set_minor_locator(MultipleLocator(5))
draw()

上の例ではデフォルトに頼っていますが、

ax.xaxis.set_major_locator(MultipleLocator(20))

とするとメジャーチックも確実に指定できます。

より以前の記事一覧

広告欄


やっつけタイムライン

広告欄

はてブ

人目の訪問です。

  • follow us in feedly

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

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






    Jenny Mayhem
2017年2月
      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        

Amazon

IT技術注目記事

無料ブログはココログ