機械学習環境構築時の覚え書きです。
Dockerに慣れていないので、おかしいところがあればご指摘お願いします。
動機
UbuntuでGPUを使って機械学習をしたいが、ライブラリによって要求するCUDAとcuDNNのバージョンが違ってつらいのをDockerでどうにかしたい。
慣れたエディタ(PyCharm)からDockerの開発環境を使いたい。
やったこと
- グラボのドライバを入れる
- Dockerを入れる
- nvidia-dockerを入れる
- NVIDIAのDockerイメージをベースにDockerfileを書く
- DockerfileからDockerイメージを作る
- コンテナを立ち上げる
- 作業ディレクトリをマウントしてみる
- (おまけ) DockerコンテナをPyCharmのインタプリタにする
ホスト側の環境
- GTX 1080
- Ubuntu 16.04
- NVIDIA-SMI: 384.111
- Docker: 18.03
- nvidia-docker: 2.0.3
Docker側の環境
- CUDA 9.0
- cuDNN 7
- Python: 3.5.2
- tensorflow-gpu: 1.8.0
- keras: 2.1.6
グラボのドライバを入れる
下のNVIDIAのサイトでGPUに対応するドライバのバージョンを調べてインストールする。
Dockerを入れる
公式サイトを見ながらUbuntu用のDockerをインストールしました。
nvidia-dockerを入れる
DockerでGPUを扱うには、nvidia-dockerを使う必要があるらしいので、こちらもインストールします。
NVIDIAのDockerイメージをベースにDockerfileを書く
今回はCUDA9.0で構築したいので、下記のようなDockerfileになりました。
KerasとTensorflowとPythonをインストールしています。
FROM nvidia/cuda:9.0-cudnn7-runtime
RUN apt-get update
RUN apt-get -y install python3-pip curl
RUN pip3 install keras tensorflow-gpu
DockerfileからDockerイメージを作る
Dockerfileのあるディレクトリで以下を実行します。
mykerasimageは任意の名前です。
sudo nvidia-docker build -t mykerasimage .
しばらく時間がかかります。
終わったら以下のコマンドで確認します。
sudo docker images
コンテナを立ち上げる
nvidia-dockerを使ってコンテナを立ち上げます。
Docker上でGPUを正しく認識していることを確認します。
sudo nvidia-docker run mykerasimage nvidia-smi
作業ディレクトリをマウントしてみる
以下のコマンドでコンテナのbashに入ることができます。
nvidia-docker run -v ホスト側のマウントしたいディレクトリのパス:コンテナ内のマウントしたいディレクトリのパス -i -t mykerasimage /bin/bash
DockerコンテナをPyCharmのインタプリタにする
こちらを実行してユーザをDockerグループに追加して再起動してからでないと権限周りでエラーになりました。
こちらの画面でUnix socketを選択して問題なければ、好きなイメージをPythonのインタプリタとして使用できます。