人工無脳は考える
開発環境

クラウド開発環境を選ぶ

クラウド上での人工無脳の開発(その1) 2016/10/22

人工無脳を作り、最終的にはWebアプリとして動作させるにはどんな開発環境が良いだろうか。 まずは最近急速に利用しやすくなった自然言語処理や機械学習、人工知能等の様々なライブラリを導入できることが望ましい。 初めから使うわけではないにしても、手段が用意されていれば様々なアイデアを試してみたくなる。それが重要である。 また、開発は小規模のアプリケーションから始め、無料で簡単にデプロイできる点も重要である。 いくつかの選択肢を試した結果、2016年現在当サイトは表1のような環境に移行中である。

表 1. おすすめ人工無脳開発環境
機能名称特徴
1. プラットフォームGoogle App Engine無料で一定のアプリをデプロイ可能
2. 言語Python 2.7機械学習ライブラリを使いやすい
3. WebフレームワークFlask / Jinja2GAEのチュートリアルでも使われる軽量フレーム
4. 分かち書きTinySegmenter品詞情報は得られないが、小型でPure Pythonであるためインストール可能
5. データベースTinyDBjson形式のデータをDBとして検索、操作する。
6. 設定ファイルI/Osimplejsonjson形式のファイルを読み書きする。Cloud Shellにビルトイン
7. 数値計算numpy高速なベクトル計算など。Cloud Shellにビルトイン

言語とプラットフォーム

使用する言語は機械学習や自然言語処理のライブラリが豊富でソースが読みやすく、広く使用されている点からpythonがよい。pythonのライブラリをユーザがある程度自由に インストールできるサービスとしては、AmazonのAmazon Web Services(AWS)、 IBMのBluemix、Googleの Google Cloud Platform(GCP)、MicrosoftのAzureなどのクラウドコンピューティングサービスがある。 いずれも企業が有料サービスを運営するのに使えるような大規模なPaaSであるが、この中でGCPには上限を超えなければ無料で使用できるプランがある。 この無料枠の内容は、コードと静的データのストレージが1GBまで、インスタンス時間が一日28時間まで、 Cloud Storageを利用する動的データが5GBまで等となっており、手始めに人工無脳を動かすにはまず十分なリソースである。

次にGCPにはCloud Shellと呼ばれるpythonを動かすシンプルなシェルが提供されている。 これはいわば仮設の環境で、Webアプリを手動でのみ起動可能、$HOMEディレクトリの外に置いたデータはログアウト時に削除される、$HOME内のデータも一定期間ログインしなければ削除される、 などの制限が加えられている。とりあえず、開発中はこの環境で人工無脳を動作させることを考えよう。

次にpythonには2.7と3.4の二種類の系統がある。この二つはunicode文字の扱いが大きく変更されており、ソースの互換性がないためどちらかを選択しておこう。

Cloud Shellにはスタンダード環境とフレキシブル環境があり、前者はPython 2.7が利用でき、C++等を含まないPure Pythonのライブラリをインストールすることができる。一方後者はPython 2.7 / 3.4 が利用でき、インストールできるライブラリに限定がない環境である。 こちらは今のところベータテスト中で無料ではあるが、クレジットカードの情報を要求されることから将来的には課金される可能性があるかもしれない。 これらのことから、開発にはPython 2.7を使うのがよさそうだ。

なお、Cloud Shellにはサードパーティー製のライブラリをインストールできるため、これを利用して小規模なデータベースや計算をCloud Shellの中で完結して実行できる。 いずれはCloud Storageへ移行するとしても、例えばBluemixを試用した時にはクレジットカードに紐付けするためのクレデンシャルと 呼ばれる仕組みが煩雑で、システム側の問題で認証がうまくいかないことや、試用中にもモジュールの仕様が変更されて混乱が生じた。 開発初期にそのような人工無脳の開発と関係ない部分で悩むことは避けるべきで、また開発と並行してCloud Storageの扱いに慣れる時間をとることもできるため、 まずはCloud Storageを使わないでアプリケーションを組み立てていく方がよいだろう。

Webアプリのフレームワーク

pythonではDjango、Flask、Bottle、Pyramidなどさまざまなフレームワークが利用されている。比較記事はググればいくつも見つけることができるので、 最新の状況を確認する意味でもいちど調査してみてほしい。これらのなかでFlaskは軽量で分かりやすいので、これをワークフレームとして使用する。かつてのPerl/CGIと比べると、Python/FlaskはHTMLレンダリングとロジック部分がより明確に分離され、 読みやすさが向上している。CGIでは状態遷移にscript.cgi?phase=writeといったようにmethodを使い、レンダリングされる内容を変えていたが、Flaskではディレクトリ遷移を状態遷移に用いるスタイルとなっている。 また、sessionというメカニズムを使ってcookieやformデータを処理しており、手短にwebアプリのフレームワークを整えることができる。

分かち書き

分かち書きとは、文字列を

我々は高みに憧れるが、歩き出すことには無関心だ。

から

我々 | は | 高み | に | 憧れる | が | 、 | 歩き出す | こと | に | は | 無関心 | だ | 。

のように、名刺や助詞などの種類で分割することである。これによってようやく単語を比較、抽出しやすくなる。 さらに各単語の品詞や原形、よみがな等を含めて調べることを形態素解析と呼ぶ。分かち書きや形態素解析を行うモジュールには、 MecabChasenJUMAN++JanomeTinySegmenterなどがある。

これらの特徴を表2に示す。Cloud Shell上で動かすにはpure pythonが条件であり、JanomeとTinySegmenterが 候補となる。作製する人工無脳が品詞情報を必要とするかどうかでモジュールを選ぶことになるが、辞書の生成のように大量のデータを処理する場合は、 ローカルで高速な形態素解析器を使った方がよいかもしれない。これらの形態素解析器では辞書のフォーマットがおおむね共通しているため、クロスコンパイル(?) 的な運用も可能だろう。

表 2. 形態素解析・分かち書きモジュールの一例
名称機能特徴
1. Mecab形態素解析高速高精度 / 要compile
2. Chasen形態素解析中速高精度 / 要compile
3. JUMAN++形態素解析高速高精度 / 要compile / サイズ2GB
4. Janome形態素解析低速 Mecab互換? / サイズ100MB pure-python
5. TinySegmenter分かち書きのみ高速軽量・精度やや低 / サイズ25kB pure-python

ローカルテスト環境

Cloud Shellはブラウザ上で操作できるシェルであり一通りの作業は可能であるが、手元で気軽に試行錯誤できるテスト環境はやはり用意しておきたい。 例えて言うなら、Web上へのデプロイは育った子猫が外の世界に出ていくようなものである。そこには他の猫や自動車、人間、寄生虫のような脅威がいくらでも存在する。 子猫が小さいうちはそれらに脅かされない安全な場所で、充分運動して体を作る時間が必要である。ローカル環境はその役割を果たす。 この、ローカル環境にもいくつか選択肢がある(表3)。

 
表3 . ローカル開発環境
Linux / MacOSCygwinWindowsCloud Shell Standard
文字コードutf-8utf-8utf-8 / CP932utf-8
simplejsonGGGビルトイン
numpyGGGビルトイン
scipyG32bit版?GNG
scikitGGGNG
MecabGGGNG
TinySegmenterGGGG
ZenhanGGGG
TinyDBGGGG
FlaskGGGG
Jinja2GGGG

Linux環境は最もCloud Shellに近いが、各種のライブラリを使えるようにするにはソースのコンパイルから 始める場合が多く、ある程度の慣れと知識が必要である。またLinuxマシンを個別に用意するのが難しい場合もあるだろう。CygwinはWindows上で Unixを再現した環境であるが、ライブラリのインストールでつまづいている事例がWeb上に散見される。 PythonはWindows版もあり、ライブラリも含めてバイナリーを入手できる(by Christoph Gohlke)ことから、導入はそれほど難しくない。一方で、Windows版ではstdoutに出力される文字列のコードがCP932 でなければ文字化けしてしまう問題がある。その関係でコンソールにうまく表示されるようにしても、結果をファイルにリダイレクトしたらエラーになる場合がある。 また「μ」のようにunicodeやutf-8では表示できてもCP932が表示できない文字がいくつかあり、大きなテキストを読ませるときに原因が特定しにくくトラブルになる。 これらはアプリケーションでやりたいことの本筋とは関係ないので、うまく表示させる方法を苦労して調べるのではなくテスト環境であっても結果をファイルに常に書き出すようにして回避すればよい。

以上のことから、Linux、Macユーザはそのままで特に問題なく、Windowsユーザはネイティブ版Pythonがお薦めである。

エディタ

Atomをおすすめしたい。オープンソースのソフトウェアで、utf-8を扱えることはもちろんであるが、 platformio-ide-terminalパッケージをインストールすることによりシェルが 統合され、ソースを書きながら実行するのに極めてストレスがない。文字の見やすさや目に優しい配色も優れている。さらにコードを走らせて 出力ファイルが上書きされると表示が自動的に更新されるなど、細かく配慮されていて使いやすい。また図1の例ではターミナルの表示色を変更したり、Auto Run Commandに下記の記述をすることでプロンプトの色を変えることもできる。

function Prompt{Write-Host "PS"$(Get-Location)"> " -fore DarkCyan -nonewline;return " `b"}

図 1 Atomエディタとターミナル

Cloud Shell上のアプリはオープンソース

Cloud Shellのチュートリアルを進めると、ローカルフォルダにCONTRIB.というテキストが生成される。 その内容は貢献者ライセンス同意書 (Contributor License Agreement, CLA)の説明であり、 CLAの骨子はユーザがGoogleに置いたファイルについて、Googleや他の利用者がフリーでそれらを再配布、販売、公表、サブライセンスすることを認める、 というものである。つまりCloud Shell上のアプリをオープンソースにする同意を求められるわけである。 CLAはオープンソースのプロジェクトでは一般的なもので、著作権自体の譲渡を求めているわけではない。またこれによりユーザとGoogleとを保護する効果があるが、 企業の利用者にとっては考えどころだろう。

HOME

人工無脳は考える by 加藤真一 2016