CuPy, Chainer をAnaconda3で使う インフラ気にしたくない、Windowsでお気楽にCUDA, cuDNN使いたい

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で

他のCUDA関連も気になる方は

です。

例えば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です。

pipはcreateの時点でインストールされるはずですが念のため。spyder-kernelsのバージョンの依存関係がなんかおかしくなったという場合は

とすると修正される場合がよくあります。

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 とかで確認して事前に消しておきます。

インストールです。

GPUがちゃんと使われるかを簡単に確かめたいので、learn-ai環境に入って

で、セットアップがおかしい場合はimport時にエラーになります。CUDAがどうとか、cuDNNがどうとか、WindowsだったらVisual Studioがどうとか考えないでよいので、本当にありがたいです。cuDNNが必要なのにエラーになる場合や、後ほどChainerに”cuDNN is not enabled”と警告される場合、cudatoolkitのバージョンを変えることで解消することがあるようです。

インストールされた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とか。

終わり。CuPyがちゃんと使われるかを確かめたいので、learn-ai環境に入って

で確認でき、CUDAやcuDNNが使われない場合はCuPyとChainerのバージョンの対応を再度確認します。どうにもうまくいかない場合用に文末にpipで進行する場合の簡単なメモを付けます。pipでほげほげした結果の一例はこんな感じです。

base環境に戻るには

です。必要なもの、好きなものもこの専用環境に足して行きます。

conda createでanacondaを指定していない場合は基本的なものからいろいろ必要になると思います。

conda-forgeにあるものを自動的にインストールして欲しい場合はchannelの追加。

Wheelしかないものは、上でインストールされたlearn-ai環境用のpipを使えば、専用のディレクトリを使ってくれます。

作成したlearn-ai環境を消すには

作成した環境一覧は

base環境のパッケージの更新はbase環境で

作成したlearn-ai環境のパッケージの更新は

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?に詳しく書かれています。


さらに唐突ですが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を起動し、

とか

のように、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でも機能が殺されてなければ使えるんじゃないでしょうか。使ったことないですが、コマンドプロンプトから

で試してください。

headless側でOpenGLを使ったアプリケーションを実行させたい場合はWindows上のX serverを全部Exitさせたことを確認し、indirect GLXを許可するために今度はXLaunchのAdditional parameters for X serverの欄に +iglx と書きます(Xサーバオプション — +iglx 相当)。この状態でCuPy使いたいようなNVIDIA搭載機からheadless機にログインした後のシェルで次のようなコマンドを実行すると

のようになります。上の情報には表示されていませんがheadless機もNVIDIAでちょっと旧いXorgな場合はアプリケーションも

のようにNVIDIAのOpenGLを使うでしょうから双方NVIDIAとなり、いろいろ動作することとと思います。なお

となってしまう場合はheadless側のドライバがわけわからんことになってると思われるので、今度は財布の紐ではなくてheadless機のadminに何とかしてもらいます。一方ちょっと旧いXorgだと

のように非NVIDIAなX serverと、先ほどのようなNVIDIAでちょっと旧いXorgを使っているheadless機をつないでglxgearsくらいは表示される場合でも、OpenGLの細かい実装や拡張機能の違いによりアプリケーションでエラーが起きることがあります。gymのexampleのCartPoleではPygletでGLExceptionが発生します。

workaroundとして、Windows上のX serverを全部Exitさせたことを確認してから今度はXLauncherでAdditional parameters for X serverの欄に +iglx とすると同時にNative OpenGLのチェックを外して(Xサーバオプション — +iglx -nowgl 相当)起動すると、そのX serverの情報は

のようになり、この状態で、ちょっと旧いXorgを使っているheadless機がGNU/LinuxのようにLD_PRELOADが実装されているローダを使っているOSであれば、次のようにMesaのOpenGLライブラリを強制的にロードさせることで双方Mesaとなるので、動作するアプリケーションも増えるかと思います。

描画スピードが必要な場合はそもそもGLX使わない、ローカルで動かす、とかOS nativeのOpenGLアプリケーションにするということにて。

個人的には*BSD推しで、WindowsだとこうmacOSだとこうというworkaroundは避けて通りたいですが、それだとデスクトップクライアントでは生きるのがつらいという現実に押しつぶされています。


話を戻して最後に新しいChainerを使いたいからpipでやっていくという場合のメモです。時期や環境によってはいろいろはまると思います。GNU/LinuxはNVIDIAの言うとおりにやってはいけないのがrunスクリプトを走らせるというやつで、やっかいなことになりがちなのでUbuntu GNU/LinuxならばPPAを使うのが最短

してから

で出てくるrecommendedをインストール(後で依存関係によりバージョン下げられる場合もあります)。modprobeのブラックリストもinitrdの更新も勝手にやってくれます。

再起動。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+

で、出てくるcupy-cudaXXで動作すればラッキー。そのまま使います。出てきたバージョンのCuPyに対応したCUDA Toolkit y.z をインストール。GNU/Linuxは表示されるネットワークインストールの手順にそのまま従い、Windowsの場合はBase InstallerとPatch xを順番に全部。cuDNNやNCCLはこの時点では不要です。

終わり。

なんか動かないとう場合は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を探してインストールします。

WindowsだったらpipでインストールされるよりAnacondaにインストールしてほしいので先に

無けりゃ無いで。

コメントを残す

メールアドレスが公開されることはありません。