Help us understand the problem. What is going on with this article?

Windows/Python3でpylearn2を使う

More than 5 years have passed since last update.

正直不可能だと思い始めていたが、なんとかできたのでその足跡を残す。PythonではできるだけWindowsを避けること、が真理ではある。

  • 事前準備
  • Theanoのインストール
  • pylearn2のインストール

事前準備

今回はMinicondaを利用して環境を構築する。これはバイナリライブラリの取得が楽だからだが、virtualenvでもWindowsバイナリを利用すれば同様に環境構築可能(この場合、Git shellで作業していれば後述のpylearn2インストール時の問題は発生しない)。

普段はバイナリ版でスキップする忌々しいvcvarsall.batエラーは今回不可避になるので、Visual Studioを入れるかWindows SDKを使うかしてコマンドを使えるようにしておく。

Visual Studioインストール後の設定
Python で “error: Unable to find vcvarsall.bat” が出た場合。

このためにVisual Studio?冗談じゃないという方のためにwindows SDKを利用する方法の参考。
sms tools in Windows

-----以下の準備は、libpythonをインストール(conda install libpython)すればOKのはず(念のため残しておく)。

Cコンパイルが避けられないのでMinGWをインストールする。インストール方法は以下が分かりやすいと思う。

MinGWのインストールと使い方(2014年版)
Windows に MinGW-w64 と MSYS を導入する

MSYSも必要なので導入しておく(勝手に入ってくれた気もするが・・・)。まずはgcc/g++を使えるようにする。

次に、定義ファイルを作成するためのコマンドgendefをインストールする。これは後々重要な役割を果たす。

gendef
Setting up a MinGW-w64 build environment/Setup Python for compilation of extensions

ソースをここから落としてきて、ディレクトリ上でコンパイルを仕掛ける。この作業はMSYSコンソールで行う必要がある(MSYSインストールディレクトリにあるmsys.batを実行すると立ち上がる)。

cd ~/gendef 
./configure --prefix=/mingw
make -j4 && make install

これでgendefコマンドが使用できることを確認。

-----(libpythonがあれば不要と思われる準備、ここまで)

後は、condaコマンドで環境を作成して準備完了(以下は最小構成。Theanoのテストを動かしてみたいならnose、またpylearnで画像系の処理を行いたい場合はPIL、SVMならscikit-learnなどが必要だが、これらは簡単に入れられるはず。詳細な依存は公式参照。)。

conda create -n my_learn numpy scipy cython libpython matplotlib ipython pip

activate my_learn (my_learnの名前はお好きに)で環境を有効化しておくのを忘れずに。これを忘れるとグローバルに入ってえらい目に合う。なお、pipを仮想環境に入れておくと、pip installを行ったときに仮想環境にのみインストールしてくれる。これでcondaとpipの併用が可能になるのだ。

Theanoのインストール

pip install Theanoで快適に行きたいところだが、pipでインストールできるバージョンではPython3がサポートされていないらしい(2014/11現在)ので最新版を使用する(インストール手順は公式も参照。ただ、実はうまくいかないけど、の注意書きが多い)。

以下のコマンドを実行するのだが、注意点が何点か。

pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git

※なお、git cloneからのpython setup.py developではpythonのソースを2to3で変更する処理が動かないので、うまくいかない。また、git://のプロトコルが使えない場合はここをhttps://にする。

pipバグ対応(1.5.6)

Windows上で発生するエラーがpipにあるので(1.5.6現在。ただ、修正は完了しているので時期リリースでは多分治る)、ソースを一部修正する。修正するファイルは、仮想環境に入れたpipのファイルということを忘れずに。Minicondaインストールディレクトリのenvsに作成した仮想環境のフォルダがあるので、そこのLib\site-packages\pip\util.pyを以下のように一時的に変更。

def rmtree_errorhandler(func, path, exc_info):
    """On Windows, the files in .svn are read-only, so when rmtree() tries to
    remove them, an exception is thrown.  We catch that here, remove the
    read-only attribute, and hopefully continue without problems."""
    exctype, value = exc_info[:2]
    if not ((exctype is WindowsError and value.args[0] == 5) or #others
            (exctype is OSError and value.args[0] == 13) or #python2.4
            (exctype is PermissionError and value.args[0] == 5) #python3.3
            ):
        pass #raise

exctype is PermissionError and value.args[3] == 5の箇所でエラーになるので、インデックスを修正しかつ例外をraiseを揉み消す。不要ファイルを削除するための処理のようだが、コメント化しても削除されるので問題ない。心配な場合C:\Users\xxxxxx\AppData\Local\Tempをチェックすること。

import theanoでのエラー対処

Theanoはimport時に走るコンパイルがあり(lazylinker)、これでしこたまエラーになるので対応を行う。

-----以下は、libpythonがインストールされている場合対応不要なはず(念のため残しておく)。

コンパイルのために、Python用の定義ファイルを作成する。仮想環境フォルダの直下で、以下を実行(pythonXX.dllのXXはバージョンにより読み替え)。

gendef pythonXX.dll
dlltool --as-flags=--64 -m i386:x86-64 -k --output-lib libpythonXX.a --input-def pythonXX.def

dlltoolコマンドの--as-flags=--64 -m i386:x86-64は64bit用なので、32bitの場合不要。
これでできたlibpythonXX.aファイルを、libsフォルダに移す(Libではないので注意。ヘッダーファイルが入っているフォルダ)。

そして、theanoの設定ファイルである.theanorc%USERPROFILE%フォルダに作成する(C:\Users\[your_user]直下)。

.theanorc
[blas]
ldflags = 

[gcc]
cxxflags = -shared -I[mingw installed folder]/include -L[conda env folder]/libs -lpython34

[mingw installed folder]はMinGWをインストールしたフォルダ、[conda env folder]は作成した仮想環境のフォルダになる。

詳細はこちらを参考。

Python:Installing Theano on Windows 64bit with Python 3

-----(libpythonがインストールされている場合対応不要なはずな処理、ここまで。)

これでimport theanoがつつがなく完了すれば第一段階OK。

pylearn2のインストール

pylearn2はもともとpipでインストールできないので、git cloneでとってきて使用する。
手順はこちらの通りだが、Windowsだとpylearn2/utils\_window_flip.c(2133) : warning C4013: 関数 'rand_r' は定義されていません。int 型の値を返す外部関数と見なします。の後failed with exit status 1120で落ちる。

これはWindowsでrand_rという関数が定義されていないために起こるが、実はこの対応は既にpylearn側で行われている。ただ、この修正の中の分岐がPython3ではうまく動かないので、ここをちょっと修正する。

pylearn2/utils/_window_flip.pyx
IF UNAME_SYSNAME == u"Windows":
    cdef extern from "stdlib.h":
        int rand()

UNAME_SYSNAME == "Windows"だと比較が上手くいかないようなので、これをユニコード文字列にして比較する(Python3では区別がなくなったはずだが・・・)。

最終的にimport pylearn2がエラーなくできれば完了。それと、以下の環境変数を設定しておく。

  • PYLEARN2_DATA_PATH : データの補完先
  • PYLEARN2_VIEWER_COMMAND : 画像データを表示する際のスクリプト。Windowsの場合以下を設定。
    start /wait %SystemRoot%\System32\rundll32.exe "%ProgramFiles%\Windows Photo Viewer\PhotoViewer.dll", ImageView_Fullscreen

セットアップは以上。お疲れ様でした。
※なお、これでimport pylearn2は通るようになりますがいろいろ動きません。こちらのマージをいましばらく待ちましょう。

icoxfog417
All my statements are from fun fancies, not a boring story that represents a company that I belonging to.
https://github.com/icoxfog417
tis
創業40年超のSIerです。
https://www.tis.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away