TensorFlowの勉強に必要なDocker導入サバイバルメモ
前回の記事でGoogleのTensorFlowで勉強を始めたことを書きましたが、これにあたっては、Pythonより前に、TensorFlowの学習環境が詰まったDockerイメージを動かすためのDocker環境を構築する必要がありました。Dockerについて、名前は聞いていたものの、使ったことがなかったので、今回初めて使いました。TensorFlowの勉強を始めたいがDockerは知らない人の参考になれば幸いです。
Dockerとは
コンテナ (起動が超速い)
VitualBoxやVagrantと、Dockerの特性の違いがよく分かっていなかったのですが、Dockerは、サーバ仮想化自体は不要です。DockerはLinuxマシン上で、ファイルシステムやプロセスID、ホスト名、ユーザ/グループなどを仮想化して隔離した環境「コンテナ」を提供するもの。このコンテナで動いているプロセスは、独立したLinux環境で動いているプロセスのように動作します。
実際、Dockerでコンテナを動作させると、コンテナの外でpsコマンドを実行すると、コンテナ内で動いているプロセスが見えます。このプロセスのPIDは通常のユーザプロセスと同様に1以外ですが、コンテナ環境内でpsコマンドでみると、同じプロセスがPID=1になっているように見えます。
VirtualBoxやVagrantでOSイメージを起動する場合は、それなりの時間がかかりますが、コンテナは、単にPIDなどの環境を仮想化してLinuxプロセスを起動するだけなので、一瞬で起動が完了します。
コンテナイメージの差分管理 (ストレージ量、転送量を削減)
コンテナで使うファイルシステムは、DebianやUbuntuなどのシステムイメージ(Read Only)をベースに、後から書き込んだ部分は差分として管理されています。つまり、ベースイメージはRead Onlyで、その上にWritableな層が重なる感じです:
ネット上のDockerイメージhubであるDocker hubでも、イメージが差分管理されており、Docker hubからコンテナイメージを取ってくる場合は、必要な差分のみが取得されます。つまり、あるコンテナイメージ(Aとします)がUbuntu 14.04(718MB)の上に300MBの差分を書き込んで作成されている場合、ローカルなリポジトリにUbuntu 14.04のコンテナイメージがあれば、差分である300MBのみを自動的にダウンロードしてコンテナイメージAが構築されます。
逆に、Ubuntu 14.04ベースに自前で構築したコンテナイメージをDocker hubにcommitする場合も、差分のみがアップロードされます。
WindowへのDockerの導入
詳しくはDockerのWindowsへの導入ガイドを見ていただくのが良いですが、基本的には、ダウンロードしてダブルクリックして、インストールするだけです。
DockerにはLinux環境が必要なので、Dockerのインストールでは、Windwos上でLinux環境を動かすための基盤としてVirtualBoxが自動的にインストールされます。既にVirtualBoxをイントール済みの場合は、インストールの途中で出てくる画面で、VirtualBoxのチェックボックスをOffにしておけば大丈夫です。
Docker関連のコマンドの一部はshスクリプトになっているため、上記に加え、shスクリプトの基盤としてgit bashも導入されます。
上記記載のLinux環境は、下記の図の「DOCKER_HOST」の部分になります。git bashは「クライアント」部分に相当します。
使い方(TensorFlowを使うのに必要な要点のみ)
Docker ToolboxのインストールでWindowsのデスクトップに追加されたアイコン「Docker Quickstart」をクリックすると、クライアントであるgit bashの画面が開き、まだDOCKER_HOSTが起動していない場合は、VitualBoxでHeadless起動し、起動完了後に、プロンプトが出ます。
なお、DOCKER_HOSTの割り当てメモリ量はVirtualBoxで確認できますが、1GBになっています。これを増やすには、こちらの記事を参照願います。TensorFlowを試すには、メモリ量の追加が必須です。
なお、TensorFlowのチュートリアルでは、下記コマンドでDockerコンテナを起動するように書かれていたので、Dockerをインストール後にDockerのドキュメントをほとんど見ずに、下記コマンドでコンテナを起動していろいろ試してました。
$ docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments:0.5.0
しかし、git bashの画面で"control-c"を打って、コンテナを止めたら、作業結果が全て失われていました。上記コマンドの、「-rm」オプションは、コンテナが止まったら差分データを破棄するというオプションでした。TensorFlowのチュートリアルは、一度に終わるわけではないので、「-rm」は付けずに起動してください。
また、メモリ量を増やしたり、名前を付けたほうが良いので、下記のように起動するのが良いです。(メモリ量は6GB、コンテナ名はtensorflowとした場合)
$ docker run -p 8888:8888 -it -m 6g --name tensorflow b.gcr.io/tensorflow-udacity/assignments:0.5.0
「-rm」オプションをつけなければ、一度起動したコンテナは、消すまでずっと保管されます。これを見るには、下記コマンドを使ってください。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 89d7c3554b2a itsukara/my-tensorflow-udacity:1.0 "/run_jupyter.sh" 10 hours ago Exited (137) 5 seconds ago tensorflow
すでに作られたコンテナを再起動するには、下記のようにします。なお、下記では、画面上に何も出さずに起動しています。
$ docker start tensorflow tensorflow
これを止めるには、下記のようにします。
$ docker stop tensorflow tensorflow
すでに動いているコンテナにログインするには、下記のようにします。TensorFlowを試すと、途中で非常に大きなファイルが作られるので、これを削除したりする際に、下記でログインすると良いです。ちなみに、「-it」オプションは、起動したプロセスとインタラクティブに接続するために必要です。
$ docker exec -it tensorflow /bin/bash root@89d7c3554b2a:/notebooks#
よく使いそうなコマンド一覧を下記に記載しました。詳細を見たい場合は「docker --help」「docker run --help」などのコマンドで確認願います。
docker run コンテナ名イメージ名 # 新たにコンテナを起動 docker start コンテナ名/コンテナID # 停止したコンテナを再起動 docier stop コンテナ名/コンテナID # 起動中のコンテナを停止 docker ps # 現在起動しているコンテナの一覧を見る docker ps -a # 既に停止したコンテナも含めて一覧を見る docker exec -it コンテナ名 bash # 起動中コンテナへの接続 docker rename コンテナ名/コンテナID 新コンテナ名 # コンテナ名変更 docker rm コンテナ名 # コンテナ削除 docker images # コンテナイメージ一覧表示 docker rmi コンテナイメージ名 # コンテナイメージ削除 docker logs コンテナ名/コンテナID # コンテナのログ表示 docker commit コンテナ名/コンテナID リボジトリ名 # リポジトリへの登録
参考
ちなみに、Windowsでは、DOCKER_HOSTの仮想イメージファイルは下記に作られます。最大20GBまで増えますので、Cドライブの容量が少ない方はご注意願います。(当方は13GBぐらいまで増えています)
C:\Users\ユーザ名\.docker\machine\machines\default <|| ** 補足