DeepLearning DockerCE - eiichiromomma/CVMLAB GitHub Wiki

(DeepLearning) DockerCE

Dockerのコンテナ上でGPUを使う方法。

マシンのセットアップから。 セットアップはDeepLearning-CUDAの方が新しい情報

起動

  • EtcherでBootable USBを作る
  • UEFIの起動画面からブート順をUSBが上位になるようにする
  • オンボードVGAがある場合は,そっちが表示されるようにする
    • 業者が気を効かせて外部GPUの表示をデフォルトにしている場合があるが,Display portのどれかしか表示しなかったりする地獄なので注意
    • オンボードが画面表示,Deep系は外部GPUと割り切ればGPUのメモリを多く使える

でUSBブートでインストール。

CUDA関係のインストール

CUDAのドライバーはcuda-driversを入れると楽。NVIDIAのCUDAダウンロードのところにコマンドが表示されるが,その最後をcuda-driversにする。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda-drivers
sudo shutdown -r now

Docker CE

注: nvidia-dockerはもう古いので解説サイトを調べるときに注意。

sudo apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker run hello-world

続けてNVIDIA Container Toolkitを入れる。ドキュメントの通り進める。

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

使い方も書いてある通り

sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

でnvidia-smiの結果が表示されれば成功。複数GPUがある場合は下記のように個別に使うGPUを指定できる。

### Start a GPU enabled container on two GPUs
sudo docker run --gpus 2 nvidia/cuda:9.0-base nvidia-smi

# Starting a GPU enabled container on specific GPUs
sudo docker run --gpus '"device=1,2"' nvidia/cuda:9.0-base nvidia-smi
sudo docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:9.0-base nvidia-smi


# Specifying a capability (graphics, compute, ...) for my container
# Note this is rarely if ever used this way
docker run --gpus all,capabilities=utility nvidia/cuda:9.0-base nvidia-smi

のようにnvidiaが用意したイメージを使えば,任意のバージョンのCUDAをコンテナごとに楽に分離して使える。 使用中の確認方法としては,当たり前だがnvidia-setupは表示に使っていなければエラーを返してくるので,nvidia-smiにGPUが表示されれば成功。

GUIも込みの使い方

ubuntu内で閉じているのであればxhost +をしてセッションを共有すれば簡単。

  • マウントするのは$HOME/dockermountフォルダで,コンテナの/mntにマウント
  • GPUは全部使用
  • Jupyter NotebookとTensorboardを使う設定
  • CUDA10.1, CUDNN7, Ubuntu18.04を使用
  • コンテナ名は cu10-u18

構築するときはrunコマンド

xhost +
sudo docker run --privileged=true --name cu10-u18 -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME/dockermount:/mnt --gpus all -it -p 8888:8888 -p 6006:6006 nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04

コンテナについてはcuda-cudnnの組合せが良さそうに見えるがOpenGLが必要な状況だと色々ハマるのでcudagl を使うと良い。

xhost +
sudo docker run --privileged=true --name cu11-u18-gl -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME/dockermount:/mnt --gpus all -it -p 8888:8888 -p 6006:6006 nvidia/cudagl:11.1-devel-ubuntu18.04

としておいて,コンテナ内でlibcudnn?-devを入れれば良い でcontainerの中で↓を実行して環境構築する

AnacondaでPython 3.7を仮想環境で使う例(Pythonのバージョンを変えたい場合は仮想環境にした方が楽)

apt update; apt install -y wget git ttf-mscorefonts-installer vim xserver-xorg mesa-utils xvfb python3-opengl libcudnn8-dev xkb-data
wget https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh
sh Anaconda3-2020.11-Linux-x86_64.sh
source ~/.bashrc
conda create -n keraspy37 python=3.7 numpy scipy pillow=6.2.1 matplotlib tensorflow-gpu keras jupyter ipython

でセットアップ完了。そのまま使いたいときは

conda activate keraspy37
cd /mnt; jupyter notebook --no-browser --allow-root --ip=0.0.0.0

でターミナルにトークン付きのURLが表示されるので右クリックしてOpen LinkでJupyter notebookが使える。作業をしてexitで終了する。

再開するときは startコマンド。

sudo docker start -i cu10-u18

でコンテナ内で

conda activate keraspy37
cd /mnt; jupyter notebook --no-browser --allow-root --ip=0.0.0.0

Tensorboard等,別途プロセスを走らせたいときは^zで中断してbgコマンドでバックグラウンドにしてしまうか,

sudo docker exec -it cu10-u18 /bin/bash

としてbashを起動すればよい。

OpenAI Gym環境の例(OpenGL)

コンテナの中で

apt update; apt install -y mesa-utils
glxgear

で歯車がグルグル回るウィンドウが出ればGLが使えている状態。(ESCで終了)

apt update; apt install -y wget git ttf-mscorefonts-installer vim python3-opengl xkb-data
wget https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh
sh Anaconda3-2020.11-Linux-x86_64.sh
source ~/.bashrc
conda create -n gympy36 -y python=3.6 numpy scipy matplotlib pillow=6.2.1 tensorflow-gpu keras pydot jupyter ipython pytorch-gpu torchvision
conda activate gympy36
pip install gym

で構築完了。ipythonを起動して

import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
    observation = env.reset()
    for t in range(1000):
        env.render()
        print(observation)
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
        if done:
            print("Episode finished after {} timesteps".format(t+1))
            break
env.close()

を実行してCartPoleのウィンドウが出てくれば成功。エラーが出る場合はUbuntuごと再起動かけると直る。(直す方法は分かったので深追いせず)

Ubuntu依存の話(Deep Learning無関係)

Chrome リモート デスクトップ (18.04以上)

メインサイトをUbuntuで開いてドライバー入れる。リモートのブラウザから上記URLでマシンを開くとウィンドウが1つだけ表示されるので,Ubuntuを選ぶとリモートデスクトップ用の新しいセッションになる。セッションはリモートデスクトップのブラウザタブを閉じても維持されるので,物理マシンと同じ画面を使うよりも便利なので推奨。

VNCを使ったリモートデスクトップ

Ubuntu側(ローカル利用を推奨)

  • 画面の共有設定で,パスワードを要求にチェック
gsettings set org.gnome.Vino require-encryption false

を実行して暗号化を解除。あとは適当なVNCクライアントで接続

時刻の設定

ntpへのリクエストはsystemd-timesyncdがやってるらしい。/etc/systemd/timesyncd.confを開いてNTP=のところにntpdのIPなりアドレスを書く。あとはデーモンを再起動

sudo systemctl restart systemd-timesyncd.service