Itsukaraの日記

最新IT技術を勉強・実践中。最近はDeep Learningに注力。

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になっているように見えます。

VirtualBoxVagrantでOSイメージを起動する場合は、それなりの時間がかかりますが、コンテナは、単にPIDなどの環境を仮想化してLinuxプロセスを起動するだけなので、一瞬で起動が完了します。

コンテナイメージの差分管理 (ストレージ量、転送量を削減)

コンテナで使うファイルシステムは、DebianUbuntuなどのシステムイメージ(Read Only)をベースに、後から書き込んだ部分は差分として管理されています。つまり、ベースイメージはRead Onlyで、その上にWritableな層が重なる感じです:

https://www.docker.com/sites/default/files/products/what_is_layered_filesystems_sm.png

ネット上の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は「クライアント」部分に相当します。
http://docs.docker.jp/_images/architecture.png

使い方(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
<||

** 補足