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