TensorFlow - ikymrkw/pydepot GitHub Wiki

NVIDIA の GPU を使う

  • pip install tensorflow とする。print(tf.__version__) でバージョン確認。
    • 以前は tensorflow-gpu というパッケージが分かれていたが、今は tensorflow に統一されている
  • TensorFlowのGPUサポートのページを見て NVIDIA のドライバーやライブラリをインストールする
    • 無闇に最新バージョンを入れないこと! わざと古いバージョンを入れないと動かないことがある。
    • そのために Linux ディストロの公式パッケージではなく、NVIDIAが用意したパッケージを使うべき。
      • ただしドライバーは互換性が高くなっているので、公式パッケージで入れても良さそう。
    • 詳しくは下のエラー時の情報を見よ
  • 次のコードでGPUが使える状態になったか確認できる
    from tensorflow.python.client import device_lib
    print(device_lib.list_local_devices())
    
    こんなメッセージが出てきたら成功
    Created device /device:GPU:0 with 4621 MB memory:  -> device: 0, name: NVIDIA GeForce GTX 1660 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5
    ...
    name: "/device:GPU:0"
    device_type: "GPU"
    memory_limit: 4845731840
    locality {
      bus_id: 1
      links {
      }
    }
    

よくあるエラー

  • NUMA ノードエラー
    • there must be at least one NUMA node, so returning NUMA node zero が出た場合
    • これをする: https://gist.github.com/zrruziev/b93e1292bf2ee39284f834ec7397ee9f
      • OS側の問題で、 root 権限が必要
      lspci | grep -i nvidia  # => GPUデバイスのアドレスを確認。たとえば 01:00
      ls /sys/bus/pci/devices/  # => 0000:01:00.0 が存在することを確認
      cat /sys/bus/pci/devices/0000\:01\:00.0/numa_node  # => -1 が返されるはず
      sudo echo 0 | sudo tee -a /sys/bus/pci/devices/0000\:01\:00.0/numa_node
      cat /sys/bus/pci/devices/0000\:01\:00.0/numa_node  # => 0 が返されるはず
      
  • CUDA のバージョン違い
    • ドライバーと CUDA のバージョンが不整合、と言われる(nvidia-smi でもエラーが出る)
    • 2023年3月時点で CUDA の最新版は 12.1 だが、 Tensorflow は 11.2 のみ対応で、12.1 を入れても動かない。
      • libcudart.so.11 を要求する。ソースコードから自分でビルドすれば対処可能かもしれないが、少なくともビルド済みのバイナリパッケージを使う限りは動かない。
      • とはいえ、メジャーバージョンが 11 なら動きそうではある。CUDA 11.8 でも動きそうだった。
      • というのも、CUDA 11.2 は 2021年リリースだから、Ubuntu 22.04 LTS 用の deb は用意されておらず、そうせざるを得ない。
    • 古いバージョンのCUDAは CUDA Toolkit Archive から入手できる。
    • CUDA 11 をインストールしたのに不整合な場合は、CUDA のある場所が LD_LIBRARY_PATH に入っていないだけかもしれない。 Ubuntu で、NVIDIA からの deb を使った場合、/usr/local/cuda*/lib64 あたりにある。
  • libnvinfer.so.7, libnvinfer_plugin.so.7 がない
    • TensorRT が入っていない。これはオプションなので入れなくてもよい。
    • Tensorflow の GPUサポートのページには「TensorRT 6.0」と書いてあるが、*.so.7がないと言われる場合は TensorRT 7.x が必要。
    • TensorRT 6.x や 7.x の配布物 deb は Ubuntu 1604 や 1804 用のものしかないので、2004 や 2204 には入れられない。 7.2.3 を tar.gz から手動で入れても CUDA 11.1 や 11.2 が前提なので動かない(libnvrtc.so.11.1 を要求してくるが、上記のように CUDA 11.8 には含まれていない)。
  • libcudnn.so.8 がない
    • cuDNN が入っていない。
    • TF のページでは cuDNN 8.1.0 と指定されているが、 8.8.0 でも行けそう。CUDA 11.x に対応しているほうを入れること。