仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Jujuで構築するKubernetesでGPUを使うには(2)手書き文字解析編

tech.virtualtech.jp

今回は前回構築したKubernetes GPU環境でMNISTを動かしてみます。 MNISTは手書き文字を解析するサンプルプログラムです。

これを実現する方法はいくつかありますが、前回予告した通り、Chainerを使って実行してみます。

Podを作成するにあたって、Docker Hubに上げられたChainerイメージを使います。

Python2ベースのイメージとして「chainer/chainer:latest-python2」、Python3ベースのイメージとして「chainer/chainer:latest-python3」が存在します。今回はPython3ベースのイメージを使いますが、必要に応じて好きな方を設定してください。

YAMLは次のように記述したものを使います。

apiVersion: v1
kind: Pod
metadata:
  name: chainer
spec:
  restartPolicy: OnFailure
  containers:
    - name: chainer
      image: chainer/chainer:latest-python3
      tty: true

      resources:
        limits:
          nvidia.com/gpu: 1

次のように実行して、Podを作成します。

$ kubectl create -f chainer-gpupod.yml
pod "chainer" created
(Podを作成)

$ kubectl get -f chainer-gpupod.yml
NAME      READY     STATUS              RESTARTS   AGE
chainer   0/1       ContainerCreating   0          5s

$ kubectl get -w -f chainer-gpupod.yml
NAME      READY     STATUS              RESTARTS   AGE
chainer   0/1       ContainerCreating   0          11s
chainer   1/1       Running   0         25s
^C
(ステータスを確認)

シェルにログインしてみます。後で必要なので、wgetパッケージをインストールしておきます。

$ kubectl exec -it chainer bash
root@chainer:/#
(シェルにログインできた)

root@chainer:/# apt update && apt install wget
(wgetパッケージのインストール)

Pythonモジュールがインストールされていることを確認しましょう。Python 2版の場合はpip2、Python 3版の場合はpip3コマンドでlistを出力してみます。

root@chainer:~# pip3 list
chainer (5.0.0a1)
cupy-cuda80 (5.0.0a1)
fastrlock (0.3)
filelock (3.0.4)
numpy (1.14.3)
pip (8.1.1)
protobuf (3.5.2.post1)
setuptools (20.7.0)
six (1.11.0)
wheel (0.29.0)

念のため、現在インストールされているバージョンと同じソースコードをダウンロードしてみます。

root@chainer:~# wget https://github.com/chainer/chainer/archive/v5.0.0a1.tar.gz
root@chainer:~# tar zvxf v5.0.0a1.tar.gz

まずは次のように実行して、CPUモードで画像解析を実行してみます。

root@chainer:~# python3 chainer-5.0.0a1/examples/mnist/train_mnist.py
GPU: -1
# unit: 1000
# Minibatch-size: 100
# epoch: 20

Downloading from http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz...
/usr/local/lib/python3.5/dist-packages/chainer/training/extensions/plot_report.py:25: UserWarning: matplotlib is not installed on your environment, so nothing will be plotted at this time. Please install matplotlib to plot figures.

  $ pip install matplotlib

  warnings.warn('matplotlib is not installed on your environment, '
epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
     total [##................................................]  4.17%
this epoch [#########################################.........] 83.33%
       500 iter, 0 epoch / 20 epochs
    40.105 iters/sec. Estimated time to finish: 0:05:07.333278.
...
epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.192088    0.104656              0.942283       0.9655                    15.9014
2           0.0761355   0.083492              0.976633       0.9748                    34.297
3           0.0481078   0.0801713             0.984583       0.9774                    53.7614
4           0.0363545   0.0682803             0.988733       0.9803                    73.6677
5           0.0281913   0.0679281             0.990517       0.9819                    95.086
6           0.0233321   0.0992965             0.99245        0.9767                    116.134
7           0.0247206   0.0955383             0.992033       0.9757                    136.834
8           0.0157767   0.0864075             0.99495        0.9811                    158.071
9           0.0165213   0.0684731             0.995          0.983                     179.839
10          0.0147778   0.0693633             0.994833       0.9853                    202.334
11          0.0119251   0.0902634             0.995933       0.9821                    225.362
12          0.0139303   0.0877024             0.995683       0.9818                    248.44
13          0.0111728   0.0823854             0.996633       0.9838                    272.442
14          0.0146516   0.0914885             0.995267       0.9821                    297
15          0.00734373  0.0916999             0.997867       0.9829                    322.92
16          0.00987204  0.116907              0.997133       0.9797                    351.075
17          0.0141462   0.117645              0.995867       0.9775                    377.785
18          0.0121944   0.0804133             0.996233       0.985                     405.164
19          0.00477812  0.0914235             0.99845        0.9846                    433.902
20          0.0133259   0.123587              0.9963         0.9789                    463.388

CPUモードでは解析に要する時間は当然ながら、CPUの性能に依存します。5分程度かかりそうと予測されています。 では次に、GPUを使って解析をしてみます。

root@chainer:~# python3 chainer-5.0.0a1/examples/mnist/train_mnist.py -g0
...
Estimated time to finish: 0:00:56.929975.
...
epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.187311    0.0982425             0.943567       0.9681                    13.1751
2           0.0729037   0.0750831             0.977232       0.9768                    16.2432
3           0.0483815   0.0741541             0.984315       0.9775                    19.2818
4           0.0348181   0.0726876             0.988632       0.9792                    22.3202
5           0.0310322   0.0824915             0.989898       0.9777                    25.5088
6           0.0235344   0.0737441             0.991981       0.9814                    28.4955
7           0.0192432   0.0733679             0.993332       0.9824                    31.5288
8           0.0189031   0.0744087             0.993933       0.9831                    34.5434
9           0.016433    0.0905501             0.994599       0.9788                    37.5528
10          0.0141957   0.0850642             0.995566       0.9817                    40.6166
11          0.0151095   0.0771753             0.995232       0.9826                    43.6603
12          0.0112923   0.0848214             0.996215       0.9812                    46.7101
13          0.0148123   0.0836868             0.995183       0.9825                    49.7578
14          0.00946035  0.0908514             0.996815       0.9837                    52.992
15          0.0118137   0.103228              0.996298       0.9798                    56.034
16          0.0105525   0.100688              0.996932       0.9814                    59.044
17          0.00669109  0.105021              0.998333       0.9819                    62.0895
18          0.0142701   0.0929249             0.996015       0.9833                    65.0944
19          0.00628928  0.0943469             0.997999       0.9837                    68.124
20          0.00698401  0.0944361             0.997782       0.9826                    71.1269

手元の環境では1分以下、つまりCPUで行ったときの1/5の時間で解析できることがわかります。 GPUを使う事でデータ解析を短縮できることが確認できました。

Jujuを使えばKubernetesの環境の構築や、KubernetesでGPUを使う構成も簡単です。 ぜひお試しください。また、お手伝いできる事があればお問い合わせください。