Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

mockmock Data Recorderを使って異常検知を試してみた!

f:id:acro-engineer:20190412104902p:plain:w800

こんにちは、IoTエンジニアのHaruka Yamashita (@YamaHaruka925) | Twitterです。

2019年4月にプレビュー版がリリースされた、mockmock DataRecorderを使ってみて、IoT PoCを担当する者としてグッときたポイントをご紹介します!

■mockmock DataRecorderとは

f:id:acro-engineer:20190412105107p:plain:w240

mockmockは、クラウド上に仮想デバイスを作成し、開発中のサーバーに疑似データを届けられるサービスです。

これまでは、
 ・データの階層構造や、値の型・生成方法などをコンソール上で入力するだけで、簡単に疑似データを設定することができる。
 ・仮想デバイスは、瞬時に動作や台数を変更できる。
 ・欲しいデータを、欲しいタイミングで、欲しい量だけ受け取ることができる。
という特徴がありました。

さらに、新たにリリースされたDataRecorderでは、人工的に作成した疑似データではなく、実際のデバイスから収集されるリアルなデータを用いて仮想デバイスを生成することができます。

1. mockmock DataRecorderを使えば、IoT PoCのよくある困った!を解決できるのでは?

1-1. IoT PoCでよくある困った!ポイント

PoCを実施する中では、次のような課題が発生することが多くあります。
私自身、IoT担当エンジニアとして、以下のような点を毎度自分で作成・加工するのに時間を取られています。。。

  • センサー/エッジデバイスの選定から始めると、分析までたどり着くまで時間がかかる
  • データを蓄積するのに、時間がかかる。
  • PoCの期間内に、想定する異常(部品の消耗など)が発生するとは限らない
  • データの取得間隔やデータ量、送信頻度など、パラメータを変更するのが大変
  • PoCで実施した数台での試行だけでは、最終的な可視化や分析の効果まで予測できない
1-2. mockmock DataRecorderを利用することで、IoT開発の「困った」を解決!

1-1. のような課題に対し、mockmock DataRecorderを利用すれば、データ収集や実データを基にした想定される異常波形を作成・加工する部分を簡単にできる!

f:id:acro-engineer:20190412105607p:plain:w800

  • 実際に測定したデータをmockmock DataRecorderに登録することで、疑似波形ではなく実際のデータをもとに、パラメータの試行錯誤ができる。
  • 通信方式が決定していなくても、csvファイルからmockmock DataRecorderに登録することができる。
  • 実際のデータをベースに波形加工をできるため、想定される異常波形など作りこむことができる。
  • 実際のデータをベースに仮想デバイスの台数を増やすことができるため、対象機器の種類や台数が増えた場合のシステム全体を想定できる。

2. mockmock DataRecorderを利用して実際のデータから想定される異常データを作成してみる

2-1. mockmock DataRecorderにデータを登録する

f:id:acro-engineer:20190412105741p:plain:w600

まずは、mockmock DataRecorderに実際のデータを登録します。
そのためには、
 ①mockmock DataRecorderにMQTTSでデータを送信する
 ②csvファイルをアップロードする
という二つの方法があります。
詳しくは、mockmockのドキュメントをご覧ください。

実際のデータを登録することで、仮想デバイスから送るデータを疑似データではなく実際のデータをそのまま利用することができるようになります。

f:id:acro-engineer:20190419102256p:plain:w800

2-2. 実際のデータをもとに、異常波形をつくりこむ

mockmockに登録した実際のデータを基に、異常波形をつくりこんでみましょう。
mockmock DataRecorderには、データ変換タイプとして以下の4種類が用意されています。

  • 無変換(コピー)
  • ノイズを付与する
  • ピーク値を付与する
  • データを間引く

今回は、「ピーク値を付与する」を利用して、異常データを作りこんでみました。

もともとの波形に対し、データの途中からピーク値をのっけることで想定外の振動が発生した状態を模擬します。
元データに対し、「どのデータ位置から、どのようなピーク値を、どれくらいの点数分、どれくらいの間隔をあけて」付与するかをJsonでパラメータ定義してあげます。

f:id:acro-engineer:20190412105923p:plain:w800

これだけで、もともとのデータに対し、ピーク値を付与することができます。
今回は、以下のように波形を変化させました。
mockmock DataRecorderにはデータ可視化機能も付いており、登録/変形させたデータをすぐに可視化して確かめることができます!

f:id:acro-engineer:20190419102336p:plain:w800

2-3. Torrentioへのデータ送信

今回、データ分析部分は当社Torrentioを利用しています。
mockmockからTorrentioにデータを送るための設定は簡単です。
mockmockのデータ送信先設定にTorrentioのMQTTエンドポイント設定を記入するだけ。

f:id:acro-engineer:20190412111315p:plain:w800

mockmockから送信するデータのリプレイヤー定義にて、2-1. で登録したDataRecorderのデータセットを選択します。

f:id:acro-engineer:20190412110247p:plain:w800

mockグループ設定にて、上で定義したデータリプレイヤーを利用するよう設定し、TorrentioのTopic名、MQTTクライアントIDを設定して準備完了。

f:id:acro-engineer:20190412110314p:plain:w800

あとは好きな台数の仮想デバイス(mock)を作成し、起動するだけ!
今回は、もともと1台から収集したデータを3台に増幅して送っています。

2-4. 異常検知してみる

mockmockから送信されたデータをTorrentioで異常検知してみます。

PoCとしてセンサーによりデータを測定しているのは1台ですが、mockmockにより実データを送信できる仮想デバイスを増やすことで、複数台で実施した場合の分析の見え方なども検討することができます。

f:id:acro-engineer:20190412110400p:plain:w800

※ここでは異常検知を実施しましたが、Torrentioでは、他にもIoTダッシュボードでのリアルタイム可視化やルールエンジンによる制御なども実施することができます。
 詳しくは、Torrentio Cloudについてをご覧ください。

3. まとめ

小さく始めることで、実施しようとしているIoTシステム開発が有効かどうかを見極めるためのPoC(実証実験)ですが、IoTシステムにはセンサー/ネットワーク/分析プラットフォームなど必要なステップが多く試行錯誤に時間がかかることや、監視対象の機器台数がスケールした場合の想定が難しいなどの課題がありました。
mockmock DataRecorderを利用することにより、「測定した実際のデータをもとに」仮想デバイスの台数を増やせたり、異常波形を創りこむことができます。
PoCでの試行錯誤がぐんとやりやすくなりますね!

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

www.wantedly.com

技術書典6にサークル参加しました

こんにちは。
@snuffkinです。

4/14(日)に開催された技術書典6に、サークルとして参加してきました。
techbookfest.org

前回は分散型RESTful検索/分析エンジンであるElasticsearchに関する本を頒布したので、二回目の参加です。
acro-engineer.hatenablog.com

頒布したもの、印刷所、ツール

f:id:acro-engineer:20190415091543p:plain:w250
今回は、個人的に勉強している量子コンピュータに関する本を頒布しました。
https://github.com/snuffkin/books/tree/master/20190414_quantum_computertechbookfest.org

前回に引き続き、印刷所はねこのしっぽさんにお世話になりました。
きめ細かく対応して頂き、ありがとうございます!
www.shippo.co.jp

執筆のためのツールはRe:VIEWを使いました。
Re:VIEWは定型的なレイアウトの文書をパッと書けるので、いいですね。
github.com

当日の様子

開催場所は技術書典5に引き続き、池袋サンシャインシティの展示ホールDです。
現地に到着すると、のぼりがありました。
これを見ると「いよいよだなぁ」と感慨深く感じます。
f:id:acro-engineer:20190415090305j:plain:w250

準備したブースはこちら。
前回は用意しませんでしたが、今回はポスターを用意しました。
ポスターを見ている方が多かったため、ポスターは重要アイテムですね。
f:id:acro-engineer:20190415090421j:plain:w300

最近「量子コンピュータ」というキーワードを目にする機会が増えたものの、IT業界全体で言えばまだまだメジャーではないイメージでした。
ですが、様々な方が興味を持って、サークルを訪れてくださり、楽しい時間を過ごせました。
そして嬉しいことに、今回も完売しました!

また、早速感想をくださった方もいらっしゃり、ありがとうございます。
感想は今後の改善・励みになるので嬉しいです。
「次回も技術書典やりたいな~」と思いました😄

最後に

今回も、技術書典には参加者・サークル合わせて約1万人が集まりました。
これだけの規模の技術書典が開催できるくらい、技術に対する情熱があるって事で、それはスゴイ事だなぁと思います。
運営の方々、サークルの方々、参加者の方々、いろいろお世話になった方々、みなさんありがとうございます。
このような素晴らしいムーブメントを、今後も盛り上げましょう!

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

Elastic Kibana Day Tokyoに参加してきました!

こんにちは。
Elastic Certified Engineerのshin0higuchiです😊
今日は六本木でおこなわれたElastic Kibana Day TOKYOに参加してきました!

13:30 受付〜オープニング

今回の会場は六本木ヒルズ森タワーの49F、アカデミーヒルズというところでした。
f:id:acro-engineer:20190306132602j:plain:w300 f:id:acro-engineer:20190306132859j:plain:w300


割と広めの会場で、参加者は150人弱ほど。
アジェンダ

  1. Kibana Power Hour part1
  2. Kibana Power Hour part2
  3. 日本向けの特別なお知らせ
  4. クロージング

という流れでした。

f:id:acro-engineer:20190306134542j:plain:w500

Elastic社の会社紹介動画が流れて会がスタートします。

14:30 Kibana Power Hour part1

このパートは大まかには下記の2点

  1. Kibanaの歴史
  2. バージョン6の機能紹介およびデモ

が中心でした。

バージョン6の機能紹介およびデモ

紹介されたことの概要を挙げていきます。
機能の細かいところは公式ドキュメント・ブログなどに譲ります。

Spaces

Kibanaのダッシュボードなどのリソースを分けてマルチテナントでの運用が容易になる。
詳細に関しては、下記のブログを読むと良いと思います。
www.elastic.co

ロールアップ

古くなった時系列indexを集計して、サイズの削減をおこなう。
メリットとしては

  1. ディスクを削減できる
  2. indexが縮小するので高速化可能

といったあたり。
集計方法をKibanaのUIから選択して簡単に設定できるのが楽で良いです。

Beats Central Management

名前の通り、Beatsの設定をKibanaから制御できる機能。
現状対応しているのはFilebeatおよびMetricbeatのみだそうです。

Canvas

お待ちかね、Canvasのデモです。
Canvasの概要については、以前に記事を書いているのでKibana Canvasを使ってみた - Taste of Tech Topicsをご参照ください。
近頃かなり力を入れているようで、楽しみです。....と思いましたが、いったん機材トラブル発生。
急遽Elastic大谷さんによるデモが始まります。

InfraUI・LogsUI・APMのデモ
f:id:acro-engineer:20190306150542j:plain:w600


Canvasのデモ内容としては「日本各地の風速気温湿度をリアルタイムに表示する」という内容のWorkpad作成でした。
Canvasはレイアウトやデザインの柔軟性の魅力に加えて、インタラクティブな絞り込みが強化されていくようです。
(将来的にはCanvas上でAlerting設定が作れるようになるという話もちらっと聞きました。)

Reporting+Watcherで定期的にPDF送信可能というのもうれしいポイントです。

16:00 Kibana Power Hour part2

このパートでは今後のロードマップについての話がありました。

Canvas

大まかに挙げると下記のポイントになります。

  1. Canvasを一般公開
  2. カスタム操作
  3. 新しいビジュアルエディター
  4. ビジュアライズからアラート作成 
  5. fully embeddable workpads
  6. import existing visualization from kibana
  7. Geo element and location aware functions
  8. GA coming soon
  9. template
  10. クリックして絞り込んだり遷移したりするドリルダウン機能も検討中

→トリガーという形でカスタムアクションを埋め込むことができるようになる。

その他

  1. Kerberosサポート
  2. 機能コントロール (スペースごとの機能制限など)
  3. アラート管理
  4. Kibana監査ログ

 列挙しましたが、Kibanaの監査機能は以前から欲しいと思っていたので嬉しいニュースです。

Maps

現在の最新版では既に触ることができますが、複数のデータソースをマルチレイヤーで表示することができます。
軽く触っただけですが、いろいろな表現ができて、今後の可能性を感じました。
これからダッシュボード等に組み込まれるのか、まだ情報は多くありませんが要チェックです。

日本向けお知らせ

Kibana日本語化

Kibanaの日本語ローカライズ版は7.1見込み(機能自体は6.7で提供見込み)

ドキュメント日本語化

7.1をターゲットにしている
機械翻訳で実現する予定。
「Elasticsearch」→「弾性検索」のようにならないようエンジンを鍛えているところ。

17:00 懇親会

アローナさんをはじめ、色々な人とお話をすることができました。
個人的にはWatcherUIが今後どうなっていくのかなどを聞くことができて、良かったです。
(写真撮り忘れました。残念....)

まとめ

バージョン7のGAも近づき、Kibanaの大きな進化を目の当たりにしました。
今後も使い倒していきたいと思います。

(ちなみに紹介特典でElastic靴下をいただきました😊)
f:id:acro-engineer:20190306152953j:plain:w300


以上です、お読みいただきありがとうございました。


Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。


世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com

1/30(水)にElasticテクニカルワークショップを開催します

こんにちは。
Elastic Certified Engineerのshin0higuchiです😊

現在、2ヶ月に1度開催されているElastic社の
Elasticテクニカルワークショップですが、
次回の開催は、今月末の1/30(水)の予定です。

こちらのワークショップは、
Elastic Stackの基本的な使い方を実際に手を動かして学んでいただけるほか、
利用事例などの紹介も実施されます。

参加時に質疑応答なども自由にできる為、
実際の利用・活用の参考になったと毎回好評の
無料で参加できるワークショップなので、この機会に申し込みを!
https://events.elastic.co/2019-01-30-AcroquestWorkshop-Tokyo

概要は下記の通りです。
==============================
日時:
2019年1月30日(水)12:40受付開始
13:00開始 - 17:30終了予定

会場:
CONFERENCE BRANCH 銀座
東京都 中央区 銀座3-7-3

概要:
Elasticsearch/Kibana/Logstash/Beatsのテクニカルワークショップを開催。
ElasticのOEMパートナー企業であるAcroquest Technology社のエンジニアがElastic Stackの基礎から、オプション機能の利用までをハンズオン形式で説明致します。
ぜひこのワークショップで、星野リゾート日経新聞社、リクルートテクノロジーズが活用するElasticsearchの世界を体験頂き、

  1. システムログ分析
  2. マーケティングデータ分析
  3. 経営指標(KPI)の可視化

等の業務、プロジェクトで活用頂ければと思っております。

プログラム:

  1. Elastic 概要
  2. ハンズオン

 - Elasticsearch/Kibana/Logstash/Beatsの紹介およびElasticsearch Service環境でのハンズオン
 - ビッグデータを活用した実践講座

  1. Elastic Stackのオプション機能紹介
  2. Elastic最新動向、事例紹介 、LT、Q&A

対象者:

  1. 自社のデータ分析を行いたい方
  2. Elasticsearchの概要は既にご存知で、これから活用を検討している方
  3. 今後Elasticsearch評価を開始するにあたり、基本機能を習得されたい方
  4. お客様へ提案をされるエンジニアの方

==============================

それでは、お申込みお待ちしております。
この機会で、Elasticを学びましょう!


Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。


世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com

2018年Advent Calendarの振り返り

皆さんこんにちは。GPUをサンタさんにお願いした@tereka114です。
今年のAdvent Calendarの時期も過ぎ去り、年末まで残すところ後数日ですね。

今年も集めてみると、かなりのブログ記事を執筆しました。
この記事でまとめて紹介させていただきます!

2018年アドベントカレンダーまとめ

はてぶTop3

記事の中で特に人気の高い記事、今年のはてぶTop3の記事を紹介します。

1位:Elastic Stackで簡単!Dockerコンテナ監視ダッシュボード作成

人気の高い2つのOSS、Elastic Stack と Docker の組み合わせはさすがに強い。
皆が使うDockerの監視といったニーズも高かったか、2位にダブルスコア以上の大差を付けて、堂々のTOP。
私も試しに使ってみたい・・・

acro-engineer.hatenablog.com

2位:キーフレーズを自動推定するPositionRankの収束性について解説

PositionRank自体が初耳で、論文でもなく、まさか自分で収束性を解析してしまうとは。
記事内容が面白く、時間をかけないと読めません。
かなりの数学・理論マニア向けと思われたこの記事が、まさかの2位にランクイン!

acro-engineer.hatenablog.com

3位:LambdaからRekognitionを使ってみたら意外なところでハマった話

AWS Rekognitonを使った画像解析を簡単なお試しではなく、実際の業務で本格的に使ってみたからこそハマった内容。
内容よりも、写真に写るボウズの人が気になってしまったのは、私だけでしょうか。。。

acro-engineer.hatenablog.com

最後に

今年のアドベントカレンダーいかがでしたでしょうか?
この中には、仕事で扱っているものも多く、なるほどと感じる内容が多く、読むのが非常に楽しかったです!

また来年、お会いしましょう!皆さん、良いお年を。

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com

同一アプリをWeb版とElectron版の両方で作る方法

皆さん、こんにちはmiyasakagoです。
この記事はNode.js_2 Advent Calendar 2018 - Qiitaの23日目です。

0)はじめに

ここ2年くらいで私自身、Electronを実案件の中で使う機会が増えているのですが、比較的遭遇するのは、同一アプリでWeb版もElectron版(デスクトップアプリ)も両方ほしい、というようなシチュエーションです。
f:id:acro-engineer:20181224200843p:plain:h250
例えば、Electronベースで開発されているアプリの一つにSlackがありますが、SlackはWebアプリとしてブラウザ上から利用することも、デスクトップアプリとして利用することも可能になっていますよね。

こういうことを実現したいと思ったとき、どういう方法があるのかいくつか選択肢があり、迷いました。
少し探してもあまり情報がなかったため、いろいろ調べ自分なりに整理してみました。

1)Webアプリを先に作り、Electron上からURL呼び出しする方法
2)Webアプリを先に作り、Electronに移植する方法
3)Electronアプリを先に作り、Webアプリに移植する方法

では、詳細を見ていきましょう。

1)Webアプリを先に作り、Electron上からURL呼び出しする方法

1. 概要

タイトルの通り、Webアプリを開発した後、そのWebページをElectronのウィンドウ上に読み込み動作させる、という方法です。

Electronには、外部のWebページを読み込み、デスクトップアプリ上で動作させる便利な機能があります。
その機能を活用した方法になります。(本機能の概要は後述します。)

2. メリット/デメリット

この方法であれば、WebアプリのソースコードをElectron側に移植するような作業は発生せず、開発はWebアプリ側に注力できます。
一方、制約も出てきます。以下に整理します。

  • メリット
    • 開発コストを抑えられ、納期も短くできる。
    • アプリのバージョンアップが楽。わざわざ更新プログラムを配信してインストールさせなくても、Webアプリを更新すれば、自動的にElectronアプリも更新される。
    • Web版、Electron版それぞれで、同じようなソースコードを2重管理する必要がない。
  • ・デメリット
    • インターネット環境での動作が前提になる。そのため、アプリの要件として許容できるかどうか、先に確認しておく必要がある。
    • Electronのネイティブアプリ用の機能(例:ローカルファイルへのアクセス等)の利用に制限が生まれる。

3. 実現方法

このブログでは、上記の実装方法の詳細までは解説しませんが、2つの代表的な方法の紹介だけ簡単にしておきます。

a. webviewを利用する
  • webviewは、外部のWebページを読み込み、Electronのアプリ上に表示する機能。
  • webviewタグの使い方はHTMLの標準タグであるiframeに似ている。
  • Electronのプロセスとwebviewに読み込んだWebページとの間で情報のやり取りが可能であったりと、iframeには無い便利な機能性を持っている。
  • 本格利用を考える場合、webviewはChroniumが維持管理をしている為、Electronの要望通りにバグ修正が進まないという課題がある。

webviewでできることや実装方法については、以下のページなどに詳しく書かれています。
qiita.com

b. BrowserViewを利用する
  • BrowserViewは、webviewに替わる方法として実装されたもの。
  • webviewと違い、BrowserViewはElectronが維持管理をしている為、バグ修正が進まないリスクを減らせる。
  • 一方、まだwebviewほど機能が充実していないので、その点を踏まえた選定が必要。

BrowserViewの基本的な使い方については、
今年のAdvent Calendarでも紹介されていますので、ここでは割愛します。
qiita.com

参考までに

現在のSlackのデスクトップアプリ(version3.0以降)は、BrowserViewを利用して実現されている代表例の一つです。
なお、Slackは、version2.xまではwebviewを用いており、3.0へのバージョンアップ時にBrowserViewに切り替えたことが、Charlie Hess氏の以下のブログで紹介されています。
slack.engineering

webviewとBrowserViewの選定をする上では、一度読んでおくことをおすすめします。

2)Webアプリを先に作り、Electronに移植する方法

1. 概要

「1)Webアプリを先に作り、Electron上からURL呼び出しする方法」との違いは、Webアプリを作った後にソースコードをElectronに移植する点です。

f:id:acro-engineer:20181224194201p:plain:w500

移植を前提で考える場合、サーバサイドとクライアントサイドは疎結合にしておくことが重要であるため、SPA(シングルページアプリケーション)として開発しておくことをおすすめします。

また、サーバサイドをNode.jsで開発しておけば、ElectronのMainプロセスにサーバサイドのロジックも移植しやすくなるためおすすめです。
逆に、サーバサイドはAPIサーバとしてElectronには移植せず、Electronアプリから呼び出す構成にしても良いでしょう。

2. メリット/デメリット

  • メリット
    • 同じくWebアプリを先行開発する「1)Webアプリを先に作り、Electron上からURL呼び出しする方法」に比べ、Electronアプリへの移植後に、Electronのネイティブアプリ用の機能を追加することが容易。
    • Webアプリ先行であるにも関わらず、移植した結果としてオフラインでも動作するデスクトップアプリを作ることが可能。(※ただし、クライアント-サーバ間の通信部分などは改修する必要がある)
  • デメリット
    • 同じくWebアプリを先行開発する「1)Webアプリを先に作り、Electron上からURL呼び出しする方法」に比べ、移植のコストがかかる。
    • Web版とElectron版でソースコードが2重管理されることになるため、メンテナンスコストが高い。

3)Electronアプリを先に作り、Webアプリに移植する方法

1. 概要

「2)Webアプリを先に作り、Electronに移植する方法」の逆方向への移植を前提とした方法です。

f:id:acro-engineer:20181224194505p:plain:w500

前提として、ElectronアプリはNode.jsによって実行され(Mainプロセスと呼ばれる)、画面描画部分はHTML5、CSS3、JavaScriptによってChromium上で動作します(Rendererプロセスと呼ばれる)。
そのため、利用言語の関係上、ElectronアプリはWebアプリへの移植をしやすい構成になっていると言えます。

2. メリット/デメリット

  • メリット
    • Electronアプリを先に作るため、Electronのネイティブアプリ用の機能(例:ローカルファイルへのアクセス等)の利用に制約が生まれない。
    • そこまで意識せずとも、サーバサイドへの依存を減らした作りになりやすく、オフラインでも動作するデスクトップアプリを作りやすい。
  • デメリット
    • Electron上では、Mainプロセス(Node.jsで動作)とRendererプロセス(Chromium上で動作)はIPC(Inter-process Communication:プロセス間通信)による通信を行う為、その通信部分はそのままWebに移植はできない。
    • Electronのネイティブアプリ用の機能は移植できない為、Web移植時に交換しやすいクラス設計をしておくことが重要。
    • Web版とElectron版でソースコードが2重管理されることになるため、メンテナンスコストが高い。

4)まとめ

ここまで3つの方法を紹介しましたので、メリット/デメリットをまとめます。

No. 方法 メリット デメリット
1 Webアプリを先に作り、
Electron上からURL呼び出しする方法
・開発コストを抑えられ、納期も短くできる
・アプリのバージョンアップが楽
ソースコードの2重管理が不要
・デスクトップ版もインターネット環境での動作が前提になる
・ネイティブアプリ用の機能の利用に制限が生まれる
2 Webアプリを先に作り、
Electronに移植する方法
・ネイティブアプリ用の機能を追加することが容易
・オフラインでも動作するデスクトップアプリを作ることが可能
・1の方法に比べ、移植のコストがかかる
ソースコードが2重管理されることになる
3 Electronアプリを先に作り、
Webアプリに移植する方法
・ネイティブアプリ用の機能の利用に制約が生まれない
・オフラインでも動作するデスクトップアプリを作りやすい
・IPCによる通信部分はそのままWebに移植はできない
・ネイティブアプリ用の機能は移植できない
ソースコードが2重管理されることになる


最後に、上記のどの方法を採用するか決める上で、私が考えている判断基準を書いておきます。

  1. Webアプリ、デスクトップアプリのどちらをメインにするのか
  2. デスクトップアプリにてネイティブ機能の利用はどの程度求められるか
  3. 開発にコストと期間をどれだけ割り当てることができるか

これらの質問への回答とその優先度によって、採用する方法は概ね判断できると考えています。
例えば、分かりやすい例では以下のような具合です。

  • ネイティブ機能はあまり使う予定はなく、短期間での開発が求められる。
    →「1)Webアプリを先に作り、Electron上からURL呼び出しする方法」が良さそう
  • Webアプリメインだが、デスクトップアプリではネイティブ機能もしっかり使いたい。
    →「2)Webアプリを先に作り、Electronに移植する方法」が良さそう
  • デスクトップアプリがメインで、ネイティブ機能をしっかり使いたい。
    →「3)Electronアプリを先に作り、Webアプリに移植する方法」が良さそう

私のように「Webアプリもデスクトップアプリもほしい」というシチュエーションになったら、是非、参考にしてみてもらえたら幸いです。

それでは!

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
自社製品の開発から活用方法の提案まで関わりたいフロントエンジニア募集! - Acroquest Technology株式会社のWeb エンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

今日から使えるChainerを使用する際に便利な5つのトリック

メリークリスマス。@tereka114です。
この記事は「Chainer/CuPy Advent Calendar 2018」アドベントカレンダーの24日目です。

qiita.com

Chainerを利用する際の便利なトリックをクリスマスプレゼント代わりにご紹介します。
Chainerは非常に使いやすい良いフレームワークだと思います。
使っていく中で、デバッグやパラメータのチェック、あるいは既存モデルの利用など、かゆいことが必要になる時があり、その方法を調べる事が多くありました。

Chainerはそのようなことにもサポートしており、大変助かっています。
せっかくなので、使ってきたトリックをここで紹介します。

※Chainerのバージョンは5.1.0を用いています。

1. DEBUGモード

ニューラルネットワークは学習した結果、出力が常にNaNになることがあります。
NaNになる原因はゼロ除算や値が高すぎてinfになるなど様々です。
一つ言えることとして、この原因特定は相当厄介です。特定のために、まずは、いつ、どこで発生したのかを探る必要があります。
Chainerが標準で搭載しているDEBUGモードを利用することにより、NaNを検出できます。

例えば、次の例を見てみましょう。意図的にl1レイヤーの出力のあとに、NaNとなるよう変数を代入しています。

import chainer
import chainer.links as L
import numpy as np

class MLP(chainer.Chain):
    def __init__(self):
        super().__init__()
        with self.init_scope():
            self.l1 = L.Linear(2, 2)
            self.l2 = L.Linear(2, 2)

    def __call__(self, x):
        h = self.l1(x)
        h.data[0] = np.nan
        return self.l2(h)


x = np.array([[10, 10]], dtype=np.float32)
model = MLP()
print (model(x))

計算の出力は次の通りになります。

variable([[nan nan]])

今回の例は直接埋め込んでもいるので、ソースを見れば一目瞭然です。
ただし、Residual Networkのように層の数が2桁以上で構成されているネットワークを解析するのは至難の技です。

Chainerでは標準でDEBUG機能を持っています。
各レイヤーの出力にNaNが存在するかを検知します。使い方は次の通りです。環境変数「CHAINER_DEBUG」を1にします。

CHAINER_DEBUG=1 python debug.py 

出力結果は次の通りです。NaNを検出すると、Tracebackが出力されます。
Tracebackを確認するとself.l2で検知していることがわかります。
これによりself.l2を呼び出している付近を確認すれば良いと判断ができます。

Traceback (most recent call last):
  File "debug.py", line 24, in <module>
    print (model(x))
  File "debug.py", line 19, in __call__
★    return self.l2(h) ★
  File "/Users/Tereka/anaconda3/lib/python3.6/site-packages/chainer/link.py", line 242, in __call__
    out = forward(*args, **kwargs)
  File "/Users/Tereka/anaconda3/lib/python3.6/site-packages/chainer/links/connection/linear.py", line 138, in forward
    return linear.linear(x, self.W, self.b, n_batch_axes=n_batch_axes)
  File "/Users/Tereka/anaconda3/lib/python3.6/site-packages/chainer/functions/connection/linear.py", line 289, in linear
    y, = LinearFunction().apply(args)
  File "/Users/Tereka/anaconda3/lib/python3.6/site-packages/chainer/function_node.py", line 288, in apply
    raise RuntimeError(msg)
RuntimeError: NaN is detected on forward computation of LinearFunction

2. 問題のあるパラメータチェック

1のDEBUG_MODEではNaNを検出しました。
このDEBUG_MODEはあくまで各層の出力のチェックのみです。そのため、層のパラメータのどこに影響して得られたかは不明です。
当たり前ですが、数百万の数もあるパラメータを目視で確認するのは難しいです。

そのため、NaNのパラメータを再帰的に探索し、出力するコードを作成しました。
次の関数を使えば出力可能です。モデルを引数として与えれば、パラメータを出力します。

def parameter_check(model):
    for child in model.children():
        if isinstance(child, chainer.link.Link):
            for name, param in child.namedparams():
                # NaNの判定確認
                if np.isnan(param.data).any():
                    print (name)

この関数を試したコードは次のコードです。
Chainの中にChainを作り、sub_l1の変数のWにNaNを代入しました。

import chainer
import chainer.links as L
import numpy as np


class SubMLP(chainer.link.Chain):
    def __init__(self):
        super().__init__()
        with self.init_scope():
            self.sub_l1 = L.Linear(2, 2)
            self.sub_l2 = L.Linear(2, 2)

    def __call__(self, x):
        h = self.l1(x)
        return self.l2(h)


class MLP(chainer.link.Chain):
    def __init__(self):
        super().__init__()
        with self.init_scope():
            self.l1 = L.Linear(2, 2)
            self.sub_mlp = SubMLP()
            self.l2 = L.Linear(2, 2)

    def __call__(self, x):
        h = self.sub_mlp(self.l1(x))
        return self.l2(h)


def parameter_check(model):
    for child in model.children():
        if isinstance(child, chainer.link.Link):
            for name, param in child.namedparams():
                # NaNの判定確認
                if np.isnan(param.data).any():
                    print (name)


model = MLP()
model.sub_mlp.sub_l1.W.data[0] = np.nan
parameter_check(model)

出力は「/sub_l1/W」となるため、発見できています。

3. 再現性の確保

CuDNNを利用する場合、ニューラルネットワークの計算では再現性を確保できないことがあります。
CuDNNを用いて計算した場合は計算順序が担保されないことが知られています。
そのため、計算による誤差が発生し、最終的な計算結果が計算のたびに変化します。

これは、大きく精度に影響する事象ではありません。
ただし、これはデバッグ時に対処に困ることがあります。
デバッグでは、問題事象が再現できなければ、修正できたのか否かの解析が難しくなります。

このCuDNNの動作を決定的に動かす設定があります。
v2以前では、Convolution系のクラスにdetermistic引数がありましたが、v3以降では、chainer.configで設定可能です。
変更するには次のコードを実行しましょう。

chainer.config.cudnn_deterministic = True

4.Fine tuningの実施

Fine tuningは既存のモデルを初期値にして再学習する手法です。
そのため、ベースはResNetを用いて、残りの出力までのネットワークの構造を変更したいといったケースがあります。

例えば、クラス数1000のImageNetの既存モデルからクラス数2のモデルを再学習させたい場合です。
Chainerでは、このようなユースケースにも対応し、簡単に実装できます。
Fine tuningの実装は次のとおりです。
ResNet50Layersのforwardメソッドの出力を"pool5"に指定するとpool5部の出力を獲得し、後の層に繋げられます。

from chainer.links.model.vision.resnet import ResNet50Layers
import chainer
import chainer.links as L
import numpy as np


class ResNetFineTune(chainer.Chain):
    def __init__(self):
        super().__init__()
        with self.init_scope():
            self.resnet = ResNet50Layers()
            self.fc1 = L.Linear(2048, 2)

    def __call__(self, x):
        h = self.resnet.forward(x, layers=["pool5"])["pool5"]
        return self.fc1(h)


x = np.random.rand(1, 3, 224, 224).astype(np.float32)
model = ResNetFineTune()
print(model(x))

5. 実行環境の確認

実行環境の確認は重要です。デバッグ時には、CUDA/CuDNNのバージョンを確認することがあります。
例えば、CUDA/CUDNNのパスを環境変数を設定しています。
しかし、問題が発生したときにどのバージョンがライブラリ内で使われているのかを確認したいです。

> import chainer
> chainer.print_runtime_info()
Platform: Linux-4.4.0-93-generic-x86_64-with-debian-stretch-sid
Chainer: 5.1.0
NumPy: 1.15.0
CuPy:
  CuPy Version          : 5.1.0
  CUDA Root             : /usr/local/cuda
  CUDA Build Version    : 9010
  CUDA Driver Version   : 10000
  CUDA Runtime Version  : 9010
  cuDNN Build Version   : 7102
  cuDNN Version         : 7102
  NCCL Build Version    : 2115
iDeep: Not Available

まとめ

Chainerのトリックを紹介しましたがいかがでしょうか?
デバッグや再現性確認など、仕事でもすぐに使えるものが中心です。
もし、このようなことに苦心しているようでしたらぜひ使ってみてください。

では、メリークリスマス!

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com