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