cuda

nvidia社のGPUを使ってプログラムを書きたいときはCUDAというソフトウェア実行環境を使わないといけない。 cudaの中には、cudaプログラム用のコンパイラー(nvcc)とか、その他ライブラリ、APIも入っている。pythonのtensorflowやpytorchも内部的にはcudaの ライブラリを使っている。そのため、pythonでtensorflowを使う時、cudaのインストールが必要となる。

cuDNN

実はcuda以外にもtensorflowを実行するときに必要なライブラリがあって、それがcuDNN. cudaはgpuを使ったプログラミング全般に関する実行環境である。そのため、デフォルトでDL用のライブラリは入っていない。cuDNNはcudaで書かれたDL用のライブラリである。cuDNNを入れることでGPUで簡単にDLが可能となる。その辺分けるのめんどいから統合してほしいだけども。

nvidia-driver

GPUのドライバ。ドライバはハードウェアとのやり取りをするソフト。

singularity

コンテナ型仮想環境。 仮想化してくれる範囲だけど、カーネル以外は全部仮想化してくれる。 つまり、ハードに直接干渉しないソフトであれば、全部singularity内で管理してOKってこと。

singularity上でtensorflowを使ってDLをする方法

  1. 互換性の確認 上で説明したcuda,cuDNN,nvidia-driverは全部互換性がある。その確認を最初にやるべき。

  2. nvidia-driverのインストール ubuntuだったら、

sudo apt install nvidia-driver-450

とかでインストールできる。

  1. singularityコマンドでdocker hubからtensorflowの最新イメージを持ってくる。
sudo singularity build tensorflow.sif docker://tensorflow/tensorflow:latest-gpu-jupyter

コマンドでdockerからコンテナイメージを持ってきてsifファイルをビルドしてくれる。docker->singualrityへの変換は勝手にやってくれる。 ちなみに、jupyterも入っている。singularityには二つのコンテナ型仮想環境が用意されている。sifとsandbox. sifはあとから、apt-get install 等で 新しくファイルをインストールすることが不可能なので、一番最初のビルドの時に必要なソフトすべてをインストールしておく必要がある。 一方,sandboxは環境の変更が可能だが、gpuが使えない。基本的にgpu目的で使っているのでsandboxを使うことなはいかな。 持ってきたコンテナイメージにはcudaが入っている。cuDNNは見つけられないけど、入っているのかな? ドライバーは物理環境のドライバーを共有する。

今回起こっている問題

singularity上でtensorflowを使って学習しているのだが、以下のエラーがでてGPUを使った学習がされない。

2022-10-15 18:03:49.665516: E tensorflow/stream_executor/cuda/cuda_driver.cc:265] failed call to cuInit: UNKNOWN ERROR (34)
2022-10-15 18:03:49.665581: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: hoge
2022-10-15 18:03:49.665602: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: hoge
2022-10-15 18:03:49.665709: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:200] libcuda reported version is: NOT_FOUND: was unable to find libcuda.so DSO loaded into this program
2022-10-15 18:03:49.665746: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:204] kernel reported version is: 520.61.5
2022-10-15 18:03:49.665954: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.

これについて、物理環境のnvidia-driverはバージョン520。一方、dockerハブから持ってきた最新のイメージに入っているcudaのバージョンが11-2。 nvidia-driver-520はcuda11-8しかサポートしていないとのこと。つまり、not compatibleだね。 これは間違いです。nvidia-driverは後方互換性があり、基本的に古いcudaのversionは全部サポートしています。

解決策

~~ 物理環境のnvidia-driverバージョンをcuda11-2がサポートされている450に下げるのが一番簡単そう。 dockerハブにcuda11-8のイメージがあればいいのだけど、最新のでも11-2っぽいので仕方なさそう。 ~~ はい、結局、cuda-tool-kitをダウンロードしました。あと、これ結構大事なんだけど、singularityコマンドでコンテナを起動するとき、GPUを使いたい場合は–nvオプションを付けると思うが、どこでこのオプションを付けるかがめちゃくちゃ大事だということです。

singualrity shell --nv tensorflow.sif

上の例だとちゃんと起動するが、

singularity shell tensorflow.sif --nv

これだとうまくいかないことがある。