今回は前回構築した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を使う構成も簡単です。 ぜひお試しください。また、お手伝いできる事があればお問い合わせください。