2018-11-30現在
CuPyをインストールするのにCUDAとかcuDNNとかWindowsだとVisual Studioとか大変だった方もいらっしゃると思いますが、 CuPyがcondaコマンドでインストールできるようになりました ということでWindows用も出来上がっているので、一利用者としてはもうAnaconda使うに限るっしょという感じです。バージョンちょっと旧くても良いし(2018-11-30現在だとChainer 4.5)、pipがどうとかインストールがどうとかどうでもよいけどNVIDIA積んでるからCuPy使いたいという方にAnaconda3はお勧めです。
ただ、
RTFM: CuPy 5.1.0 – Installation Guide
自動テスト通ってんのはUbuntu GNU/Linux 64bit LTS14.04/16.04とCentOS 7(64bit)だけだかんね。WindowsとかmacOSを含む他の環境でのCuPyは、動いてるように見えてもわしゃ知らんからね。
と書かれている(CuPy 5.1.0より前も同様)ので、テストの詳細はよくわかりませんが(オープンソースなんだから見ろという…)、機能まで含まれているとすると、違う環境で動作させようとしているまじめな良い子は
- 財布の紐のadminに相談、物で溢れ返っている人は空間デザイナーにも相談
- マルチブート
- クラウド, VPS,レンタルサーバ
等を駆使して、書かれているGNU/Linux環境を整えます。
この機械はWindowsゲーム用、まじめでもガチ勢でもないからこのままAnaconda3をインストールするくらいで、できるだけめんどいことしたくないけどCuPyは使いたいし、ということで進めます。
念のため CUDA GPUs の中からお持ちのGPUを探して、Compute Capabilityの数字を確認しておきます。Installing cuDNN に、必要なcompute capabilityが書かれて(ただ今だと3.0以上)います。
できればCuPyのパッケージとChainerのパッケージで相互に対応しているバージョンを見つけておくのと、Name列を見て特にCuPyのPythonのバージョン(py37とか)を確認しておく… pipでほげほげするのと違って気にするのはこれくらいです。同じOSで既存のAnaconda3がある場合はWindowsならAnaconda Promptで
1 2 |
conda search cupy conda search chainer |
他のCUDA関連も気になる方は
1 2 |
conda search cudatoolkit conda search cudnn |
です。
例えばCuPyやChainerパッケージにpy36はあるけどpy37が無いという場合で、Anaconda3のbase環境にCuPyをインストールしたい(つまりAnaconda3をCuPyとChainerのためにインストールしたいような)場合は、Anaconda3の最新ではなくてAnaconda installer archiveからbase環境のPythonが3.6であるAnaconda3-5.2.xをインストールする方が、py37パッケージの置き換えが発生しないのでシンプルに済みます。base環境ではなくて新規に専用のAnaconda内部の環境(以降ではlearn-ai環境)を作る場合は気にしないで大丈夫です。なんにせよまずはAnaconda3をインストールします。後でアンインストールする場合Windows版のアンインストーラは消しているファイルを律儀にLabelコントロールに表示、更新してくれて死ぬほどのろいので(修正されていなければ)、Uninstalling AnacondaのOption Bの通りanaconda-cleanをインストールして実行してからさらにAnaconda3フォルダをコマンドで消すという手順の方が早いはずです。
インストール後base環境をぶっ壊したくない、以降の作業をまとめて無かったことにできるようにしたい場合はAnaconda Promptで専用のlearn-ai環境を作ってしまいます。createのpython=3.xの部分はインストールしたいCuPyやChainerのパッケージが必要とする条件に応じて変更(例えばpy36までしかなければpython=3.6)、必要なければpython=3.xごとぶちとってOKです。最後のanacondaは最初にインストールしたAnacondaパッケージが同様に全部learn-ai環境にインストールされるので、不要な場合は書かないでpython=3.xまででOKです。
1 2 3 4 |
conda update --all conda create -n learn-ai python=3.x anaconda (お昼ご飯を食べに行く前にでも実行) conda install -n learn-ai pip conda update -n learn-ai --all |
pipはcreateの時点でインストールされるはずですが念のため。spyder-kernelsのバージョンの依存関係がなんかおかしくなったという場合は
1 |
conda update -n learn-ai anaconda |
とすると修正される場合がよくあります。
base環境にとくに思い入れもないからbase環境に突っ込んじゃお、という場合は上の作業と、その後の ‘-n learn-ai’ やAnaconda Promptではconda activate/deactivateが不要です。
先にNVIDIAのグラフィックスドライバーが古くないか確認しておきます。また自力でCUDAやcuDNNをインストールした方で混乱したくない方、他で使われていないから大丈夫な方は、コントロールパネルのプログラムのアンインストールからアンインストールしたのち C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA ごと消し去ってしまいます。
本題のCuPy, Chainerです。何回かやっていてpipでインストールしたことがある場合はcupy-cudaXXXが残っていないかpip list | find “cupy” とか fgrep とかで確認して事前に消しておきます。
1 2 3 |
conda activate -n learn-ai pip list | find "cupy" (pip list | fgrep cupy) pip uninstall cupy cupy-cudaXXX chainer |
インストールです。
1 2 |
conda remove -n learn-ai cupy conda install -n learn-ai cupy (おやつを食べに行く前にでも実行) |
GPUがちゃんと使われるかを簡単に確かめたいので、learn-ai環境に入って
1 2 3 4 5 6 7 8 9 |
conda activate learn-ai python >>> import cupy >>> cupy.__version__ '6.0.0' >>> cupy.cuda.Device(0).compute_capability 61 >>> cupy.cuda.cudnn.get_build_version() 7104 |
で、セットアップがおかしい場合はimport時にエラーになります。CUDAがどうとか、cuDNNがどうとか、WindowsだったらVisual Studioがどうとか考えないでよいので、本当にありがたいです。cuDNNが必要なのにエラーになる場合や、後ほどChainerに”cuDNN is not enabled”と警告される場合、cudatoolkitのバージョンを変えることで解消することがあるようです。
1 |
conda install -n learn-ai cudatoolkit=9 |
インストールされたCuPyに対応するChainerを確認して、さきほどconda searchなどで存在したバージョンをインストールします。
Chainer …
Chainer 5.3.0
Chainer 5.2.0
Chainer 5.1.0
Chainer 5.0.0
Chainer 4.5.0
=x.x.xはCuPyとChainerの対応に合わせて必要であれば指定。例えばCuPy 4.1.0がインストールされている場合はchainer=4とか。
1 2 |
conda remove -n learn-ai chainer conda install -n learn-ai chainer=x.x.x |
終わり。CuPyがちゃんと使われるかを確かめたいので、learn-ai環境に入って
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
conda activate learn-ai python >>> import chainer >>> chainer.__version__ '5.3.0' >>> chainer.print_runtime_info() Platform: Windows-10-10.0.17134-SP0 Chainer: 5.3.0 NumPy: 1.16.2 CuPy: CuPy Version : 6.0.0 CUDA Root : None CUDA Build Version : 9000 CUDA Driver Version : 10020 CUDA Runtime Version : 9000 cuDNN Build Version : 7104 cuDNN Version : 7600 NCCL Build Version : None NCCL Runtime Version : None |
で確認でき、CUDAやcuDNNが使われない場合はCuPyとChainerのバージョンの対応を再度確認します。どうにもうまくいかない場合用に文末にpipで進行する場合の簡単なメモを付けます。pipでほげほげした結果の一例はこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>> import chainer >>> chainer.print_runtime_info() Platform: Windows-10-10.0.17134-SP0 Chainer: 5.1.0 NumPy: 1.15.4 CuPy: CuPy Version : 5.1.0 CUDA Root : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0 CUDA Build Version : 10000 CUDA Driver Version : 10000 CUDA Runtime Version : 10000 cuDNN Build Version : 7301 cuDNN Version : 7301 NCCL Build Version : None iDeep: Not Available >>> quit() |
base環境に戻るには
1 |
conda deactivate |
です。必要なもの、好きなものもこの専用環境に足して行きます。
1 |
conda install -n learn-ai future |
conda createでanacondaを指定していない場合は基本的なものからいろいろ必要になると思います。
conda-forgeにあるものを自動的にインストールして欲しい場合はchannelの追加。
1 2 3 4 |
conda activate learn-ai conda config --env --append channels conda-forge conda install -n learn-ai install jsanimation pyglet ffmpeg conda deactivate |
Wheelしかないものは、上でインストールされたlearn-ai環境用のpipを使えば、専用のディレクトリを使ってくれます。
1 2 3 |
conda activate learn-ai pip install gym conda deactivate |
作成したlearn-ai環境を消すには
1 |
conda env remove -n learn-ai |
作成した環境一覧は
1 |
conda env list |
base環境のパッケージの更新はbase環境で
1 |
conda update --all |
作成したlearn-ai環境のパッケージの更新は
1 |
conda update -n learn-ai --all |
pipの一斉更新はめんどいですが適当にググればone-linerが出てくるはずです。
「リグ」と聞いてぴくっとしてしまう人には関係ない話ですが、GNU/Linuxなどの場合でX11にはIntelのCPU内蔵HDグラフィックスを使ってもらってNVIDIAは計算にだけ使いたいという場面でのxorg.confの例はこんな感じになります。lspciとxorg.confのPCI Bus IDとの対比はWhat is the format of a PCI Bus ID?に詳しく書かれています。
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 31 32 33 34 35 36 37 |
> lspci 00:02.0 Display controller: Intel Corporation HD Graphics 530 (rev 06) 01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1080] (rev a1) ------ #lspci -> bus:device.function Section "ServerLayout" Identifier "layout" Screen 0 "intel" Inactive "nvidia" # Screen 0 "nvidia" # Inactive "intel" EndSection Section "Device" Identifier "intel" Driver "intel" BusID "00:02:0" EndSection Section "Screen" Identifier "intel" Device "intel" EndSection Section "Device" Identifier "nvidia" Driver "nvidia" BusID "01:00:0" Option "AllowEmptyInitialConfiguration" EndSection #Section "Screen" # Identifier "nvidia" # Device "nvidia" #EndSection # end of file |
さらに唐突ですがheadless機をssh経由でWindowsのX serverにつないで使う場合はXmingでもVcXsrvでもよいですが、Cygwinでopenssh-clientと、Cygwin/Xに書かれたパッケージをインストールすれば、パッケージ管理がCygwin内で閉じるので便利です。
Windowsで[Start] -> Cygwin-X -> XLaunchで、Multiple Windows, Start no clientと進めるだけで、後述するようなOpenGLなどが使うGLXが絡まなければ特に気にすることもなくうまくいくと思います。
Xサーバを起動後、タスクトレイのX serverのアイコンにマウスカーソルを合わせるとDISPLAY環境変数に指定する値が分かる(通常:0.0)のでCygwin64 Terminalを起動し、
1 |
cygwin$ env DISPLAY=:0.0 ssh -Y -X -p ポート -i 秘密鍵 xxxxxxxx@133.xxx.xxx.xxx |
とか
1 2 |
cygwin$ DISPLAY=:0.0; export DISPLAY cygwin$ ssh -Y -X -D 1080 -L 18080:127.0.0.1:60000 -L 10000:127.0.0.1:40000 -L 18000:133.xxx.xxx.xxx:8000 -p ポート -i 秘密鍵 xxxxxxxx@133.xxx.xxx.xxx |
のように、Windows上のDISPLAYと-Xオプションを指定すればheadless機のログインシェルには自動的にDISPLAY環境変数が設定されてWindows上のXサーバまでフォワードされるので、ログイン後のシェルで例えばxeyesを実行すればWindows上に目玉が現れます。-Yは「信用してX11セキュリティ拡張を『取っ払って』ね」と伝えるオプションで、Cygwin/Xでは必要です。-Yが必要のないX serverを使った場合でも、後述のGLXを使う場合には必要になるようです。ssh_config, ~/.ssh/config にも ForwardX11Trusted は書かない、あるいは no を指定しておき、コマンドラインで-Yを指定するのが無難かと思います。
Windows 10付属のOpenSSHでも機能が殺されてなければ使えるんじゃないでしょうか。使ったことないですが、コマンドプロンプトから
1 2 |
set DISPLAY=:0.0 ssh ... |
で試してください。
headless側でOpenGLを使ったアプリケーションを実行させたい場合はWindows上のX serverを全部Exitさせたことを確認し、indirect GLXを許可するために今度はXLaunchのAdditional parameters for X serverの欄に +iglx と書きます(Xサーバオプション — +iglx 相当)。この状態でCuPy使いたいようなNVIDIA搭載機からheadless機にログインした後のシェルで次のようなコマンドを実行すると
1 2 3 4 5 |
headless$ glxinfo | fgrep OpenGL OpenGL vendor string: NVIDIA Corporation OpenGL renderer string: GeForce GTX 1080/PCIe/SSE2 OpenGL version string: 1.4 (4.6.0 NVIDIA 411.63) OpenGL extensions: |
のようになります。上の情報には表示されていませんがheadless機もNVIDIAでちょっと旧いXorgな場合はアプリケーションも
1 2 3 4 |
headless$ ldd `which glxgears` ... libGL.so.1 => /usr/lib/nvidia-410/libGL.so.1 (0x00002ac3e6ca3000) ... |
のようにNVIDIAのOpenGLを使うでしょうから双方NVIDIAとなり、いろいろ動作することとと思います。なお
1 2 |
headless$ glxinfo Error: couldn't find RGB GLX visual or fbconfig |
となってしまう場合はheadless側のドライバがわけわからんことになってると思われるので、今度は財布の紐ではなくてheadless機のadminに何とかしてもらいます。一方ちょっと旧いXorgだと
1 2 3 4 5 |
headless$ glxinfo | fgrep OpenGL OpenGL vendor string: Intel OpenGL renderer string: Intel(R) HD Graphics 5500 OpenGL version string: 1.4 (4.4.0 - Build 20.19.15.4963) OpenGL extensions: |
のように非NVIDIAなX serverと、先ほどのようなNVIDIAでちょっと旧いXorgを使っているheadless機をつないでglxgearsくらいは表示される場合でも、OpenGLの細かい実装や拡張機能の違いによりアプリケーションでエラーが起きることがあります。gymのexampleのCartPoleではPygletでGLExceptionが発生します。
1 2 3 4 |
headless$ python random_agent.py ... pyglet.gl.lib.GLException: b'invalid enumerant' ... |
workaroundとして、Windows上のX serverを全部Exitさせたことを確認してから今度はXLauncherでAdditional parameters for X serverの欄に +iglx とすると同時にNative OpenGLのチェックを外して(Xサーバオプション — +iglx -nowgl 相当)起動すると、そのX serverの情報は
1 2 3 4 5 |
headless$ glxinfo | fgrep OpenGL OpenGL vendor string: VMware, Inc. OpenGL renderer string: llvmpipe (LLVM 5.0, 256 bits) OpenGL version string: 1.4 (3.0 Mesa 18.0.5) OpenGL extensions: |
のようになり、この状態で、ちょっと旧いXorgを使っているheadless機がGNU/LinuxのようにLD_PRELOADが実装されているローダを使っているOSであれば、次のようにMesaのOpenGLライブラリを強制的にロードさせることで双方Mesaとなるので、動作するアプリケーションも増えるかと思います。
1 2 |
headless$ locate mesa | fgrep GL headless$ env LD_PRELOAD=/usr/lib/x86_64-linux-gnu/mesa/libGL.so python random_agent.py |
描画スピードが必要な場合はそもそもGLX使わない、ローカルで動かす、とかOS nativeのOpenGLアプリケーションにするということにて。
個人的には*BSD推しで、WindowsだとこうmacOSだとこうというworkaroundは避けて通りたいですが、それだとデスクトップクライアントでは生きるのがつらいという現実に押しつぶされています。
話を戻して最後に新しいChainerを使いたいからpipでやっていくという場合のメモです。時期や環境によってはいろいろはまると思います。GNU/LinuxはNVIDIAの言うとおりにやってはいけないのがrunスクリプトを走らせるというやつで、やっかいなことになりがちなのでUbuntu GNU/LinuxならばPPAを使うのが最短
1 2 3 4 |
sudo apt-add-repository ppa:graphics-drivers/ppa sudo apt-get update sudo apt-get upgrade sudo cp -p /etc/X11/xorg.conf /etc/X11/xorg.conf.backup |
してから
1 |
sudo ubuntu-drivers devices |
で出てくるrecommendedをインストール(後で依存関係によりバージョン下げられる場合もあります)。modprobeのブラックリストもinitrdの更新も勝手にやってくれます。
1 |
sudo apt-get install nvidia-4xx |
再起動。CUDAやcuDNNはNVIDIAに言われたとおり(runスクリプトを除く)の作業で通過します。cuDNNにもCUDA同様にレポジトリができていて、追加する場合はわざわざ手動で/etc/apt/sources.list.d/にファイルを書かなくてもレポジトリを追加するパッケージがあります。ここに書いてしまうとcuDNNの使用許諾のページをバイパスしてしまうので、…-repo-…debファイルがあるということだけ。WindowsのはまりどころはVisual Studioでしょうか。
必要条件は次のようになっています。
CuPy – Installatio Guide: …
CuPy 5.3.0 – Installation Guide
CuPy 5.2.0 – Installation Guide
CuPy 5.1.0 – Installation Guide
- CUDA Toolkit 8.0, 9.0, 9.1, and 10.0
- cuDNN v5, v5.1, v6, v7, v7.1, v7.2, v7.3 and v7.4
- Python 2.7.6+, 3.4.3+, 3.5.1+, 3.6.0+ and 3.7.0+
1 2 |
conda activate learn-ai pip search cupy |
で、出てくるcupy-cudaXXで動作すればラッキー。そのまま使います。出てきたバージョンのCuPyに対応したCUDA Toolkit y.z をインストール。GNU/Linuxは表示されるネットワークインストールの手順にそのまま従い、Windowsの場合はBase InstallerとPatch xを順番に全部。cuDNNやNCCLはこの時点では不要です。
1 2 3 4 |
conda remove -n learn-ai cupy chainer pip list | find "cupy-" (pip list | fgrep cupy-) pip uninstall cupy cupy-cudaXXX chainer pip install cupy-cudaXXX chainer |
終わり。
なんか動かないとう場合はCuPyはimportできるのであればChainerとのバージョンの対応を確認し、もう一度やってだめなら諦めてコンパイルへ行きます。続いてcuDNNをインストールします。cuDNN v.w.x for CUDA y.zのLibrariesをArchived cuDNN releasesより探して、GNU/Linuxであればパッケージをインストール、WindowsであれはCUDA y.zのディレクトリに展開します。
Windowsの場合Visual Studio Build Toolsから、すべてのダウンロードの+を展開しまくってBuild Tools for Visual Studioを探してインストールします。
1 2 |
conda activate learn-ai conda remove -n learn-ai cupy chainer |
WindowsだったらpipでインストールされるよりAnacondaにインストールしてほしいので先に
1 |
conda install -n learn-ai cudatoolkit cudnn mako pytools cython pycuda |
無けりゃ無いで。
1 2 3 |
pip list | find "cupy-" (pip list | fgrep cupy-) pip uninstall cupy cupy-cudaXXX chainer pip install --no-chache-dir cupy chainer |