1. unnonouno

    No comment

    unnonouno
Changes in body
Source | HTML | Preview
@@ -3,21 +3,24 @@
*この内容には間違いが含まれている可能性があります。気付き次第更新します*
# 主な原因
-1. Cythonを使うようになりました。ソースの一部は.pyxファイルになり、.cppを生成して.soにビルドしています
+1. Cythonを使うようになりました。ソースの一部は.pyxファイルになり、.cppを生成して.soにビルドしています(1.5.1でcythonize済みの.cppファイルを同梱しています)
2. CUDAやcuDNNなどの共有ライブラリ(.soファイル)もCythonから使うようになりました。今までは、ctypesを使っていました。
3. h5pyなど、共有ライブラリを必要とするパッケージを利用するようになりました。
順に、何が問題になるのか説明します。
## Cythonの利用
Cythonは.pyxで記述したファイルを、.cppに変換(コンパイル)してから、.soファイルを作り、それを呼び出すことによって高速化するツールです。CuPyの速度が遅い理由の1つが、Pythonインタプリタが遅すぎることだったので、Cythonによる高速化が求められました。
まず、Cythonが必要になります。これはpipで勝手にインストールします。.cppができるということは、それをビルドするC++コンパイラが必要になります。これは、gcc(g++)や、WindowsならMSVCが必要になります。これらがない環境ではビルドができません。
+v1.5.1からCython済みの.cppファイルを同梱しているため、Chainer自体はCythonに依存しなくなりました。一方で、h5pyがCythonを要求するため、依然としてCythonが必要です。
+
+
## ctypesからCythonへ
外部の共有ライブラリを使うには、これらにアクセスする必要があります。今まではctypesというライブラリを使っていましたが、ctypesは動作が遅く、ここもまたボトルネックの一つになっていました。
ctypesは.so中のシンボルに直接アクセスします。つまり、.hファイル相当の情報がChainerの.pyソース中に暗に記述されていました。Cythonの場合は、.cppにして静的にビルドするため公式の.hファイルをインクルードして使う、ある意味正しい使い方になりました。一方で、v1.5では.hファイルの場所や.soファイルの場所が、 **インストール時** に指定する必要があります。そのため、インストール時にnvccにパスが通っていたり(そこからCUDAのディレクトリを逆算します)、cudnn.hやcudnn.soの場所がCPATHやLIBRARY_PATHで指定されている必要があります(cuDNNには公式のインストール先やインストーラがありません)。
また、CuPyのインストール後にCUDAやcuDNNを入れただければ動きません(ctypesの場合は、soファイルさえ見つけられればよかった)。そのため、これらの場所が変わったり、バージョンが上がってバイナリ互換性が崩れた場合は、再インストールの必要があります。
@@ -52,10 +55,19 @@
pip install -upgrade pip
```
してください。これは、h5pyのバージョンが上がると解消されるかもしれません。
+## setuptoolsを最新にする
+
+同様にsetuptoolsが古いと失敗することが有ります。
+
+```
+pip install -U setuptools
+```
+
+
## Cythonを先にインストールする
Cythonを使ったライブラリのインストールは、全体的に(?)失敗しやすくなっているようです。Cythonは利用時はもとより、インストール **時** に必要になります。.pyxファイルを.cppに変換する必要があるからです。
h5pyのsetup.pyに問題がある(?)ようで、masterブランチでは直っていますが、2.5.0では`setup_require`にCythonがありません。そのせいで、ビルド時にCythonを見つけられずに失敗することが有ります(何らかの要因でCythonの方が先に入って、成功することも有ります)。
先に、
@@ -64,11 +76,17 @@
```
すると解消される可能性があります。
## メモリが足りなくなる [未解決]
-原因がまだ特定されていませんが、複数の人からメモリが足りない旨のエラーがでると言われています。環境依存のようで、pipかsetuptoolsあたりのバージョンの問題ではないかと予想していますが、手元で再現していません
+Cythonのsetup.py中で無限ループが発生して、メモリがなくなることが原因と考えられています。Cythonを直接インストールするとこの問題が発生しないことが知られているので、直接入れると解決する可能性があります。
+
+```
+pip install -U cython
+```
+
+この発生原因は、まだ完全にはわかっていません。Chainerのsetup.pyがCythonに依存していると、先にCythonをアップグレードするためにCythonのソースを落としてきて、その中のsetup.pyを実行しようとしますが、setuptoolsはこのときに``eval``メソッドを使って実行するようです。そのために、一度importしたモジュールを開放してからsetup.pyの中身を``eval``しているようですが、そこで問題が発生しているように見えます。直接の原因は、同名のモジュールとクラスが混在した状態になって(reloadするまえのオブジェクトが、reload後のclassとisinstance関係ではなくなってしまうのと同じような状況)、unpickleできなくなって無限ループが発生する現象を確認していま
## sudoに気をつける
sudoは環境変数を引き継ぎません。そのため、一生懸命上記の環境変数をセットしたつもりが、sudoの中では無視されます。envコマンドを駆使するか、rootになって作業して下さい。
しかし、そもそも論として個人的にはpyenvなどでユーザー固有のPython環境を構築するか、`--user`オプションを付けてローカルにインストールすることをおすすめします(これはChainerに限った話ではないですが)。研究室などで勝手にアップデートすると、締め切り直前の先輩に怒られますよ。