DockerでMNIST
概要
nvidia-docker2 + Anaconda3で環境を作ってkerasでmnistしました.
環境
ubuntu16.04.5
TITAN V
前準備
dockerとnvidia-docker2をインストールします.
デフォルトランタイムをnvidiaにします.
Dockerfile
FROM nvidia/cuda:9.0-cudnn7-devel # apt RUN apt update RUN apt install -y bzip2 wget git # install Anaconda3 RUN wget -q https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh RUN touch .bashrc RUN bash Anaconda3-5.0.1-Linux-x86_64.sh -b ENV PATH $PATH:/root/anaconda3/bin # conda install RUN pip install tensorflow-gpu==1.12.0 RUN pip install keras # install mnist_sample RUN wget https://raw.githubusercontent.com/fchollet/keras/master/examples/mnist_cnn.py CMD ["python", "/mnist_cnn.py"]
壁
proxy問題
proxy環境下で作業を行なっていたのでありとあらゆるところでproxyが邪魔をしてきました.
docker pull
,apt
,wget
,pip
,果てはMNISTのデータダウンロードまで,地獄すぎる…
docker hubから持ってくる際のproxy設定
/etc/systemd/system/docker.service.d/http-proxy.conf
にプロキシの設定を書きました.
/etc/systemd/system/docker.service.d/docker.conf
にdnsの設定を書きました.
Dockerfileの中で通信する際のproxy設定
--build-arg
で外から渡す or ~/.docker/config.json
に書くのが良いようです.
config.json
に書きました.
aptは小文字のproxy環境変数を見てpipは大文字のproxy環境変数を見るっぽいんですがhttp_proxy
にもHTTP_PROXY
にも反映してくれるようです.すごい!
CUDA,tensorflow,ドライバあたりの依存関係
nvidia/cuda
hub.docker.com リンクからグラボ,ドライバにあった物を使います.
Anaconda3
ubuntu16.04でapt install python3-pip
するとpipが古くてpip install
できないみたいなエラーが発生しました.
そのほかkerasやらtensorflowやらの兼ね合いもありそうでvanilla pythonを入れるのがしんどそうだったのでAnaconda3を入れることにしました.
2019.6現在python3.7は安定板tensorflow-gpu1.13.1のサポート外で動かないのでAnaconda3でpython3.6の物をインストールしました.
pyenvでAnacondaをインストールするような記事もありましたがDockerでpyenv使うのもなーと思ったのでインストーラから入れました.
インストールの際bash -b
にしないとyes or noを入力しろと言われて進まないんですが-b
入れたらなぜ動くのかが分かりません.
pip install
tensorflow-gpu1.13.1はCUDA9.0に対応していないため12.0をインストールしています.
CUDA10.0にしろという話ですがグラフィックドライバのアップデートには良い思い出がないので避けました.
conda install
だと依存関係を勝手に解決してくれるせいで衝突が起きたのか動かなくなったのでpipにしました.
buildとrun
docker build -t mnist .
でビルドして
docker run --rm -it mnist
で実行できました.
雑感
ただでさえdockerの知識もOSの知識もないのにproxyが絡んできてつらかった…