PaintsChainerをAmazon EC2で動かしてみた

ども、大瀧です。
PaintsChainerはディープラーニング技術であるニューラルネットワークのフレームワークChainerを利用した、線画像を着色するWebサービスです。ソース自体は公開されているので、NVIDIA製GPUを搭載した自前のマシンで手軽に試すことができます。

今回は、NVIDIA Tesla K80 GPUが使えるAmazon EC2 P2インスタンスのDockerコンテナ上で実行してみました。

動作確認環境

  • AWSリージョン : オレゴン
  • EC2インスタンスタイプ : p2.xlarge
  • AMI : amzn-ami-hvm-2016.09.1.20170119-x86_64-gp2 (ami-f173cc91)
  • Docker バージョン : 1.12.6
  • NVIDIA Driver バージョン : 375.26

1. ドライバとDockerのインストール

まずは、EC2からGPUを利用するためのNVIDIA Driverをインストールします。 ドライバのダウンロードページからx86_64向け最新バージョンのインストーラのリンクを確認し、EC2からwgetコマンドでダウンロード、インストーラを実行します。内部でドライバのビルドが走るため、あらかじめgccなどの開発ツールをインストールしておきましょう。

$ sudo yum groupinstall -y "Development Tools"
$ wget http://us.download.nvidia.com/XFree86/Linux-x86_64/375.26/NVIDIA-Linux-x86_64-375.26.run
$ chmod +x NVIDIA-Linux-x86_64-375.26.run
$ sudo ./NVIDIA-Linux-x86_64-375.26.run
  (端末のウィザードに従って操作)
$

Dockerもインストールしておきます。

$ sudo yum install -y docker
$ sudo service docker start

DockerからNVIDIA Driverを利用する方法はいくつかあるようですが、今回は手軽に試すことのできるNVIDIA Dockerを利用します。READMEのQuick Startに従い、nvidia-dockerコマンドをインストールします。

$ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0/nvidia-docker_1.0.0_amd64.tar.xz
$ sudo tar --strip-components=1 -C /usr/bin -xvf /tmp/nvidia-docker*.tar.xz && rm /tmp/nvidia-docker*.tar.xz
$ sudo -b nohup nvidia-docker-plugin > /tmp/nvidia-docker.log

nvidia/cudaコンテナに含まれ、GPUの使用状況を表示するnvidia-smiコマンドで動作確認してみます。

$ sudo nvidia-docker run --rm nvidia/cuda nvidia-smi
Using default tag: latest
latest: Pulling from nvidia/cuda
8aec416115fd: Pull complete
695f074e24e3: Pull complete
946d6c48c2a7: Pull complete
bc7277e579f0: Pull complete
2508cbcde94b: Pull complete
d5b3e99be78e: Pull complete
e1529bc8530d: Pull complete
b897e7b9b2c4: Pull complete
26139eb8a024: Pull complete
1a30613688a9: Pull complete
Digest: sha256:70eaf7c73a95cc3d29e73d73e470d8e44a3d6d6f639968ab86a1584cbb1d9fad
Status: Downloaded newer image for nvidia/cuda:latest
Thu Feb  2 05:30:03 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.26                 Driver Version: 375.26                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 0000:00:1E.0     Off |                    0 |
| N/A   28C    P8    29W / 149W |      0MiB / 11439MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
$

Tesla K80がきちんと認識されていることがわかりますね。DockerからGPUにアクセスできることを確認できました。

2. PaintsChainerの実行

PaintsChainerのGitHubページで紹介されている、非公式のDockerイメージliamjones/paintschainer-dockerを利用してみます。コンテナの実行はシンプルで、ポートバインドを指定すればOKです。今回は80番ポートにしました。

$ sudo nvidia-docker run -d -p 80:8000 liamjones/paintschainer-docker
Using default tag: latest
latest: Pulling from liamjones/paintschainer-docker
8aec416115fd: Already exists
695f074e24e3: Already exists
946d6c48c2a7: Already exists
bc7277e579f0: Already exists
2508cbcde94b: Already exists
d5b3e99be78e: Already exists
e1529bc8530d: Already exists
b897e7b9b2c4: Already exists
26139eb8a024: Already exists
1a30613688a9: Already exists
a673c64a1d72: Pull complete
6fa5e57a6535: Pull complete
fd671dce7f19: Pull complete
ad65100ed1af: Pull complete
0b9380920d3f: Pull complete
1e343c17d15d: Pull complete
821f43587c58: Pull complete
0ff90f8450b7: Pull complete
Digest: sha256:9ad2b5af060eef2242cdc76c452d1afc8429dc0ebdb5f398a3eb3c9fc77f2e10
Status: Downloaded newer image for liamjones/paintschainer-docker:latest
faf60c16121ce4682f4ca3cabdc14487b0cce3f92b3f3571f165a2f03c584479
$

WebブラウザでEC2のグローバルIPにアクセスしてみると。。。

PaintsChainer

PaintsChainerの画面が表示されました。Set sketchから線画をアップロードし、[Colorize]をクリックすると。。。

PaintsChainer2

めそ子さんが着色されました!
端末側で以下のようにnvidia-smiコマンドを実行すると、GPUが使用される様子を確認することもできます。

$ sudo nvidia-docker run --rm nvidia/cuda nvidia-smi -l 10
Thu Feb  2 06:02:38 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.26                 Driver Version: 375.26                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 0000:00:1E.0     Off |                    0 |
| N/A   37C    P0    68W / 149W |    903MiB / 11439MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
Thu Feb  2 06:02:48 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.26                 Driver Version: 375.26                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 0000:00:1E.0     Off |                    0 |
| N/A   37C    P0    96W / 149W |    903MiB / 11439MiB |     73%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
  :

まとめ

PaintsChainerをGPUを搭載するEC2のP2インスタンスで実行する様子をご紹介しました。ディープラーニングは用途やその凄さが実感しずらい技術だと思いますが、画像解析のようなわかりやすいユースケースが示され、しかもハードウェアを購入することなくクラウドで手軽に試せるのは素晴らしいですね。

参考URL