ディープラーニング環境構築のためのローレベルな基礎知識

昨今ディープラーニングはライブラリやサービスも非常に充実し、だれでも簡単に扱えるものになった。それこそGoogle Clabなどを使えば環境構築なしでも使えるようなサービスもある。ただ本格的に使ってみるとCUDAやらTensorFlowやら多くのソフトウェアを使っている都合上、といろいろなトラブルに出くわすことも多く、原因もわかりづらいものが多い。そこで普段気にすることの少ないHW(GPU)からフレームワーク(TensorFlow、pyTorchなど)まで何があるのかをまとめてみる。ちなみに以下のようなものがある。

GPU

まずはGPUGPUを何使っているかでほかのライブラリ等々何が使えるか決まってくる一番重要な箇所。GPUが古すぎるとフレームワークの最新バージョンが対応しておらず、バージョンを下げて対応することになる。じゃあ自分が持っているGPUが使えるのかを確認したい場合はCompute Capabilityを確認する。Compute Capabilityは以下のサイトで確認できる。

CUDA GPUs | NVIDIA Developer

Compute Capabilityによって何が違うかは以下のサイトで確認できる。

Programming Guide :: CUDA Toolkit Documentation

GPUが古い=Compute Capabilityが低いと使用できない機能があるため、フレームワークの最新バージョンが使えなかったりするのである。環境構築を行う場合には、まずGPUを確認しよう。 ちなみに大体のフレームワークはCUDAを使用しているので、NVIDIA社製GPUを使用する必要がある。

ドライバ

ドライバはハードウェアをOSが動かせるように橋渡しをするSW。一般的なドライバとの違いとしては、CUDAのバージョンにもかかわってくるので、使用するGPUとOSに合わせて最新のバージョンを入れておけば問題ない。

OS

忘れがちだがOSはここに入る。OSによって使える機能に制限があったりするので注意。例えばAMPはWindowsでは使えない。

Docker

Linuxを使用していて、Dockerを使用する場合、Docker runtimeはここに入る。勘違いされがちだがDockerはLinuxカーネル上で動いている。そのためカーネルはそのLinuxカーネルに合わせたコンテナを使用する必要がある。下記で説明するCUDAはコンテナの中にあるので、Dockerを使う場合、ホスト側にCUDAのインストールは必要ない。 ちなみにWindowsのDockerは、Windows OS上の仮想Linuxカーネルで動いており、HWに触れない位置にいるのでGPUが使用できない。

CUDA

CUDAはGPU上で計算を行うためのランタイムライブラリ。実際の計算やメモリ確保などはこのCUDAが行っているため、大体エラーが起きるのはここである。GPUが古い場合にはバージョンを下げる必要があるが、特に古くなければフレームワークに合わせてバージョンを選択する。

CUDAはカーネルと呼ばれる関数を数百、数千という単位で同時実行する。その際計算順序は不定であるため、ディープラーニングの計算ではわずかに計算結果が異なることがある。

cuDNN

cuDNNはCUDAを使用して畳み込みなどの計算を行うDNN(ディープニューラルネットワーク)向けのライブラリ。CUDAが汎用的なGPU操作のライブラリであり、cuDNNがディープラーニング用のライブラリである。cuDNNはCUDA-Xという様々なアプリケーション向けライブラリ群の一つである。

NVIDIA CUDA-X | NVIDIA Developer

フレームワーク

要となるところ。最初に決めるところでもある。決める順序としては以下のようなイメージ。

  1. GPU, OS
  2. フレームワーク
  3. その他(上記に合わせてインストール)

フレームワークは内部でCUDAを実行しているため、CUDAはフレームワークのバージョンにあったものを使用する必要がある。

フレームワークについては書いているときりがないので省略。