初心者がディープラーニング用の環境構築で気を付けるべき点

#プロローグ
ディープラーニング実装歴3~4カ月ですが、ここまでにディープラーニング用の環境構築をするにあたって苦労したことを備忘も兼ねて、気を付ける点として共有したいと思います。Pythonを使って機械学習のアルゴリズムでデータ分析をしたことがあるけど、ディープラーニングに初めて手を出す、そして環境は自分で構築したいという方のご参考になればと思います。

私はKaggleのコンペに参戦する目的で、Google Compute Engineを使っています。コンペではLightGBMやXGboostなど決定木型のアルゴリズムがメジャーですが、どうしても差別化を図る、スコア向上をする最後の一押しでディープラーニングモデルをブレンド候補に使わないといけない場面や、コンペタスクの特性上ディープラーニングモデルの方が精度面で軍配が上がる場面が多くなることがあります。その為に環境構築をしようとなったのがきっかけです。環境構築の中で、経験者では当たり前になっている事が意外に教科書や初心者向けのサイトでは書かれておらず、自分なりに振り返って大事だなという事をまとめます。

なお、ディープラーニングの環境構築をするにあたって私は以下のような環境を使用しており、その前提で書いていますので、必ずしも全てに当てはまるわけではありません。
OS: Ubuntu 16.04
分析環境：Anaconda(2018.12)
使用言語：Python

早速ですが、気を付けるべき点を3つ挙げるとするなら、以下ではないかと思います。
基本的に環境構築でうまくいかないとき、私は紐解いていくとこれらが根本原因であることがほとんどですので、何か問題にぶち当たった時には立ち戻って見直すようにしています。

**①フレームワーク(TensorFlow, Chainer, Pytorchなど)毎にAnacondaの環境を分ける**
**②パッケージをインストールするときに、パッケージ間の依存性があるので順番を意識する**
**③エラーログをしっかり読む、エラーログで検索する**

慣れている方からすると当たり前ですが、私のような初心者にとっては意外に教科書や「XXしてみた」や「XXの実装方法」などのサイトにもあまり書かれておらず、いざ自分でデバッグしようとするとどこから手を付ければいいのか、何に気を付ければいいのか途方に暮れることがよくあります。

各々の都合で使用している環境が異なるので、個別具体的な事例を紹介しているサイトやエラーを調べる事で解決できない事もあり、結果的に気を付けるべきポイントを意識した上でデバッグしていった方が本質的にいいのではないかと思います。同時に、気を付けるべきポイントを意識して環境構築するとそもそも問題を未然に避けられると思います。

#①フレームワーク毎にAnacondaの環境を分ける
初めてディープラーニングをやる人は、大抵Tensorflowの実装から行うことが多いです。
また、Tensorflow(というかKeras)は自前でコーディングをすることが他のフレームワークより少なく、[初心者向き](https://blog.shikoan.com/resnet-multiple-framework/)ともいわれています。

このTensorflowの実装でまず当たるのが、使用しているPythonのバージョン問題です。
2019年8月現在、Tensorflowは[Python 3.6で実装した方が無難](https://qiita.com/ssl_ds_sps/items/1e7d246a08bd455930e1)とされています。
自分でそれまでPython3.7を使っていたので、何も知らずにDown Gradeしました。
結果もともと使用できていたnumpy, pandas, matplotlibのパスがおかしくなり使えない状況になりました。
**Pythonのバージョンや個別のパッケージで大きく依存性が異なる場合Anacondaの環境を分けて、パッケージのパスの衝突を事前に避けるべきです。**
環境を分ける際は、Anaconda Navigatorの「Enviroments」から直感的にできますし、コマンドライン上でも
`conda create --name env_name python=3.6`
とすれば、作成できます。もともと使用している環境に入っていたパッケージは改めて入れる必要があります。**また、Pythonのバージョン依存だけでなく、Tensorflow以外にChainerも使いたいとなった場合は、別の環境にすべきです。**

Kaggleをやる人の観点からすると、公開kernelでは丁寧にパッケージのインストールの部分までコードとして共有してくれることもありますが、環境依存は絶対にあるのでそのまま使わないことをお勧めします。少し面倒でも必要なフレームワークは自分なりに調べて、本来取るべき手順でインストールすべきです。

#②パッケージをインストールするときに、パッケージ間の依存性があるので順番を意識する
ディープラーニングのフレームワークは別のパッケージをラッピングしており、パッケージ間の依存性がある場合、本来必要なパッケージがあらかじめインストールされていても、順番を間違えると「パッケージをインストールしたのに、認識されない」という事になってしまいます。

例えば、Kaggleのコンペの途中で新たにChainerのフレームワークで、モデルを学習させたい、そしてCPUではなくあとからGPUを使いたいとなった時、依存性の問題でGPUが認識されない問題に当たりました。ChainerもGPUドライバーのcudaも問題なくインストールされているにもかかわらず、Chainerでcudaが認識されないことが起こりました。それも本来は、
1. cuda, cuDNNのインストール
2. cupyのインストール
3. Chainerのインストール
の手順で行うべきであるものが、先に③から行ったことで、①、②がうまくインストールされていても、うまく③が①、②でインストールしたものを認識できないことに由来しています。こうした依存性もフレームワークの公式ドキュメントでもっと大々的に強調してほしいとも思います。

ですから、インストールがうまくいっても、パッケージが認識されない問題は、表面的にはパスがおかしくなっている事に起因していますが、落ち着いて**本来の依存性に合った順番でインストールし直す事で解消されることが多いように思います。**パスが原因で本来いじるべきでない環境変数を下手にいじっていくと回復不可な状態になってしまうので、そういう場合は全部uninstallして、正しい順番でインストールし直してみるのをお勧めします。

#③エラーログをしっかり読む、エラーログで検索する
このテーマに限らず、基礎中の基礎です。上で説明した①、②はどちらかというと③でもうまくいかない時に立ち戻って意識することで、多くの事はエラーログをしっかり読んで、またはエラーをそのままコピーして検索することで解決できます。
そのままエラーログを読むだけではわからないことや、調べても直接的に解決につながらない場合がありますが、それでもそのあとの対応は、どれだけエラーログを読んでデバッグしたかの経験が大事になってくると思います。

#最後に
ディープラーニング用の環境構築の時に気を付ける点を自分の経験から共有させていただきましたが、いかがでしたでしょうか。もし他にも「ここに気を付けるべし！」などございましたら、ぜひコメントを頂戴できればと思います。