Ubuntu 18.04 で、NVIDIAのリポジトリを利用してtensorflow-gpu環境を構築するシンプルな方法

2021/12/19追記: より新しく確実な方法を書きましたので、そちらをご参照ください。これはもう古いです。こちら(Ubuntu 20.04 / 18.04 環境で CUDA 10.2, FSL 6.0.5, Tensorflow, PyTorch をセットアップする方法)になります。CUDA 10.2 ですが、他のバージョンにも容易に応用できる方法です。

Ubuntu 18.04で、ディープラーニング環境を構築したいと考えました。

いろいろネットの情報を得てトライしてみたのですが、苦戦しました。
しかし、トライしているうちに、いくつか大事なことがわかってきました。

ポイントは、以下のとおりです。

  • グラフィックボードのドライバーによって使えるCUDAのバージョンが異なる
  • まずいちばん大事なのはこれです。ドライバーが古いものしか対応していないと、対応するCUDAのバージョンも古くなります。

  • NVIDIAはリポジトリをdebファイルで配布しているので、それを使うのがよい
  • これから詳しく記載します。

  • カーネルはデフォルトのものを使う
  • カーネルを最新のものを追いかけるとCUDAは動かないという事象が起きます。Ubuntu 18.04では、標準が4.15、そしてHWEが4.18です。CUDAは、この2つのバージョン(標準とHWEカーネル)だけサポートします。詳しくは、NVIDIAのページをご覧ください。

これらのコツをつかんだら、再現性が高くセットアップすることができるようになりました。
Step by Stepで示します。

  • 搭載されているグラフィックボードを確認する
  • 最初にグラフィックボードの確認を行います。

    $ lspci | grep -i nvidia
    

    lspciの結果から大文字小文字の区別なく”nvidia”というキーワードが入っている情報を検索します。

    私の場合は、以下のような結果になりました。

    $ lspci | grep -i nvidia
    02:00.0 VGA compatible controller: NVIDIA Corporation Device 1f02 (rev a1)
    02:00.1 Audio device: NVIDIA Corporation Device 10f9 (rev a1)
    02:00.2 USB controller: NVIDIA Corporation Device 1ada (rev a1)
    02:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device 1adb (rev a1)
    

    これだと、型番がわかりません。

    このようなときは、以下のコマンドをタイプします。

    sudo update-pciids
    

    こうすると、情報がアップデートされます。

    再度トライします。

    $ lspci | grep -i nvidia
    02:00.0 VGA compatible controller: NVIDIA Corporation TU106 [GeForce RTX 2070] (rev a1)
    02:00.1 Audio device: NVIDIA Corporation TU106 High Definition Audio Controller (rev a1)
    02:00.2 USB controller: NVIDIA Corporation TU106 USB 3.1 Host Controller (rev a1)
    02:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU106 USB Type-C Port Policy Controller (rev a1)
    

    今度は、GeForce RTX2070が搭載されていることがわかります。

    このため、今後は、GeForce RTX2070に特化して進めていきます。

  • グラフィックボードに対応するドライバの確認
  • 今の場合、GeForce RTX2070なので、これに対応するドライバをNVIDIAのサイトから確認します。なお、ダウンロードは必要ありません。

    そうすると、今回の場合、バージョン430まで対応しているということがわかります。

  • CUDAのバージョンの確認
  • グラフィックボードの対応ドライバがわかった中、GPUを使って並列計算をすることのできるCUDAの対応バージョンを確認します。これがまず第一の関門です。CUDAはNVIDIAのドライバーによって使えるバージョンが定まってきます。対応表は、CUDAのリリースノートにあるTable 1.に記載があります。

    これを見ると、NVIDIAのバージョン418以上は、CUDA 10.1が使用できるようです。先程、RTX2070はドライバ430が対応ですから、CUDA 10.1を使うことにします。

  • NVIDIAが提供するリポジトリを追加
  • ここまでわかったところで、インストールの準備を進めます。一番てっとり早い方法は、NVIDIAが提供してくれているリポジトリを使うことです。ここで注意することは、これから入手する deb ファイルは、ソフトウェアではなく、リポジトリの情報のみだということです。私は最初そこに気づかずによくわからないと思っていました。apt install で、リポジトリを設定しているんだと思ってください。ここで、CUDAのリポジトリと機械学習ライブラリのリポジトリの2つを追加します。

    • CUDAリポジトリの検索
    • https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ から cuda-repo-*を探します。2019年7月22日現在、Ubuntu 18.04用のCUDA 10.1のリポジトリは、cuda-repo-ubuntu1804_10.1.105-1_amd64.debでした。

    • wgetでリポジトリのdebパッケージを取得
    • 以下で、CUDA 10.1のリポジトリのdebパッケージを取得します。

      wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.1.105-1_amd64.deb
      
    • CUDAリポジトリパッケージの設定
    • ソフトウェアのインストールと同様に、apt installでインストールします。

      sudo apt install ./cuda-repo-ubuntu1804_10.1.105-1_amd64.deb 
      

      そうすると、最後に以下のメッセージが表示されます。

      The public CUDA GPG key does not appear to be installed.
      To install the key, run this command:
      sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
      

      CUDAのパブリックGPGキーがないようだから、以下のコマンドでインストールしなさいと言われていますので、素直にそのままコピペします。

      sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
      Executing: /tmp/apt-key-gpghome.QAwYOQT14T/gpg.1.sh --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
      gpg: 鍵を'http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub'から要求
      gpg: 鍵F60F4B3D7FA2AF80: 公開鍵"cudatools <cudatools@nvidia.com>"をインポートしました
      gpg: 処理数の合計: 1
      gpg:               インポート: 1
      
    • リポジトリのアップデート
    • apt updateでリポジトリをアップデートします。

      sudo apt update
      
    • 機械学習リポジトリの検索
    • 次に、機械学習リポジトリを追加します。今度は、http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/から、nvidia-machine-learning-repo-ubuntu1804*を探します。2019年7月22日現在、nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.debでした。

      これも先程と同様にしてwgetで入手し、aptで追加します。

      wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
      sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
      sudo apt update
      
  • グラフィックドライバーのインストール
  • ubuntu-drivers というコマンドがとても便利で、上記のリポジトリ設定をした場合、このコマンドで、適切なグラフィックドライバを探すことができます。

    $ ubuntu-drivers devices
    == /sys/devices/pci0000:00/0000:00:01.1/0000:02:00.0 ==
    modalias : pci:v000010DEd00001F02sv000010DEsd000012FEbc03sc00i00
    vendor   : NVIDIA Corporation
    driver   : nvidia-driver-418 - third-party free recommended
    driver   : nvidia-driver-410 - third-party free
    driver   : xserver-xorg-video-nouveau - distro free builtin
    

    ここで、nvidia-driver-418 が recommended となっています。nvidia-430までが対応しているはずですが、ここでは、nvidia-418までしかインストールできなさそうです。しかし、上記Table 1.にあるように、バージョン418であれば、CUDA 10.1に対応できますので、このままいくことにします。

    recommendedとあるものは、以下のコマンドで自動でインストールできます。

    sudo ubuntu-drivers autoinstall
    

    これができたら、再起動します。

    reboot
    
  • グラフィックドライバーが使われれているか確認
  • nvidia-smi で、確認できます。

    nvidia-smi
    Tue Jul 23 20:29:38 2019       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 418.67       Driver Version: 418.67       CUDA Version: 10.1     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  GeForce RTX 2070    On   | 00000000:02:00.0  On |                  N/A |
    | 12%   45C    P8    10W / 175W |     58MiB /  7944MiB |     11%      Default |
    +-------------------------------+----------------------+----------------------+
                                                                                   
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |    0      1046      G   /usr/lib/xorg/Xorg                            56MiB |
    +-----------------------------------------------------------------------------+
    

    ここまで来るとあともう少しです。

  • CUDAとcuDNNのインストール
  • CUDAとDeep Neural Network LibraryであるcuDNNをインストールします。ポイントは、–no-install-recommends オプションを使って必要最低限のものだけインストールすることです。CUDAは cuda-10-1 とバージョンを明示します。

    sudo apt install --no-install-recommends cuda-10-1 libcudnn7 libcudnn7-dev
    
  • TensorRTのインストール
  • TensorRTは、tensorflowなどで使うDeep Learningモデルを、GPU上で高速に実行できるように最適化してくれるライブラリです。ここでも –no-install-recommends オプションを使います。

    sudo apt install --no-install-recommends libnvinfer5 libnvinfer-dev
    

    最後にkerasとtensorflowを導入します。

  • Python3関連パッケージのインストール
    • aptを使ったPython3関連パッケージのインストール
    • 以下で、Ubuntuで提供されているPython3関連パッケージをインストールします。

      sudo apt install build-essential pkg-config              \
              libopenblas-dev liblapack-dev libhdf5-serial-dev graphviz 
      sudo apt install python3-venv python3-pip python3-dev    \
              python3-tk      
      
    • pip3を使ったPython3パッケージのインストール
    • 以下で、pip3を使って、Python3系のDeep Learningに必要なパッケージをインストールします。ユーザー環境にいれることをおすすめします。

      pip3 install cmake numpy scipy matplotlib pyyaml \
              h5py pydot-ng opencv-python keras jupyter pillow \
              python-dateutil --user
      
    • Tensorflow-gpuのインストール
    • GPUを利用するtensorflowを使うために、以下をインストールします。

      pip3 install tensorflow-gpu --user
      

      これで準備は完了です。

  • Kerasのサンプルデータセットでのテスト
  • 最後にKerasのサンプルデータセットでテストします。

    git clone https://github.com/fchollet/keras
    cd keras/
    python3 examples/mnist_cnn.py
    

    別のターミナルでnvidia-smiを実行すると、実際に使われているかを確認できます。

    nvidia-smi -l 1 #1秒ごとにnvidia-smiを実行
    Tue Jul 23 20:52:17 2019       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 418.67       Driver Version: 418.67       CUDA Version: 10.1     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  GeForce RTX 2070    On   | 00000000:02:00.0  On |                  N/A |
    |  0%   43C    P8    12W / 175W |    161MiB /  7944MiB |      8%      Default |
    +-------------------------------+----------------------+----------------------+
                                                                                   
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |    0      1046      G   /usr/lib/xorg/Xorg                            56MiB |
    |    0      7604      C   python3                                       93MiB |
    +-----------------------------------------------------------------------------+
    

    GPUのプロセスに python3 があることから、python3 examples/mnist_cnn.pyがGPUを使っていることがわかります。

ここで紹介した方法は、GeForce RTX2070が搭載されているカスタムメイドのデスクトップと、Geforce MX150が搭載されているThinkPad T480sで実証しました。ともにできますので、かなりいい感じと思っています。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください