読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



TheanoをWindowsにインストール

Deep Learning 機械学習 Theano

Deep Learningを実装するのによく使われるTheanoというPythonライブラリをWindowsマシンにインストールしたのでそのときの記録。ただ使うだけだったらPythonとnumpy/scipyをインストールした後にpip installs Theanoで普通に使えていた。実際、GPUが貧弱なMacbook Airではこの方法でインストールしていた。今回、PCを買い替えた(2015/1/19)こともあって、NVIDIA社のGPUを使って高速演算できるようにしてみたというわけ。私のマシンは、

OS : Windows 8.1 64bit
GPU: NVIDIA GeForce GTX 760 Ti OEM

という環境。Theano TutorialにもWindowsへのインストール方法は載っているけどはっきり言ってよくわからない。いろいろ調べていたところ以下の記事が自信満々で手順が充実していたので参考にした。

python - Installing theano on Windows 8 with GPU enabled - Stack Overflow

Visual Studio Community 2013をインストール

http://www.microsoft.com/ja-jp/dev/products/community.aspx

最新のVisual Studio Community 2013をインストールする。ライセンスは要注意。個人開発者なら無償利用できる。VSを入れて、日本語言語パックをインストールする直前にWindows Updateでアップデートしておくとよいみたい。日本語言語パックを入れただけでは日本語にならずオプションで設定を変える必要がある。この記事が参考になった。システムの環境変数PATHにC:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin;を追加しておく。

CUDA Toolkitをインストール

NVIDIAのサイト CUDA 7.5 Downloads からCUDA Toolkitをダウンロードする。CUDAに対応しているビデオカードがないと使えない。自分のビデオカードが対応しているかはここで確認できる。GeForce GTX 760は対応しているみたい。Tiがついているのがないのでやや不安だけど・・・私はデスクトップマシンなのでDesktopの64bitをダウンロード。インストーラにしたがってインストールする。Visual Studio 2013のヘルプを見るとCUDAの機能が追加されたのがわかる。

インストールが終わったらコマンドプロンプトを起動し、

cd C:\ProgramData\NVIDIA Corporation\CUDA Samples\v6.5\bin\win64\Release
deviceQuery.exe

を実行するとCUDAの情報が表示される。ProgramDataは隠しディレクトリなので注意。最後にResult = PASSが表示されていればインストール成功!

(注)このときは6.5が最新だったが7.0がリリースされている

(注)CUDA 7.0の場合はdeviceQuery.exeは自動的にできない。1_UtilitiesにVisual Studioのプロジェクトファイルがあるので自分でビルドすると上の場所(6.5でなく7.0)に実行ファイルができる。

Pythonをインストール

Python、numpy、scipyをインストールする。Pythonは2.7.9を選択。まだ3系を使う気にはなれない・・・Windowsなら全部バイナリで入れたほうが楽だね。64bitマシンだけどPythonは32bitを入れた。

最後にC:\Python27;C:\Python27\Scripts;を環境変数PATHに追加。

余裕があるならnumpyとscipyにatlasを使うとさらに早くなるかも。これはまたあとで試そう。

(2015/7/24追記)64bit版のPythonの場合はこちらの記事が参考になる。公式のnumpy、scipyは32bitにしか対応していないみたい。ここの非公式版を入れる必要がある。

(2015/7/24追記)numpy、scipy、pycuda(後述)、theano(後述)は全部ここからwhlファイルをダウンロードしてpipでインストールすると時間の節約になる。matplotlib、scikit-learn、pandas、pillow(PIL) なんかもそろっているので簡単に入れられる。

(2015/7/24追記)Python2.7.10で試したらimport theano時にlibpython27.aのundefined reference errorが大量に表示された。Python2.7.9だと起きない。謎だ。

MinGWをインストール

http://www.mingw.org/

いらないかもしれないけどadaとobjc以外をすべてインストールしておく。この記事が参考になった。久しぶりにMinGWを入れたけどGUIのインストーラがついたんだね。最後にC:\MinGW\bin;C:\MinGW\msys\1.0;を環境変数PATHに追加。

(注)64bit環境でそろえるならmingw-w64を入れる

Cygwinをインストール

https://www.cygwin.com/

もしかしたらいらないかもしれないけど。TheanoはGithubからソースをダウンロードしてインストールするのでgitはインストールしておく。最後にC:\cygwin\bin;を環境変数PATHに追加。

Cygwinに何かの拍子でpythonがインストールされてしまうことがあり、WindowsのPythonではなく、/usr/bin/pythonが使われるといろいろ面倒くさい。.bash_profileexport PATH=/cygdrive/c/Python27:$PATHを追加し、つねにWindowsのPythonが優先されるようにしておく。

Python distutilsの修正

C:\Python27\Lib\distutils\msvc9compiler.pyを開いて641行目あたりを下のように修正。MANIFESTの1行だけ追加する。

                ld_args.append ('/IMPLIB:' + implib_file)
                ld_args.append('/MANIFEST')

これは何のために必要な修正かわからなかったので元ファイルのバックアップを推奨。もしかしたらPyCUDAのコンパイルに必要なのかな?

PyCUDAをインストール

CUDA ToolkitをPythonから動かすPyCUDAライブラリをインストール。元記事ではソースからコンパイルしているけどどうしてもできなかったのでバイナリをインストール。バイナリは

http://www.lfd.uci.edu/~gohlke/pythonlibs/

にある。Python2.7の32bit版をインストールしたのpycuda‑2014.1+cuda6514‑cp27‑none‑win32.whlをダウンロード。whl形式のファイルをインストールするにはpipを使う。

pip install pycuda‑2014.1+cuda6514‑cp27‑none‑win32.whl

(注)CUDA7.0をインストールした場合はpycuda-2015.1.2を入れる。

以下のサンプルで動作確認。

# from: http://documen.tician.de/pycuda/tutorial.html
import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
import numpy
a_gpu = gpuarray.to_gpu(numpy.random.randn(4,4).astype(numpy.float32))
a_doubled = (2*a_gpu).get()
print a_doubled
print a_gpu

こんなのが出力される。乱数なので実行するたびに結果は変わる。

[[-0.06662463  0.63219547  2.9402144  -3.22129011]
 [-2.22378063 -1.05216527  3.22402525  1.18233967]
 [ 0.89209527 -1.18591869  0.09169154 -0.02648566]
 [-1.0123651  -0.06864624  1.37346625  1.98764777]]
[[-0.03331231  0.31609774  1.4701072  -1.61064506]
 [-1.11189032 -0.52608263  1.61201262  0.59116983]
 [ 0.44604763 -0.59295934  0.04584577 -0.01324283]
 [-0.50618255 -0.03432312  0.68673313  0.99382389]]

Theanoをインストール

ようやくTheano!Cygwinのターミナルからgitでインストールする。

git clone git://github.com/Theano/Theano.git
python setup.py install

何のエラーも出ずにすんなりインストールできた。GPUを使う場合は、$HOME/.theanorc.txtのファイルを作成し、以下の設定を書く。

#!sh
[global]
device = gpu
floatX = float32

[nvcc]
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
# flags=-m32 # we have this hard coded for now

[blas]
ldflags =
# ldflags = -lopenblas # placeholder for openblas support

(注)64bit環境でimport theanoしたときにlibpython27.a関係のエラーが表示される場合はlibpython27.aを作り直す必要がある (1) C:\WINDOWS\System32\python27.dllC:\Python27\libsにコピー (2) gendef python27.dll (gendefと次のdlltoolはともにmingwのコマンド) (3) dlltool --dllname python27.dll --def python27.def --output-lib libpython27.a

Theanoの動作確認

以下のPythonスクリプトを書いて実行。どうもCygwinのターミナルからはエラーが出て実行できないときがある(実行できるときもある)。MinGWのminttyだとOK。なぜかはよくわからない。

from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print f.maker.fgraph.toposort()
t0 = time.time()
for i in xrange(iters):
    r = f()
t1 = time.time()
print 'Looping %d times took' % iters, t1 - t0, 'seconds'
print 'Result is', r
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print 'Used the cpu'
else:
    print 'Used the gpu'

GPUが使われていると下のようにビデオカードの名前とUsed the gpuという出力が出る。

$ python theano_sample.py
Using gpu device 0: GeForce GTX 760 Ti OEM
[GpuElemwise{exp,no_inplace}(<CudaNdarrayType(float32, vector)>), HostFromGpu(GpuElemwise{exp,no_inplace}.0)]
Looping 1000 times took 0.811000108719 seconds
Result is [ 1.23178029  1.61879349  1.52278066 ...,  2.20771813  2.29967761
  1.62323296]
Used the gpu

CPUとGPUのパフォーマンス比較

device = cpuにしてGPUを使わないようにすると

$ python theano_sample.py
[Elemwise{exp,no_inplace}(<TensorType(float64, vector)>)]
Looping 1000 times took 9.76800012589 seconds
Result is [ 1.23178032  1.61879341  1.52278065 ...,  2.20771815  2.29967753
  1.62323285]
Used the cpu

という出力になる。Used the cpuになっている。実行時間を比較するとCPUの場合9.768秒に対し、GPUだと0.811秒なのでGPUを使うことで約12倍早くなっている。これはすごい!苦労したかいがあったね。