Ubuntuにおいて、nvidia-docker2を用いて、Chainer用のGPU環境を分ける方法についてまとめます。

前提

  • PCにはNvidia製のGPUが搭載されている
  • OSはUbuntuである
  • プログラムはPythonによって記述されている
  • プログラム内ではChainerを用いている
  • プログラムによって、必要とされるCUDAやcuDNN、Chainerのバージョンが異なる

必要なソフトウェアのインストール方法

  1. Get Docker CE for Ubuntu | Docker Documentationに従って、Docker CEをインストールします。
  2. Install Docker Compose | Docker Documentationに従って、docker-composeをインストールします。
  3. Installation (version 2.0) · NVIDIA/nvidia-docker Wikiに従って、nvidia-docker2をインストールします。

環境作成方法

  1. ディレクトリを作成します。
  2. 作成したディレクトリに移動します。
  3. 動かしたいプログラムのrequrements.txt (Python Tips:ライブラリをまとめてインストールしたい - Life with Python参照) を配置します。
  4. TODO部のコメントに従って編集したDockerfileを作成します。

    #TODO: 以下の{}部を記述し、コメントアウトを解除 (タグ ({CUDAのバージョン}-cudnn{cuDNNのバージョン}-devel-ubuntu{Ubuntuのバージョン}) については、 https://hub.docker.com/r/nvidia/cuda/tags/ に該当するタグが存在するかを確認すると良い)
    #FROM nvidia/cuda:{CUDAのバージョン}-cudnn{cuDNNのバージョン}-devel-ubuntu{Ubuntuのバージョン}
    #MAINTAINER {作成者氏名} <{作成者メールアドレス}>
    
    #APTのリポジトリ情報を更新
    RUN apt update
    
    #APTで必要なパッケージをインストール
    #TODO: APTでインストールするパッケージがある場合、以下に追加
    RUN apt install -y --no-install-recommends unattended-upgrades \
    #                                          TODO: Pythonで日本語を処理する場合、以下のコメントアウトを解除
    #                                           language-pack-ja \
    #                                          TODO: Python2を使用する場合、以下のコメントアウトを解除
    #                                           python-setuptools \
    #                                           python-dev \
    #                                           python-pip
    #                                          TODO: Python3を使用する場合、以下のコメントアウトを解除
    #                                           python3-setuptools \
    #                                           python3-dev \
    #                                           python3-pip
    
    #セキュリティアップデートを適用
    RUN unattended-upgrades
    
    #APTのキャッシュをクリア
    RUN apt clean
    
    #pythonコマンドとpipコマンドのシンボリックリンクを作成
    #TODO: Python3を使用する場合、以下のコメントアウトを解除
    #RUN for c in python pip; \
    #    do \
    #        ln -s /usr/bin/${c}3 /usr/bin/${c}; \
    #    done
    
    #pipをアップデート
    RUN pip install --upgrade pip
    
    #必要なパッケージをpipでインストール
    COPY requirements.txt /
    RUN pip install -r requirements.txt
    
    #ホストでログインしているユーザーと同じユーザーを作成
    #TODO: 以下の{}部を記述し、コメントアウトを解除
    #RUN useradd -u {現在ホストでログインしているユーザーのユーザーID (『id -u ${USER}』コマンドで取得)} -o -m {現在ホストでログインしているユーザーのユーザー名}
    #RUN groupmod -g {現在ホストでログインしているユーザーのグループID (『id -g ${USER}』コマンドで取得)} {現在ホストでログインしているユーザーのユーザー名}
    
    #TODO: その他必要な処理を以下に記述
    
    #キャッシュや不必要なファイルを削除
    #TODO: 不必要なファイルがある場合、以下に追加
    RUN rm -rf /var/lib/apt/lists/* \
               /var/cache/apt/archives/* \
               .cache/pip/* \
               requirements.txt
    
  5. TODO部のコメントに従って編集したdocker-compose.ymlを作成します。

    docker-compose.yml
    version: '2.3'
    
    services:
      main:
        build: .
        runtime: nvidia
    #   TODO: 以下の{}部を記述し、コメントアウトを解除
    #    command: {実行コマンド}
    #    container_name: {コンテナ名 (自由に指定可能)}
    #    user: {現在ホストでログインしているユーザーのユーザー名}
    #    environment:
    #      - NVIDIA_VISIBLE_DEVICES={使用するGPUのID}
    #     TODO: Pythonで日本語を処理する場合、以下のコメントアウトを解除
    #      - LANG=ja_JP.UTF-8
    
  6. docker-compose buildコマンドを実行します。

実行方法

  1. 作成したディレクトリに移動します。
  2. docker-compose up -dコマンドを実行します。

実行ログ閲覧方法

  1. docker logs {コンテナ名}コマンドを実行します。

終了方法

  1. 作成したディレクトリに移動します。
  2. docker-compose stopコマンドを実行します。
  3. docker-compose rmコマンドを実行します。

補足

  • Python3を用いる場合、コンテナ内ではpythonでもpython3でも動作するようになっています。

参考文献

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.