Translate

2017年12月19日火曜日

NVIDIA Docker のバージョンが上がり Docker Composeでも対応できるようになった件

たまたまAWSの x2.large 上にTensorFlow実行環境を作成しようと、
ひさしぶりにNVIDIA Dockerのサイトへ行ったら..



バージョン、上がっとるがな..


ということで、慌ててREADME.mdを勝手に翻訳してみた。
#参照の際は at your own risk でお願いします。

-----(2017/12/17時点の NVIDIA Docker README.md)-----
警告:このプロジェクトはアルファ版(libnvidia-container)をベースにしています。すでに1.0よりも安定していますが、テスト支援を必要としています。

ライセンス:New BSD
ドキュメント:wiki
パッケージ:リポジトリ



ドキュメント

完全なドキュメントおよびFAQは、(GitHubの)リポジトリWikiを参照してください。


クイックスタート

既に使用されているディストリビューション上にNVIDIAドライバサポートされているバージョンDockerがインストールされていることを確認してください(前提条件を参照)。

※翻訳時点の前提条件
  • カーネルバージョンが3.10より大きい GNU/Linux x86_64
  • 1.12以降のバージョンのDocker
  • Fermi(2.1)より後のアーキテクチャを実装したNVIDIA GPU
  • NVIDIA ドライバ 361.93 (古いドライバはテストしていません)

/etc/docker/daemon.json をカスタムしている場合は、 nvidia-docker2 パッケージがこのファイルを上書きする可能性があります。

Xenial x86_64

# nvidia-docker 1.0 がインストール済みの場合:
# nvidia-docker および既存のGPUコンテナをすべて削除する必要があります
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker

# パッケージ利己地鶏の追加
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

# nvidia-docker2 のインストールと Dokcer デーモン設定のリロード
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

# 最新の公式CUDAイメージ上で nvidia-smi を実行し正常動作を確認
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi


CentOS/RHEL 7 x86_64

# nvidia-docker 1.0 がインストール済みの場合:
# nvidia-docker および既存のGPUコンテナをすべて削除する必要があります
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo yum remove nvidia-docker

# パッケージ利己地鶏の追加
curl -s -L https://nvidia.github.io/nvidia-docker/centos7/x86_64/nvidia-docker.repo | \
  sudo tee /etc/yum.repos.d/nvidia-docker.repo

# nvidia-docker2 のインストールと Dokcer デーモン設定のリロード
sudo yum install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

# 最新の公式CUDAイメージ上で nvidia-smi を実行し正常動作を確認
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

その他のディストリビューション/アーキテクチャ

Wikiのインストール章を参照してください。

問題(Issue)および貢献

どんな変更を行う場合でも、事前に Contributor License Agreement の署名付きコピーを digits@nvidia.com へ提出する必要があります。
  • 新しい問題を提出してお知らせください
  • あなたは pull request を開くことによって貢献することができます
-----(2017/12/17時点の NVIDIA Docker README.md)-----


..ん?

docker run --runtime=nvidia って指定すれば
nvidia-docker コマンドでなくてもいいんだ..

ちょっと検索すると、次のブログ記事を見つけた

[WonderPlanet Tech Blog] nvidia-dockerをdocker-composeから使う
http://tech.wonderpla.net/entry/2017/11/14/110000

..いつのまに devices なんてセクションが
docker-compose.yml にかけるようになったんだ..

まあ、おかげでDocker Compose できるようになったし..

あと、公式ではないけど nvidia-docker-compose なるコマンドを
GitHub で公開しているヒトもいた。

nvidia-docker-compose
https://github.com/eywalker/nvidia-docker-compose




公式でもなさそうなのだけど、
興味があったのでREADME.mdを翻訳してみた。
#こちらもat your own risk でお願いします。

-----(2017/12/18時点の nvidia-docker-compose README.md)-----
nvidia-docker-compose とは、nvidia-docker で動作するGPU 対応の Docker コンテナが docker-compose で動作するようにラップする単純なPythonスクリプトです。

依存関係

nvidia-docker-compose は以下のパッケージを必要とします。
  • Docker Engine
  • nvidia-docker
以下で説明するインストール手順のなかで自動的にインストールされる、docker-composePyYAMLJinja2 python パッケージにも依存関係があります。

nvidia-docker-compose および nvidia-docker2

既にご存じの方もおられるとおもいますが、nvidia-docker2 リリースが動作するNVIDIAでは、Dockerインフラにより緊密に統合されています(詳細は、プロジェクトリポジトリ https://github.com/NVIDIA/nvidia-dockermaster ブランチを参照してください)。この新しい統合の大きな利点の一つは、GPU で docker-compose を起動するために nvidia-docker-compose を必要としないことです。nvidia-docker2docker-compose で動作させる方法は、Issue#23 を参照してください。
/etc/docker/daemon.json に以下のような記述をおこないます
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": [ ]
        }
    }
}

インストールする前に

nvidia-docker-composenvidia-docker が適切に機能するかどうかに依存しますが、とりわけ、nvidia-docker を実行すると自動的に作成される追加の Docker ボリュームに依存します。 nvidia-docker-compose をインストールして実行する前に、 nvidia-docker を少なくとも1回はテストして、すべてのボリュームが正しくセットアップされ、正しく機能していることを確認してください。特に、次のコマンドを実行することをお勧めします。
$ nvidia-docker run --rm nvidia/cuda nvidia-smi
使用可能なすべてのGPUがマシン上に正しく表示されている場合は、作業を進めます。 そうでない場合は、nvidia-docker-compose を使用する前にnvidia-docker のドキュメントを参照し、正しく機能することを確認してください。

インストール

スクリプトをインストールするには、次のコマンドを実行して下さい:
$ pip install nvidia-docker-compose
もし、システムが提供するPythonを使用しているのであれば、先頭に sudo を付けて実行する必要があります。

nvidia-docker-compose の利用

nvidia-docker-compose は、docker-compose のドロップイン代替コマンドです。 docker-compose と同じオプションで簡単に実行できます:
$ nvidia-docker-compose ...
システム構成に依存してsudoを付けて実行する必要があるかもしれません(i.e. dockerを実行する際にsudoを先頭につけている場合等)。
nvidia-docker-compose を実行すると、YAML型式設定ファイル nvidia-docker-compose.yml をローカルに作成します。nvidia-docker-comose 実行中にこのファイルを削除してもかまいません。Git リポジトリ内で .gitignore を使用している場合は、nvidia-docker-compose.yml をこのファイルに追加することをお勧めします。nvidia-docker-compose.yml が生成されたら、このファイルを使ってGPU対応のコンテナを標準の docker-compose コマンドでで起動することもできます。次のようにファイルを指定して実行してください:

$ docker-compose -f nvidia-docker-compose.yml ...

マルチGPUセットアップによる柔軟な実行

最初のGPUである /dev/nvidia0 などを選択して記述することによって、各コンテナに対するGPUの可視性を制御できます。ただし、手動でこれを行うことは、あなたが nvidia-docernvidia-docker-compose の機能を妨害する可能性があることを意味しており、 docker-compose.yml のどのサービスがどのGPUで実行すべきかを事前に指定する方法はありませんでした。これは、異なるマシンは異なる数のGPUを搭載している事実がさらに複雑にさせています、そしてこのため 2 GPU 搭載マシン上で devices セクションの下に /dev/nvidia4 と記述されたサービスを実行するとエラーが発生します。

GPUターゲットの指定

nvidia-docker-compose バージョン0.4.0から新たに devices ヘッダの下に /dev/nvidia* を含めることでGPUをサービスへ指定できるようになりました。次のように指定します
version: "2"
services
  process1:
    image: nvidia/cuda
    devices:
      - /dev/nvidia0
  process2:
    image: nvidia/cuda
    devices:
      - /dev/nvidia1
      - /dev/nvidia2
上記は、サービス process1 は最初のGPU( /dev/nvidia0 )のみを、サービス process2 は2番めと3番めのGPU ( /dev/nvidia1/dev/nvidia2 )をそれぞれ参照するように定義しています。devices セクションに /dev/nvidia* を指定しない場合は、これまでのバージョンの場合と同様にすべての有効なGPUが自動的に割り当てられます。

docker-compose.yml ファイルでJinja2 を使う

バージョン0.4.0からの新機能
ターゲットマシン上で利用可能なGPUの数と同じ数のコンテナコンテナを(同じ構成で)起動したいという比較的一般的な使用例をサポートするために、今度は nvidia-docker-compose にてJinja2の利用をサポートします。GPUターゲティングを指定する機能と組み合わせることで、GPUの可用性に柔軟性を持たせた docker-compose 設定を作成できるようになりました。次のテンプレートを準備し、docker-compose.yml.jinja として保存します:
version: "2"
services:
  {% for i in range(N_GPU) %}
  notebook{{i}}:
    image: eywalker/tensorflow:cuda
    ports:
      - "300{{i}}:8888"
    devices:
      - /dev/nvidia{{i}}
    volumes:
      - ./notebooks:/notebooks
  {% endfor %}
そして、このjinja2 テンプレートを -t / --template フラグをつけて指定し実行します:
$ nvidia-docker-compose --template docker-compose.yml.jinja ...
Jinja テンプレートを処理して、次のような docker-compose.yml へ展開します:
version: "2"
services:
  notebook0:
    image: eywalker/tensorflow:cuda
    ports:
      - "3000:8888"
    devices:
      - /dev/nvidia0
    volumes:
      - ./notebooks:/notebooks
  notebook1:
    image: eywalker/tensorflow:cuda
    ports:
      - "3001:8888"
    devices:
      - /dev/nvidia1
    volumes:
      - ./notebooks:/notebooks
  notebook2:
    image: eywalker/tensorflow:cuda
    ports:
      - "3002:8888"
    devices:
      - /dev/nvidia2
    volumes:
      - ./notebooks:/notebooks
上記は、3GPUマシンで実行、展開した例です。Jinja変数 N_GPU には自動的にシステム上の有効なGPU数が反映されます。この docker-compose.yml は次に nvidia-docker-compose によりほかの設定ファイルと同じように処理されGPUが使用可能なコンテナを起動します。

Composeファイルのみ生成する

GPU対応の Compose ファイルの作成だけおこない後でコンテナ起動したい場合は、-G / --generate フラグをつけて nvidia-docker-compose を実行すると、docker-compose を実行せずに作成ファイルを生成しただけで終了します。
$ nvidia-docker-compose -G ...

その他のコマンドラインオプション

代替の nvidia-docker-plugin ホストアドレスの指定や(デフォルトのnvidia-docker-compose.yml の代替として)代わりのターゲットの Docker Compose ファイルを指定などのようなその他の設定については、コマンドラインヘルプを参照してください:
$ nvidia-docker-compose -h

使い方

nvidia-docker-compose は、2つのアクションを実行するシンプルなPythonスクリプトです:
  • docker-compose 設定ファイル(デフォルトは docker-compose.yml)の構文を解釈して、GPUが有効なコンテナを実行するのに必要な設定がなされている新たなYAML型式の nvidia-docker-compose.yml を作成します。設定パラメータは nvidia-docker-plugins から読み込まれます。
  • 新たに生成された設定ファイル nvidia-docker-compose.yml docker-compose を実行します。
-----(2017/12/18時点の nvidia-docker-compose README.md)-----

ここまでやるとやり過ぎに見えるけど、
Jinjaテンプレートを使って
有効なGPU数を自動で展開して個別のDockerコンテナを作ってくれる
機能は便利だ..




..でもなあ..そろそろコンテナを
Docker Composeでなくて
Kubernetes で管理しようかなと
思ってたところなんだよなあ..

コンテナ貸しパブリックIaaSはこぞってKuberenetes使ってるし...

Docker Compose はそろそろオワコンかな..と思ってたところなんだよなあ..



p.s.

ちなみに..TensorFlowも1.4.1マイナーバージョンアップしてました..

0 件のコメント:

今頃、docker image ls と docker images ls の違いに気づく

Dockerを我流で学んで使いだして1年以上立つのだけど、 勉強が我流なだけに、たまにとんでもない「抜け」がでてくる.. 先日ふとローカルPC上のDockerイメージを一覧させようと以下のコマンドを実行してみた PS C:\Users\XXXXX> dock...