カテゴリー「ディープラーニング」の8件の記事

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さんのパッケージというのを覚えておこう。

2015年6月12日 (金)

チートがバレたバイドゥの画像認識研究チームのリーダーが解雇される。

先日お伝えした「百度Baiduの研究チームが画像認識コンテストでのチートがバレてスタンフォード大ImageNetから怒られる。」という記事に書いた問題で、画像認識研究チームのリーダーであるRen Wu氏が解雇されたという記事がありました。

Ren Wu氏はHPやAMDでGPUを使った機械学習の効率的なアーキテクチャについての研究の第一線で活躍中の研究者ということですが、本人がどの程度関与したのかは不明ですが、組織的なチートを防げなかった責任者ということで尻尾切りですね。

面子を重んじる文化があるだけに間違いを認めるのは大変だと思いますが、問題が発覚してからの対応は割りといいんじゃないでしょうか。

”グーグルに画像認識で勝った”英雄だったはずなのに急な転落ですが、アカデミックじゃなく企業で研究してきた人だし、優秀そうな人なので企業への再就職は困らなそうです。

2015年5月28日 (木)

waifu2xを手軽に使えるユーザーインターフェイスが登場

窓の杜に人工知能を駆使して高品質に画像を拡大する“waifu2x”をローカルで扱えるGUIツールという記事があがっていました。

ウェブサービスの方は人気で重くなっているそうなので、こちらのツールを使えばウィンドウズから手軽にwaifu2xを自分のパソコンで試せます。

Gui4waifu2x

紹介されているwaifu2x_win_koroshellではドラッグ&ドロップするだけで拡大できます。

元のwaifu2xはReadmeを読む限りUbuntuでLuaのスクリプトを走らせるという初心者にはやたら高いハードルがあったので、とってもいいのではないでしょうか。

2015年5月26日 (火)

深層ニューラルネットで画像からテキストキャプション生成のデモをトロント大が公開

Deepnet_swing

Nitish Srivastavaさんというトロント大の博士課程の学生さんが深層ニューラルネットをつかった機械学習で画像から自動で説明書きのテキストを生成するというデモを公開しています。

画像を適当にクリックするとトレーニングセットのテキストから一番近い文章、いくつかの自動生成されたキャプションのテキストがでてきます。

説明書きと写真の大量のセットがあればこれくらい可能なのはわりと今では普通かもしれませんが、わりとまともな英語の文章でキャプションが生成されるのがすごいですね。俺の英語よりうまい(;ω;)。

画像を検索するときとか、こういうアルゴリズムで自動でタグをつけたりできるととてもいいですね。グロ系とかを効果的に除外するフィルターとか作れそうです。

おそらくdeepnetという彼が作ったPythonベースでGPUを使用した機械学習のライブラリーをつかったデモなんだと思います。実際のコードを全部公開してくれるといいんだけど、こういうのってIEEEとかで論文にしてアルゴリズムを数式で書いて、図にちょこっと結果を載せて終りなんだよなぁ。

とはいえ、CaffeとかTheanoとかTorchとか、有名なライブラリが出揃っているなか、こういう独自ライブラリはユーザー獲得は難しそう。

自分で似たようなことをしてみたいと思ったらば、PythonならTheanoというGPUもサポートしているライブラリーがオススメ。Deep Learning TutorialsというTheanoのデベロッパーの人たちが書いたチュートリアルがすごくよさそうです。

いつかTheanoで遊んでみたい。

追記。けっこう真面目に始めましたよ。

ウィンドウズでLasagne/nolearn/Theanoで深層畳み込みニューラルネットワークしてみる Theano用にCUDAができるお手ごろGPUを物色中。GTX-960が良さげ

2015年5月19日 (火)

漫画をきれいに拡大できるコマンドラインツールwaifu2x

毎日洪水のように流れてくるHackerNewsのフィードから気になった投稿をさらっと紹介するシリーズを今日から初めます。

第一弾はwaifu2x: Image Super-Resolution for Anime/Fan-Artです。日本人の方が作っているっぽいですね。日本語タイトルは「深層畳み込みニューラルネットワークによる二次元画像のための超解像システム」だそうです。

Waifu2x

なんか今流行りのDeep neural netをつかって画像を拡大して超解像度の画像を得ることができるツールだそうです。

元ネタはImage Super-Resolution Using Deep Convolutional Networksというarxiv.orgに掲載された論文らしく、そのアルゴリズムを参考に似たようなものを実装してみたようです。

これ見た時は「高解像度のイメージを多数用意して、縮小・拡大した時に生じるノイズと元画像の差を使って、何がノイズかというのをニューラルネットワークに学習させることでノイズを選択的にフィルターするのかなぁ」と予想したんだけども元論文をさらっとみるとノイズを選択的に除去するというよりは、低解像度の画像から高解像度の画像を予想して生成する感じですね。

魔法のようですが、低解像度画像から特徴マップを抽出して、これを高解像度画像の特徴マップへと非線形性マッピングするところがミソらしいです。詳しくは下のアルゴリズムのセクションに解説したので飛んでください。

ちなみにあの有名なJavascriptライブラリJQueryを作ったJohn Resigさん浮世絵の収集しているそうで、Waifu2xを使って浮世絵を拡大したデモのUsing Waifu2x to Upscale Japanese Printsという記事を書いています。

Waifu2xは高解像度の画像が十分にあれば(3000くらい)、学習させていろいろなタイプの画像につかえるようですね。

使い方

コマンドラインツールと書きましたが、インストールしなくともこちらのウェブインターフェースにファイルをアップロードするかウェブ上にあるイメージのURLを指定してやれば簡単に試せるようです。これはすでにくアニメ・漫画に最適化されているものと思います。浮世絵だったらこれで行けそうかな。

アニメ以外のものを自分で学習させる場合、Ubuntuでwaifu2xをインストールして、コマンドラインツールを使うことになります。

アルゴリズムはなぜかLuaで実装されているのでLuaもインストールすることになります。Deep neural networkのゴリゴリと行列計算をする部分は自分で書いたのだろうか?なぜにLuaと思ってしまったが、まあ色々とライブラリがあるのかもしれない。

追記。とりあえず、Numeric LuaというLAPACKのラッパーみたいなのが見つかった。行列計算も賢く出来そう。これなら納得。

アルゴリズム

機械学習は全然専門じゃないので間違いがあるかもしれませんが、面白そうなので元論文を流し読みしてみました。

Srcnn

Image Super-Resolution Using Deep Convolutional Networksの図2。

学習の実際の作業としてはこんな感じっぽい。

入力画像生成(図の一番右):まず高解像度の画像を沢山用意して、一度3倍に圧縮して、これをbicubic interpolationで拡大して元の画像サイズに戻す。これが図の左の入力画像で、圧縮によって情報が失われているので低解像度画像になる。これからできるだけ元画像に近い画像を生成したい。ピクセルサイズを元画像と同じにしたのは色々と計算に都合がいいからと思われ。

パッチ抽出(左から2つ目): この入力画像をn1個の3x3または5x5のちっちゃな画像(特徴マップ、パッチ)を重み付けて重ね合わせたもの(畳み込み)として表現し直す。この特徴マップは畳み込みのフィルターで縦線とか斜めの線とか、いろんな大きさの円とかそんな漫画を書く時の基本の部品みたいなものだと思えば多分大体あっていると思います。赤緑青の色違いも用意します。脳の視覚野の神経細胞がやっているような表現方式に変換しているとも考えられます。「畳み込みって何?」という場合は2次元の畳み込みについてはこちらが図が沢山あって分かりやすいような気がします。大相撲の叩き込みとは無関係です。

非線形性マッピング(左から3つ目): 次にこのn1個の特徴マップそれぞれにフィルターをかけてn2個の特徴マップを得る。この過程が非線形性マッピングでこれもやっぱり畳み込みで低解像度の特徴マップを重ねあわせて高解像度用の特徴マップを生成している。計算としては一次視覚野から二次視覚野へ行く感じか。この非線形性マッピングの関係性は最初は適当だけども我々は高解像度の元画像を持っているので元画像に近いような結果になるように畳み込みを調整することができるのがミソ。

再構成(一番右): このn2個の特徴マップは高解像度画像の特徴マップであるとして扱われ、これの畳み込みで元画像に近い画像を得る。操作としてはそれぞれの画素の周辺の予想結果の平均をとっている感じだけども、単純な一律で平均ではなく畳み込みとして空間的な重み付けが違ってもいいように一般的に表現してある。

もちろん最初はどんな特徴マップがいいのかも、どんな非線形性マッピングがいいのか、最後の再構成の重み付けもわからないので、ニューラルネットワークに学習させて最適化。

このパッチ抽出、非線形性マッピング、再構成の3つの過程それぞれは畳み込みなので畳み込みニューラルネットワークとして表現して、これらを3つつなげた深層畳み込みニューラルネットワークをつくってこれに多数の高解像度画像を与えて学習させて、再構成した画像がオリジナルに近づくように重み付けを調整する。これでトレーニングセットに対して有効な特徴マップとそれの非線形性マッピングの重み付け行列が得られるので、これをつかってトレーニングセット以外の新しい低解像度画像に同じ計算をしてやるとあら不思議、超解像度の画像が得られるというしかけ。

しかし3層しかないのに深層と呼ぶのなのは大昔のパーセプトロンでも3層あるしなんか変な感じ。グーグルの画像認識の例だと6層くらいだし、普通は非線形性マッピングの部分を繰り返して、合計で6-7層はあると思うけど。まあ深層って言ったほうが受けるだろうし画像認識よりは単純なタスクだから3層で済んだのか。

広告欄


やっつけタイムライン

広告欄

はてブ

人目の訪問です。

  • follow us in feedly

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

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






    Jenny Mayhem
2017年11月
      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技術注目記事

無料ブログはココログ