普段は会社員でWeb系の開発エンジニアとして働き、週末に趣味で個人開発をしています。今年の7月に話題のAIをweb上で誰でも気軽に作れる「AIメーカー」というサービスをリリースしました!■AIメーカーhttps://aimaker.io/この記事では、この「AIメーカー」で使っている技術をまとめたいと思います。複数AIのモデル学習を並列で走らせる対応も無事完了!(処理の裏側では複数のGPUサーバが走っている)学習には時間がかかってしまうため、エポック数(訓練データを何回繰り返して学習させるか)は500に調整し、10分以内には終わるように。学習履歴を一覧表示して、グラフを切り替えれるようにしてみた。2018システム構成図AIメーカーのシステム構成図は以下の通りです。大きな構成としては、主にユーザからの様々なリクエストを受け付けるフロントサーバと機械学習の処理を取り扱うバックエンドサーバの2つがあります。EC2でサーバを立てています。Engine(GCE)でサーバを立てています。サーバのOSはLinuxでCentOSの7系を使っています。Storage経由で使った方が都合がいいからというのが理由になります。cloud.google.comcloud.google.comcloud.google.comApachewebサーバはApacheを使っています。Nginxもありますが、Apacheは普段から使っており、設定も把握していたため、いつも通りの安定の選択としました。RDSを使ってMySQLを立てています。EFSというネットワークファイルシステムを使っています。aws.amazon.comAIメーカーではフロントサーバとバックエンドサーバで分かれており、そこの連携が肝になってきます。EFSを使うことで、全インスタンスで同じファイルを共有することができるので、めんどいことを考えなくてもよくなります。サーバをスケールさせる際に問題となってくるのがデータが格納されるDBとファイルになるかと思います。EFSを使うことでファイルの読み込みや書き込みの速度は犠牲になるため、ユースケース次第かと思いますが、この辺の問題を考えなくてもよくなります。ストレージ料金が高いのが悩みの種です。><PHPフロントサーバ側のプログラムはPHPを使って実装しました。Frameworkを使用しています。Preprocessorframework.zend.comPythonバックエンドサーバ側のプログラムはPythonを使って実装しました。フレームワークはFlaskを使用しています。LearningのフレームワークはCaffeを使用しています。FrameworkjQueryクライアント側のJavaScriptは、jQueryを使って実装しました。jquery.com実装方法AIメーカーを作るにあたって、一般的なwebサービスにはない機能をどう実装しているかをご紹介します。以下の機能について、まとめてみます。学習データの自動収集ディープラーニングで画像分類のモデルを作る際には、AIにこの画像は〇〇であるということを教えるため、学習データにラベル付けを行います。この学習データのラベル付けは、モデルの精度に大きく影響する重要な作業ですが、単調な作業なためにとても退屈です。そこで、AIメーカーでは事前に登録していたラベル名から画像データを自動で収集する機能を用意いたしました。ちなみにこちらの機能はAidemyの石川さんよりアドバイス頂いた機能です。APIを使用しています。一つのラベルごとに50件の画像データを収集するようにしています。この学習データの収集はブラウザからAjax通信でリクエストを投げ、サーバ側でバックグラウンドで処理させています。処理時間はラベル数によりますが、少なくとも数分はかかるので、単純にリクエストを投げて応答を待っていると通信がタイムアウトしてしまう可能性があります。そこで、サーバ側にリクエストを投げたら一度データベースへその処理をタスクとして保存しておき、一旦ブラウザ側へレスポンスを返しています。サーバの裏側では常にデーモンが監視(待機)しているので、データベースへ学習データの収集タスクが登録されたら、収集処理が開始されるようになっています。ブラウザ側では定期的にその進捗状況をAjax通信で見に行く(ポーリングする)ようにしています。AIメーカーでは手軽に利用できるように学習データの自動収集機能は用意しておりますが、それだけだと質の良い学習データは用意できないため、JPG、PNG、ZIPによる画像データのアップロードにももちろん対応しています。モデルの学習モデルの学習といえば、AIメーカーの根幹の機能になります。登録された学習データをもとにモデルを学習させます。先のシステム構成図で示しましたが、AIメーカーにはフロントサーバとバックエンドサーバがあり、モデルの学習はバックエンドサーバで行います。具体的には以下の流れで行います。バックエンドサーバ側でリクエストを受け、Caffeの学習コマンドを実行するLMDBの作成リストファイルは先の2で生成しておいたテキストデータを指定します。フロントサーバ側でログから学習完了を検知し、学習結果をデータベースへ保存し、EC2インスタンスを停止する以上が処理の流れになります。学習が完了し、生成されたモデルを使って画像分類の推論を行う機能です。こちらは以下の処理で行っています。フロントサーバでレスポンスを受け取り、推論結果をグラフで表示する最後に今回、特にAIメーカー特有の機能に絞って、実装方法をまとめてみました。AIメーカーではフロントサーバとバックエンドサーバの複数インスタンスで構成し、それぞれを連携させて実現している箇所が多いため、多少複雑になっています。実際に作ってるときは頭の中でシステム構成をイメージして実装を進めていますが、後で見返すとどうだったっけな?となることがほとんどです。このへんはきちんとメモするか、図解するかしてきちんと残しておいた方がよさそうですね。AIメーカーでは誰もが手軽にシンプルに使えること、そして学習が早く終わるようにするため、現時点ではモデルの精度を犠牲にしています。そのため、今後は精度向上のために学習の際のハイパーパラメータのチューニングをしたいとか、学習の回数をもっと増やしたいとかなどの要望に応えられるようにする必要があると感じています。学習自体はサーバ側でGPUを使ってやってます。手軽に利用できるように学習時間を大幅に削減するべく、本来もっと学習すべきエポック数を少なくしてるので、精度はそんなに出ないのが現状です。2018今後、このあたりの機能拡張も行っていきたいと思います。2018の22日目です。はてなブログProAIメーカーなどのサービスを作っています。ここでは気になった技術、話題などをまとめたり、雑記を書いたりします。アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。