概要
本エントリーは、早くシンギュラリティが実現して、生理食塩の水槽に脳ミソ一つでプカプカ浮かびながら、無限大の時間と空間を飛び回りたいと望んでいる筆者のポエムです。
#ディープラーニング
「シンギュラリティ = 超AI」ということで、まずは流行りのディープラーニングを実際に動かして体験してみようということで、前回のシリーズでは自作マシン7年前に3Dオンラインゲーム用に組んだマシンに最新GPUをぶち込んだりして、ローカル環境でディープラーニングしてみることにトライしました。
前回エントリーはこちら:https://qiita.com/fs-shinji-tomiyama/items/1b3343e9861b3bbc07b3
本エントリはシリーズの続編になります。
#Webサービスの公開に挑戦
前回は、ローカル環境で画像認識などを動作させ、トレーニングや推論中のGPUの消費電力をのアップを見ながら、一人ほくそ笑むという行為でした。
この喜びをみんなに分かち合いたいということで、実際にWebサービスとして動かしてみようという試みです。
#公開されているディープラーニングサービスを物色
サービス公開といってもゼロベースから作成するとなると、どれだけ時間がかかるかわかりません。
しかし、今の時代、ここQiita、Githubに行けばサンプルになるプログラムがゴロゴロしてるだろうということで物色を開始。
ところが、ローカルで動作するサンプルは沢山あるのですが、以外とWebサービスとして動くものは、以外と少ないです。
有名どころでは、ディープラーニング萌えキャラを自動生成してくれるMakeGirlsMoe https://github.com/makegirlsmoe があるのですが、こちらJSでゴリゴリで敷居がちと高い。
公表当時はもっとシンプルな印象だったので自分でも動かしたいと考えていましたが、注目を浴びて以来かなりのアップデートが発生していて目標としている年内にサービスを公開するという裏目標をクリアできそうにない。
仕方がないので、Google先生で色々検索していて、手頃な物を見つけました。
#つくってみよう!高火力コンピューティングでオリジナルAIサービス
はい。今回の試みにはぴったりなレベルのサービスです。
NVIDIAのデバイスドライバの利用規約の改悪問題で旬な話題のさくらインターネットさんが、GPU搭載の高火力サーバーのサンプルとしてblogで公開している画像認識サービスです。
筆者のGPUは、まさにライセンスの対象となっているGTX1080Tiですが、自宅鯖で動作させているので、ライセンスに抵触することはないです。が、これはこれで憂慮すべき問題です。
横道にそれますが、ご興味がある方は、こちらのリンクをご参照ください。
https://wirelesswire.jp/2017/12/62658/
#構築
構築手順は基本ブログに記載されている内容を元に実行します。
https://knowledge.sakura.ad.jp/10071/
前回のシリーズで、CUDAドライバなどはインストール済みの状況ですので、サクサクっと行くと思いきや。。。
今回はchainerを使って構築するのですが、このインストールでまずはハマりました。
chainerは頻繁にアップデートがされているようで、最新版だと私の環境ではchainerのサンプルが動作しませんでした。
Githubの一つ前のタグバージョンをcheckoutし、sudoをつけて実行でなんとかchainer自体のサンプルプログラムを動かすことができました。
CPUのみとGPUありで実行した結果がこちら。
CPUのみ
shinji@erika:~/chainer/examples/mnist$ sudo python train_mnist.py
GPU: -1
# unit: 1000
# Minibatch-size: 100
# epoch: 20
/usr/local/lib/python2.7/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
1 0.190886 0.0853808 0.941633 0.9743 26.337
2 0.0737371 0.0806563 0.97765 0.9746 56.0736
3 0.0501148 0.0697556 0.983567 0.9793 87.7027
4 0.0360439 0.0712158 0.988233 0.9796 120.097
5 0.0275981 0.0700458 0.99105 0.9816 152.951
6 0.0244965 0.0737901 0.991783 0.9807 186.785
7 0.0206206 0.0794443 0.9931 0.9817 221.185
8 0.0157859 0.0946166 0.99465 0.9782 256.26
9 0.0192436 0.0727038 0.99375 0.9836 291.35
10 0.0121996 0.0909156 0.99585 0.9802 327.64
11 0.0151668 0.083468 0.9952 0.9809 364.293
12 0.012637 0.0894125 0.996 0.981 402.002
13 0.0120328 0.0980807 0.996283 0.9782 440.626
14 0.0107634 0.0773315 0.99645 0.9833 480.304
15 0.00718347 0.104756 0.99795 0.9824 521.314
16 0.0136924 0.0862988 0.996117 0.9831 562.428
17 0.00751482 0.0982667 0.997633 0.9807 605.409
18 0.011537 0.108631 0.996567 0.9803 649.184
19 0.00905739 0.092025 0.99755 0.9828 693.837
20 0.00850342 0.126283 0.997333 0.9787 740.196
GPUあり
shinji@erika:~/chainer/examples/mnist$ sudo python train_mnist.py --gpu=0
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20
/usr/local/lib/python2.7/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
1 0.189087 0.148278 0.942617 0.9527 3.79085
2 0.0743432 0.0696217 0.976849 0.9781 6.72717
3 0.0479432 0.0854119 0.985365 0.9747 9.646
4 0.0345973 0.0697305 0.988749 0.979901 12.5685
5 0.0277781 0.0713963 0.990382 0.9817 15.5244
6 0.0246711 0.0817173 0.991632 0.9793 18.4411
7 0.0190846 0.0815929 0.993832 0.9788 21.362
8 0.0191428 0.0824001 0.993965 0.9802 24.2841
9 0.0156598 0.0870756 0.994965 0.9808 27.2083
10 0.0165396 0.084368 0.994782 0.9809 30.1287
11 0.0107558 0.0982989 0.996382 0.9799 33.0535
12 0.0130587 0.094365 0.995898 0.9826 35.9823
13 0.0134525 0.100266 0.995598 0.9813 38.9193
14 0.0137047 0.100356 0.996015 0.9798 41.8402
15 0.00953416 0.0921683 0.996999 0.9831 44.7618
16 0.00744201 0.0906899 0.997683 0.9847 47.6842
17 0.0108528 0.0912897 0.997166 0.9837 50.608
18 0.011356 0.08919 0.996766 0.9833 53.5288
19 0.00650497 0.103822 0.998066 0.9823 56.45
20 0.00974884 0.11052 0.997382 0.9825 59.373
20エポック実行するのにGPUありだと59.373sec、なしだと740.196sec。
実に12倍以上の性能差でGPUのありがたさがわかります。
ちなみにCPUはAMD PhenomⅡX6 1090T BEをOCなし定格3.2GHzで動作させています。
ここまでくれば、あとは、Tornadoという、PythonのWebフレームワークを組み込んでWebサービス化します。
こんなに簡単に作れるとは素晴らしい。
ローカルネット内で動作確認をして問題なさそうでしたので、ルータのポートに穴を開けて公開。
以下の、URLでご利用できます(自宅鯖ですので落ちてたらごめんなさい)。
使い方はとっても簡単。
「ファイルを選択」で識別したい画像を選択して「upload」で識別開始です。
さくらインターネットさんでサンプルでつけていた、こちらの画像をアップロードしています。
はい、さくらさんのblogの確率とほぼ同じですね。
かかる時間は4秒弱(ベトナムから東京の自宅鯖にアップしています)。
識別を続けたい場合は、「トップペーへ戻る」で。
他にも色々試して見ましたが、対象物が一つの場合は、ほぼ正しい答えが返ってきます。
空を飛んでる白っぽいセスナ機をスペースシャトルと認識したりはご愛嬌でしょうか。
#まとめ
とりあえず当初の目標であったディープラーニングを使ったAIWebサービスを公開できました。
それにしても、サーバー構築の経験と環境さえあれば簡単すぎるぐらいで構築ができます。
2017年大晦日に何をやっているんだということもありますが、人工知能周りのコモディティー化は来年もさらに加速してさらにみじかな存在になっていくと思います。
シンギュラリティーの到来が待ち遠しい筆者としては、ワクワクが止まりません。
ということで、みなさん、良いお年を!