シンギュラリティへの道：ディープラーニングのWebサービスを公開してみる編

# 概要
本エントリーは、早くシンギュラリティが実現して、生理食塩の水槽に脳ミソ一つでプカプカ浮かびながら、無限大の時間と空間を飛び回りたいと望んでいる筆者のポエムです。

#ディープラーニング
「シンギュラリティ　＝　超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でご利用できます（自宅鯖ですので落ちてたらごめんなさい）。

http://intmax.jp:8000

画面はこちら。
![スクリーンショット 2017-12-31 18.34.15.png](https://qiita-image-store.s3.amazonaws.com/0/120330/ac9de98c-77c4-3725-84c7-641c83e95d71.png)

使い方はとっても簡単。
「ファイルを選択」で識別したい画像を選択して「upload」で識別開始です。
さくらインターネットさんでサンプルでつけていた、こちらの画像をアップロードしています。

![cat-1-680x453.jpg](https://qiita-image-store.s3.amazonaws.com/0/120330/7ae018b3-8ca9-a0a8-cd42-90422c97a538.jpeg)

識別結果がこちら。
![スクリーンショット 2017-12-31 18.38.46.png](https://qiita-image-store.s3.amazonaws.com/0/120330/eb0fe82c-6d1f-74a1-33ae-1ae218d0c492.png)

はい、さくらさんのblogの確率とほぼ同じですね。
かかる時間は4秒弱（ベトナムから東京の自宅鯖にアップしています）。
識別を続けたい場合は、「トップペーへ戻る」で。

他にも色々試して見ましたが、対象物が一つの場合は、ほぼ正しい答えが返ってきます。

空を飛んでる白っぽいセスナ機をスペースシャトルと認識したりはご愛嬌でしょうか。

#まとめ
とりあえず当初の目標であったディープラーニングを使ったAIWebサービスを公開できました。
それにしても、サーバー構築の経験と環境さえあれば簡単すぎるぐらいで構築ができます。
2017年大晦日に何をやっているんだということもありますが、人工知能周りのコモディティー化は来年もさらに加速してさらにみじかな存在になっていくと思います。
シンギュラリティーの到来が待ち遠しい筆者としては、ワクワクが止まりません。

ということで、みなさん、良いお年を！