Taste of Tech Topics

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

Elastic Stack Advent Calendar 2020(2020年のElastic Stackを振り返る)

こんにちは、アクロクエストテクノロジー株式会社でElastic Stackのコンサルティング業務を担当している吉岡です。本記事は、Elastic Stack (Elasticsearch) Advent Calendar 2020 の1日目の内容になります。

目次は以下です。

Elastic Stackリリース概要

  • Elastic Stack Version 7.6.0リリース(2020年2月)
  • Elastic Stack Version 7.7.0リリース(2020年5月)
  • Elastic Stack Version 7.8.0リリース(2020年6月)
  • Elastic Stack Version 7.9.0リリース(2020年8月)
  • Elastic Stack Version 7.10.0リリース(2020年11月)

2020年1月時点での最新バージョンはVer.7.5.1、2020年12月1日時点での最新版はVer.7.10.0です。メジャーバージョンは変わっていないので、たった5回マイナーバージョンアップしただけのように見えますが、マイナーチェンジとは思えない多くの機能が盛り込まれています。

Elastic Stackのユースケース

Elastic Stackは、Search(検索)、Observe(ログ監視)、Protect(セキュリティ)という3つのユースケースで利用されます。以降は、ユースケース別に特徴的な機能強化/新機能をまとめてみます。

■Search(1)検索機能

検索の高速化

  • Ver.7.0で一部のクエリに導入されたblock-max WANDが、Ver.7.6では日付や数値のソート処理にも適用されました。結果、ソート付きクエリのパフォーマンスが10倍以上になりました。Elasticsearchの根幹である検索が速くなるのは、クエリを利用するKibanaや各種アプリにとっても嬉しいですね。

ヒープメモリ使用量の大幅削減(同時検索性能の向上)

  • セグメント内のTerm Indexはすべての検索可能フィールドの情報を含みますが、相対的に「_id」フィールドの占めるサイズが大きくなります。Ver.7.7では「_id」のTerm Indexがヒープからディスクへ移動。ヒープメモリ使用量を大幅に削減しました。その結果、Ver.7.6以前と7.7以降ではクエリの同時検索性能が大きく改善しています。

非同期検索のサポート

  • Elasticsearchは高速検索が求められるケースでよく利用されますが、高速検索を必要としないユースケースも存在します。例えば、大量データをフィルタリングなしで集計するような重いバッチ統計処理であったり、安価なストレージ(HDD)を搭載したDataNodeに対する検索などです。Ver.7.7で登場した非同期検索は、これらのユースケースに最適です。
  • 非同期検索のタイムアウトはデフォルトで5日間(長い!)。クエリが完了しなくても途中までの結果を部分的に取得することも可能。ちなみに、Kibana Ver.7.7から、DashboardとDiscoverは非同期検索に対応しています。(一定時間内にクエリが完了しないと、処理が完了するまで非同期検索を続けるかどうかの確認ダイアログが表示される)

■Search(2)エンタープライズ検索

エンタープライズ検索ソリューションの整理

  • Ver.7.6において、SaaSサービス検索を実現する「Enterprise Search」を「Workplace Search」に名称変更。
  • エンタープライズ検索のソリューション名を「Elastic Enterprise Search」とし、これまでバラバラだった3つの製品をElastic Enterprise Searchの下に位置付けるように変更。(ようやくElasticの検索製品群がきれいに整理されました)

- App Search(アプリ検索)
- Site Search(Webサイト検索)
- Workplace Search(SaaSサービス検索)

Enterprise SearchがKibana UIと統合

  • Kibana Ver.7.9から、Enterprise SearchがKibana UIから利用可能になりました。(Kibanaのメニューがさらに縦長に・・・)

■Observe(1)ログ監視/可視化

新アラートフレームワークの統合

  • これまでElastic StackのAlertingはすべてWatcherが担っていました。が、利用した方は分かると思いますが、シンプルな閾値通知以外は複雑なJsonを実装する必要があり、生産性も保守性も高くありません。そこで、Kibanaに新しいアラートフレームワークが導入されました。このアラートフレームワークは、Kibanaの各種機能と統合され、SIEM、APM、Metrics、Uptimeなどの各機能画面からアラートをUIから簡易に作成することができるため非常に便利です。

ダッシュボード連携機能

  • Kibana Ver.7.8でダッシュボード間のドリルダウン機能が実装され、複数ダッシュボードを活用したデータ分析が容易になりました。また、Ver.7.10ではドリルダウン機能にWebアプリへのURL連携機能が追加されました。

■Observe(2)機械学習による異常検知

教師あり機械学習の強化

  • これまではモデル構築/評価までしか対応できませんでしたが、Ver.7.6で「Inference Processor」が実装され、推論も可能になりました。例えば、Ver.7.6で標準搭載の109言語に対応した「言語識別モデル」を利用すると、多言語のテキストデータをElasticsearchに登録するタイミングで言語を推論し、言語毎に別のインデックスに登録するなどが非常に簡単に実現できます。

サービスヘルス監視機能

  • Ver.7.8から、Elastic APM機械学習が算出するヘルス指標を各種サービスマップに追加する機能が新規追加。

■Protect(1)セキュリティ分析

プレビルド検知ルール

  • Elastic SIEMはVer.7.6から大きく進化します。このバージョンでは機械学機能が統合されたSIEM検知エンジンおよびMITRE ATT&CK™ナレッジベース準拠のプレビルド検知ルールがリリース。クエリ/モデルベースの異常検知によりマルウェア等の自動検知ができるようになりました。以降、バージョンアップの度に様々なルールが追加され、Ver.7.10時点で316個のプレビルドルールが搭載されています。

ケースマネジメント機能

  • SIEMのTimeline機能で脅威の調査を行い、必要に応じてKibanaから外部のインシデント管理システムに起票や更新ができます。Ver.7.7では対応ツールはServiceNowITSMだけですが、以降のバージョンでJIRA/IBM Resilientにも対応します。

Elastic Agent

既存のBeatsの統合エージェントとして、Ver.7.9からElastic Agentが導入されました。Elastic AgentはElastic Securityの要となる重要機能で、3つの特徴があります。

  1. セットアップコストが低い:1種類のエージェントで40種類以上のデータを収集可能であり、1コマンドでセットアップ可能(収集データに合わせて必要ファイルを自動ダウンロード)
  2. メンテナンスコストが低い:全てのエージェントをKibanaで一元管理可能であり、Kibanaからエージェントのバージョンアップ/設定変更(例:取得データの追加)が可能
  3. データ加工処理を自動実行: データ送信時にElastic Common Schemaへ自動でデータ加工し、多様なデータソースを横断的に検索可能

Endpoint Securityの一部がBASICライセンスで利用可能に

  • Ver.7.9から、Endpoint Securityの一部がBASICライセンスで利用可能になりました。

Event Query Language(EQL)の導入

  • Ver.7.9でセキュリティイベント検索用言語としてEQLを導入。EQLは時系列の複数ドキュメントに跨った条件を検索することができ、サイバー攻撃をしかけるマルウェア等の特徴的な活動をルール化/検知が可能になります。Ver.7.10では検知ルールの定義にEQLがサポートされ、柔軟に検知ルールをカスタマイズすることができます。

まとめ

2020年のElastic Stackを振り返って、特徴的な機能強化/新機能をピックアップしてみました。Search(検索)、Observe(ログ監視)、Protect(セキュリティ)、3つのユースケースが満遍なく強化されていますが、特にセキュリティに関しては機能追加のスピードが速く、目が離せません。

Elastic Stack

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

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

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

【データ分析】
Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

Azure Cognitive Searchのコグニティブスキルを使った自動でフィルタ検索

皆さんこんにちは。@Ssk1029Takashiです。
気づけば今年もあとわずかになってきて、一年の早さを感じますね。

以前、GiNZA+Elasticsearchを使って固有表現抽出を使ったタグ検索のデモを作成しました。
acro-engineer.hatenablog.com

ただ、デモというのは何より早さが必要な場合もあります。
その場合だと、なるべくプログラミングを減らして、作成したいと思うこともあります。
今回は、Azure Cognitive Searchを使って、上記のような内容を、一切プログラミングせずに実現してみます。

Azure Cognitive Searchとは

Azure Cognitive Searchとは、名前の通りAzure上の検索サービスです。
特長としては、AIエンリッチメントという拡張機能を備えており、機械学習を活用したリッチな検索システムを簡単に実現できます。
docs.microsoft.com

AIエンリッチメントについて

この機能は、データソースから検索データを投入するときに、コグニティブスキルというAzure上の機械学習連携機能を使って、データから検索に使うデータを抽出できる拡張機能です。
例えば、エンティティ認識スキルを使えば、文書から自動で場所や人などを抽出して、データに持たせることができます。
f:id:acro-engineer:20201108211428p:plain
docs.microsoft.com

データ投入準備

Azure Cognitive SearchはAzure Blob StorageやCosmos DBなどのデータ連携がサポートされています。
詳細な連携先サービスは以下のURLのページに記載されています。
docs.microsoft.com

今回は、Blob Storageにファイルを配置して、その内容を検索できるようにします。
Blob Storageにこのブログの内容を張り付けたテキストファイルをアップロードします。
f:id:acro-engineer:20201109004757p:plain

検索データを投入する

検索データの連携は基本的なものならGUIから操作することが可能です。
Azure PortalのAzure Cognitive Searchの画面から「データのインポート」を選択することで、設定画面に移行します。
f:id:acro-engineer:20201109010824p:plain

ここから、以下の項目を設定することで、インデックスを作成することができます。

連携するBlob Storageのコンテナ

検索対象のファイルが配置してあるBlob Storageの場所を設定します。
f:id:acro-engineer:20201109013409p:plain

適用するコグニティブスキル

データ投入時に機械学習を使って抽出したい内容を選択します。
f:id:acro-engineer:20201109020246p:plain
組み込みのコグニティブスキルは以下のURLで一覧が示されています。
docs.microsoft.com

インデックスのフィールドと型

どのようなデータ構造でデータを投入するかを設定します。
各フィールドの名前・検索対象可能か・フィルター可能か・集計可能か・ソート可能かを設定します。
変更点としては、locationsなどのコグニティブスキルで抽出したフィールドは、フィルターで表示したいので、フィルター可能・ファセット可能に設定します。
f:id:acro-engineer:20201109233603p:plain

ここまで設定すれば、後はインデクサー名とスケジュールを設定すればデータのインポートが実行されます。

作成されたデータを見てみる

それでは投入された結果のデータを一部見てみましょう。
Searchサービスの「概要」から「検索エクスプローラー」を選択することで、簡易的にクエリを打ってデータを確認することができます。
f:id:acro-engineer:20201127010457p:plain

    {
            "@search.score": 1,
            "content": "皆さんこんにちは。\r\n@tereka114です。\r\n\r\n今週からCVPR2020がはじまりました。\r\n本記事では初日と2日目に参加したWorkshop/Turtorialを紹介します。\r\n\r\nf:id:acro-engineer:20200616135912p:plain\r\nCVPR2020\r\nCVPR2020の正式名称は「Computer Vision and Pattern Recognition」です。\r\n6月14日〜19日まで開催されています(時間はPDT)\r\nこれは、アメリカのコンピュータビジョンの国内学会で、毎年非常に盛り上がっています。\r\n\r\n今回、私は1年ぶりに参加しています。\r\nコロナウィルスの影響で現地開催ではなく、バーチャル開催になりました。\r\nPDT(日本から16時間遅れ)の時間とそれから12時間後に動画が放送されています。\r\n\r\n日本にいながら、私はシアトル時間で参加しています。\r\n普段の現地参加と異なり、太陽の時間がずれているので、体調を整えるのが難しい感覚です。\r\n\r\n\r\ncvpr2020.thecvf.com\r\n\r\n自動運転技術の基本を学べるチュートリアル\r\n初日はチュートリアル「All About Self-Driving」に参加しました。\r\n\r\nwww.allaboutselfdriving.com\r\n\r\nこのチュートリアルでは、Zoomのセミナー機能を利用し、既に収録されている動画が放映されます。\r\n途中でSlidoから質問を拾い、質疑応答を行っていました。\r\n\r\nこのチュートリアルは、自動運転技術に必要なことを包括的に紹介していました。\r\n例えば、ハードウェア(LiDAR、RADERなど)からソフトウェア(物体検出、予測、コントロール方法など)のそれぞれの種類と長短の説明がありました。\r\n私自身、自動運転技術の細かいハードウェアや方式にはあまり馴染みがないところもあったので、新しく得られた学びも多かったです。\r\n\r\nf:id:acro-engineer:20200615102403p:plain:w720\r\n2日目:深度推定と最適化\r\n2日目は午前と午後で異なるセッションに参加していました。\r\n\r\nLearning and understanding single image depth estimation in the wild\r\n公式ページで動画が公開されているので、それを見てました。\r\n質問は発表時間中にリアルタイムで受け付けていました。\r\n\r\n単眼深度推定のチュートリアルで、深度推定を行う上での仕組み(視差)、データセット、そして、各種アルゴリズムの紹介が行われていました。\r\n新しい分野でも包括的に学べて、資料も公開され、後で振り返られるのが良いところです。\r\n\r\n\r\nsites.google.com\r\n\r\nf:id:acro-engineer:20200616142257p:plain:w720\r\nFrom NAS to HPO: Automated Deep Learning\r\nこのチュートリアルはハイパーパラメータとアーキテクチャのチューニングの話です。\r\n機械学習には多くのハイパーパラメータが存在し、そのパラメータを調整する方法も知られています。\r\nまた、最近だと、ニューラルネットワークの構造を自動的に計算する方式もあるので、その件も紹介されていました。\r\n\r\nハンズオン付きで実装もあるので、いざ試してみたい!と思った時に便利そうなのはありがたいことです。\r\n\r\nhangzhang.org\r\n\r\nf:id:acro-engineer:20200616142437p:plain:w720\r\n最後に\r\n明日からCVPRのメインカンファレンスです。\r\n前年よりも論文数が多く、盛り上がっているなぁと感じています。\r\nぱっと見面白そうな論文も見られるので、きちんと読んで楽しみたいと思います!\n",
            "metadata_storage_path": "aHR0cHM6Ly9zZWFyY2hzb3VyY2UuYmxvYi5jb3JlLndpbmRvd3MubmV0L3NvdXJjZS1maWxlL0NWUFIyMDIwJUU1JThGJTgyJUU1JThBJUEwJUU4JUE4JTk4JUUzJTgwJThDJUU1JTg4JTlEJUUzJTgyJTgxJUUzJTgxJUE2JUUzJTgxJUFFJUUzJTgzJTkwJUUzJTgzJUJDJUUzJTgzJTgxJUUzJTgzJUEzJUUzJTgzJUFCJUU5JTk2JThCJUU1JTgyJUFDJUUzJTgwJTgxJUUzJTgzJTgxJUUzJTgzJUE1JUUzJTgzJUJDJUUzJTgzJTg4JUUzJTgzJUFBJUUzJTgyJUEyJUUzJTgzJUFCJUUzJTgxJThDJUU1JTg1JTg1JUU1JUFFJTlGJUUzJTgwJThEJTIwJTIzY3ZwcjIwMjAudHh00",
            "people": [],
            "organizations": [],
            "locations": [
                "アメリカ","日本","シアトル"
            ],
            "keyphrases": [
                "まし","チュートリアル","acro-engineer","plain","現地参加","紹介","自動運転技術","w720","シアトル時間","動画","CVPR2020","ハイパーパラメータ","現地開催","単眼深度推定","発表時間中","質問","初日","ハードウェア","方式","バーチャル開催","こと","公開","PDT","日本","ところ","コントロール方法","楽しみたい","論文数","Automated Deep Learning","Learning and understanding single image depth estimation in the wild","Computer Vision and Pattern Recognition","リアルタイム","From NAS to HPO","物体検出","All About Self-Driving","国内学会","利用","データセット","ソフトウェア","予測","仕組み","名称","アーキテクチャ","受け付け","20200615102403p","20200616142257p","20200616142437p","コンピュータビジョン","セミナー機能","質疑応答","アメリカ","視差","構造","拾い","RADER","各種アルゴリズム","Zoom","コロナウィルス","影響","チューニング","存在","太陽","基本","20200616135912p","毎年","種類","計算","LiDAR","Slido","収録","ずれ","調整","馴染み","Workshop","Turtorial","自身","ニューラルネットワーク","機械学習","新しく得","学び","ハンズオン付き","実装","体調","長短","説明","思い","本記事","ページ","放送","最適化","セッション","カンファレンス","感じ","感覚","資料","はじまり","放映","分野","皆さん","tereka114","最後"
            ],
            "language": "ja"
        }

これを見ると、locationsで国名などを拾えていることがわかります。

キーフレーズは、「チュートリアル」や「CVPR2020」などの重要単語は拾えていますが、「こと」や「はじまり」などの意味のない単語も拾ってしまっているようです。
この辺は今後の精度改善に期待ですね。

デモアプリを作成する

Azure Cognitive Searchでは、GUI操作だけで検索画面を見るためのデモアプリを作成することができます。
Cognitive Searchの概要の画面から、「インデックス」→「デモアプリの作成」を選択することで、作成画面に移動します。
以下の項目を表示したい内容に沿って、設定します
1. 検索結果に表示する内容
f:id:acro-engineer:20201127012818p:plain
2. フィルターに表示する内容
ここでコグニティブスキルで抽出したフィールドを設定します。
f:id:acro-engineer:20201109234119p:plain
3. ドロップダウンで表示する内容
f:id:acro-engineer:20201109234208p:plain

これらを設定すると、HTMLファイルをダウンロードすることができます。
ブラウザで表示すると、簡易的なデモアプリを表示することができます。
f:id:acro-engineer:20201127012300p:plain

この画面で、キーワード検索・フィルターでの絞り込みが可能です。

ここまでで、一切プログラミングをすることなく、フィルターで絞り込みができるデモアプリが作成できました。
ほぼGUIの操作のみで、作成できたので、非常に簡単でした。

まとめ

今回はAzure Cognitive Searchの機能を使いながら、簡単に機械学習によるテキスト抽出を使ったタグ検索デモを作成しました。
サービスの機能を使うことで、一切プログラミングすることなくデモまで作成することができました。
もちろん、あくまでデモは簡易的な画面なので、画面開発は必要かと思いますが、検索結果のイメージをなるべく早く見せたいなどのケースでは重宝しそうです。
皆さんもぜひ使ってみてはいかがでしょうか?

それではまた。

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

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

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

【データ分析】
Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

Azure Cognitive SearchとComputer Vision APIを使って類似の画像を検索してみる

こんにちは、@shin0higuchiです😊

今回のテーマは、「Azure Cognitive Searchでの画像検索」ということで、
写真から似たものを探す類似検索
の仕組みを作ってみます。
背景として、アクロクエストではElasticsearchを使い込んでおり、テキスト検索を扱う機会は多いのですが、
近頃は画像による検索ニーズも高まってきており、手早く実現するにはどうするのが良いかを知りたいという課題感がありました。

どういったユースケースでニーズがあるかというと、例えば買い物時の商品検索です。
買い物をする時、「画像で類似検索ができたら」と思うことがあります。
棚に並んでいるものの名前がわからなくても、写真で探せたらとても便利ですよね?

今回は、Azure と 簡単なPythonコードで実装してみました。
大まかに下記の流れで進めます。

1. Blobストレージアカウント/コンテナを作成し、画像をアップロードする
2. Cognitive Searchのインデックスを作成し、Blobコンテナのデータを取り込む
3. Computer Vision API を準備する
4. 各APIを叩くための簡単なPython スクリプトを書く

前提:Azure Cognitive Search とは

Azureであらゆるデータを取り込み、大規模検索をするためのクラウドサービスです。
AI機能も組み込まれており、複雑な検索を簡単に実現できることが売りとなっています。
下図のように、Azure上の様々なデータソースからドキュメントを生成し、検索できるようにしてくれます。
構造化されていないデータや、PDFなどの文書まで簡単に検索できるのは嬉しいですね。

https://docs.microsoft.com/ja-jp/azure/search/media/cognitive-search-intro/cogsearch-architecture.png
azure.microsoft.com

1. Blobストレージアカウント/コンテナを作成し、画像をアップロードする

Blobコンテナの作成

Azure Portal からストレージアカウントを作成し、Blobコンテナを作成します。
ここでは、"images" という名前のコンテナを作成しています。
f:id:acro-engineer:20201108230909p:plain:w500


今回はサンプルとして、次の画像18枚をアップロードしてみます。(画像は全て PNG 画像となっています)
ホームセンターで探し物が見つからず歩き回ったことがあったので、そのイメージです。
(その時は所定の場所ではなく、入口前の特別コーナーにあったというオチでした)
f:id:acro-engineer:20201108224313p:plain:w500

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

2. Cognitive Searchのインデックスを作成し、Blobコンテナのデータを取り込む

ここからが、Cognitive Search の準備になります。
Cognitive Search はLuceneベースの検索エンジンとなっており、
「インデックス」と呼ばれるデータ構造で取り込んだデータを保持し、検索する形です。

3インデックスまでは無料プランで利用できるようなので、今回はそちらで試すことにします。

あとは、「データのインポート」のメニューから取り込み時の設定を行います。

データソース (Blobコンテナ) を選び...
f:id:acro-engineer:20201115024459p:plain:w800
エンリッチメントの追加を選択します。
f:id:acro-engineer:20201115024617p:plain:w800

するとOCR を有効にし、すべてのテキストを merged_content フィールドにマージする」といったチェックボックスや、
「画像の認知技術」というチェックボックスが表示されるので選択します。
ここで、内部的にはCognitive ServeicesのComputer Vision APIが利用されています。
f:id:acro-engineer:20201115024737p:plain:w400


最後に、それぞれのフィールドに対するAnalyzerを選択するとインデックスが作成されます。
なお、日本語Analyzerには「Lucene」と「Microsoft」の2種類がありましたが、その辺りの確認はしていません。今回は本題ではないので割愛します。
f:id:acro-engineer:20201115025206p:plain:w800



自動的に検索用のエンドポイントも作成されるので、実際にインデクシングされたドキュメントを確認してみます。
たとえばサンダルの画像は、次のようなJSONになっています。 OCRを有効化したので画像中の文字列を抽出してくれているほか、imageTagsを良い塩梅に振ってくれています。(imageCaption はイマイチ。物が単体で映っている画像には不適?)
画像中にある "HAMMER" という文字列を、OCRチェックボックスを選んでおくだけで抽出してくれるのは凄いですね。
f:id:acro-engineer:20201108235910j:plain

{
            "@search.score": 1,
            "content": "\n",
            "metadata_storage_content_md5": "v90y4cHYAZDVfbz0smxplw==",
            "metadata_storage_name": "16.jpg",
            "metadata_storage_path": "aHR0cHM6Ly9zYW1wbGUyMDIwMTEuYmxvYi5jb3JlLndpbmRvd3MubmV0L2ltYWdlcy8xNi5qcGc1",
            "merged_content": " HAMMER \n",
            "text": [
                "HAMMER"
            ],
            "layoutText": [
                "{\"language\":\"en\",\"text\":\"HAMMER\",\"lines\":[{\"boundingBox\":[{\"x\":67,\"y\":102},{\"x\":103,\"y\":91},{\"x\":106,\"y\":102},{\"x\":70,\"y\":112}],\"text\":\"HAMMER\"}],\"words\":[{\"boundingBox\":[{\"x\":68,\"y\":103},{\"x\":103,\"y\":92},{\"x\":107,\"y\":102},{\"x\":70,\"y\":112}],\"text\":\"HAMMER\"}]}"
            ],
            "imageTags": [
                "black",
                "shoe",
                "footwear",
                "sneaker"
            ],
            "imageCaption": [
                "{\"tags\":[\"table\",\"sitting\",\"keyboard\",\"computer\",\"desk\",\"phone\",\"mouse\",\"laying\",\"cat\"],\"captions\":[{\"text\":\"a close up of a keyboard\",\"confidence\":0.64379424287271192}]}"
            ],
            "imageCelebrities": []
        }

3. Computer Vision API を準備する

これで画像検索の準備はできました。
ただし、検索APIが受け付けるクエリは文字列形式であるという問題があります。
今回は、Azure Cognitive Serviceの一つであるComputer Vision API を用いて、検索したい画像のタグやキャプションを取得し、それをCognitive Searchに投げる作戦で行きます。

さて、Computer Vision APIについても、Azure Portalから作成しました。
特に難しい設定もないので楽チンです。
気になる料金ですが、無料のプランでもそれなりに遊んでみることができそうです(執筆時点では、"20 Calls per minute, 5K Calls per month" だそうです)。

f:id:acro-engineer:20201109000917p:plain

4. 各APIを叩くための簡単なPython スクリプトを書く

今回はGoogle Colaboratory上で動かしてみました(Azure じゃないんかい!という突っ込みが聞こえてきそうですが、特にGoogleにした理由はありません。好みの問題です。)
各サービスを呼び出すサンプルコードは、公式のドキュメントに載っているのでそちらを参考にするのが良いと思います。

4-1 ライブラリのインストール

Cognitive Search および Blob Storageを扱うためのライブラリをインストールします。

!pip install azure-search-documents
!pip install azure-storage-blob

4-2 Computer Vision API による解析

ここでは検索したい軍手の画像 (sample.jpg) を Computer Vision APIに食わせて、タグとキャプションを取得します。

import os
import requests
import sys
%matplotlib inline
import matplotlib.pyplot as plt
from io import BytesIO
from PIL import Image

# colaboratory上での画像パスは /content/sample.jpg
local_path = "/content/"
local_file_name = "sample.jpg"
image_path = os.path.join(local_path, local_file_name)
image_data = open(image_path, "rb").read()
image = Image.open(BytesIO(image_data))
plt.imshow(image)

sample.jpg(軍手の画像)が表示されることを確認し...
f:id:acro-engineer:20201115030225p:plain


Computer Vision APIを呼び出してsample.jpgの解析結果を受け取ります。

# Compouter Vision APIを呼び出し、画像解析結果(タグやキャプション)を得る
subscription_key = "<Computer Vision APIのキー (ポータルで確認する)>"
endpoint = "https://sample202011.cognitiveservices.azure.com/"
analyze_url = endpoint + "vision/v3.1/analyze"
headers = {'Ocp-Apim-Subscription-Key': subscription_key, 'Content-Type': 'application/octet-stream'}
params = {'visualFeatures': 'Categories,Description'}  # 今回はCategories使わないですが、使いたい場合もあると思うので。
response = requests.post(analyze_url, headers=headers, params=params, data=image_data)

# 結果をパース
analysis = response.json()
tags = analysis['description']['tags']
image_caption = analysis["description"]["captions"][0]["text"].capitalize()

# 解析結果の表示
print("tags: {}".format(tags))
print("caption: {}".format(image_caption))

結果が取れました。タグは 'handwear' で良い感じですね。キャプションは。。。うん、ユーモラスですね。嫌いじゃないです(違う)。
f:id:acro-engineer:20201115030343p:plain

4-3 Cognitive Search での検索

いよいよCognitive Searchで検索結果を取得してみます。
ここでは先ほどの画像解析で得られた 'handware' で検索をかけて見ましょう。

from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient

# cognitive search の検索クライアントを定義
index_name = "azureblob-index";
endpoint = 'https://cognitive-search-sample.search.windows.net/'
key = '<Cognitive Searchのアクセスキー>'
credential = AzureKeyCredential(key)
client = SearchClient(endpoint=endpoint,
                      index_name=index_name,
                      credential=credential)

# 検索結果の上位5件のファイル名を取得する
results = client.search(search_text=tags, top=5) # 今回はタグ (handware)で検索

# 検索結果をBlobから取得するための設定
container_name = "images"
connect_str = "<コンテナの接続文字列>"
blob_service_client = BlobServiceClient.from_connection_string(connect_str)

# 検索結果のファイル名を使って、Blobから画像を取得して表示する
for result in results:
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=result['metadata_storage_name'])
    image = Image.open(BytesIO(blob_client.download_blob().readall()))
    plt.imshow(image)
    print(result['metadata_storage_name'])
    plt.axis("off")
    plt.show()

f:id:acro-engineer:20201109002803p:plain

しっかり軍手が取得できていますね。
めでたしめでたし。

まとめ

  • Azure Cognitive Searchを用いて、類似した画像の検索を手軽に実装することができた。(サンプル探しも含めて2,30分くらい)
  • 実際にスマホで写真を撮るなら、背景に他の物が写るケースが多いと思うので、対応できるか要確認です
  • 今回はimageTagsを使いましたが、HAMMERのように画像中の文字列で検索するのも面白いかもしれません
  • 細かいスコアリングや、Analyzerの設定にはフォーカスしなかったが、もっと突き詰めると良い検索が実現できそう
  • ドキュメントを読み切れていないので、もっと良い使い方などはありそうです。お気づきの点があったら是非教えてください


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

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

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

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

【データ分析】
Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

ElasticON Security Japanに参加してきました!

こんにちは、ノムラです。

Elastic社のイベントである、「ElasticON Security Japan」が11/05に開催されました。
最近は各ソリューション毎のElastic社のイベントが多く開催されており、新しい知識や刺激を得る機会が多く、とても充実しています。

今回のイベントもオンライン上の開催となり、専用のウェブサイト上で配信を観たりコミュニケーションを取れる形式となっています。
f:id:acro-engineer:20201106053845p:plain:w800

増大するセキュリティリスクに対して、どのようにElastic Stackを活用していくかについて、
テクニカルセッションとユーザ事例のセッションの発表がありました。

カンファレンス概要

アジェンダ

  1. オープニング
  2. 基調講演 Elastic Security その進化とビジョン
  3. Elastic Security 包括的な可視性の確立
  4. 脅威検知を自動化する
  5. Elastic Security Operationalize
  6. ユーザ事例
  7. クロージング

今回はその中で、

  • 基調講演 Elastic Security その進化とビジョン
  • Elastic Security 包括的な可視性の確立
  • ユーザ事例

についてご紹介します。

セッション内容

1. 基調講演 Elastic Security その進化とビジョン

Elastic Securityの概要や、今後のビジョンについてのセッションでした。

概要

昨今のセキュリティ課題に対して、Elastic Securityがどのように対応していくかについての紹介でした。
f:id:acro-engineer:20201106055956p:plain:w460f:id:acro-engineer:20201106060011p:plain:w460

今後のビジョン

既存のWindowsLinuxの端末のOSに追加して、より広域なユースケースへの適用を打ち出していくそうです。
f:id:acro-engineer:20201106061431p:plain:w800

DNSやネットワーク機器等の社内に構築されたセキュリティ基盤からクラウドサービス等へも適用可能なため、非常に広いユースケースに対応していると思いました。

2. Elastic Security 包括的な可視性の確立

次は、セキュリティのデータ分析に関する4つの課題に対して、どのようにElastic Securityを活用し対応するかについてのセッションでした。
f:id:acro-engineer:20201106063202p:plain:w800

どんなデータを収集するか/どのようにデータを収集するか

データ収集はElastic Agentを活用することで、よく利用されるプロダクトのログは簡単に収集を開始することができます。
もちろんECS(Elastic Common Schema)に合わせてデータを登録することで、オリジナルフォーマットのログであっても分析することが可能です。
f:id:acro-engineer:20201106064627p:plain:w800

私自身試しに触ってみた際に、端末へのエージェントのインストールから収集開始までが非常に簡単だったこと(Windows OSへの適用は5分位で可能でした)はとても驚きました。

どのようにデータを管理するのか?

Hot-Warmアーキテクチャを有効に活用することで、効率的にデータを管理することが可能です。
また去年からFreezeインデックスも利用可能となり、より大量のデータを保持/管理することが可能となりました。
詳しくは下記ブログをご参照ください。
www.elastic.co

どのように実行可能にしていくか?

現状で200以上標準で用意されている、検知ルールを活用することで、多様な攻撃を検知することが可能です。
またカスタマイズルールも作成可能なため、標準機能だけでは網羅できない部分もカバーできるようになっています。
f:id:acro-engineer:20201106071143p:plain:w800

3. ユーザ事例の紹介

①Elastic Cloud を利用したセキュリティ監視の事例(横河電機株式会社 塩崎氏)

外部委託していたセキュリティ監視業務を、Elastic Cloud + Elastic Securityを活用することでグローバルで統合した事例の紹介でした。
グローバルの各拠点毎に異なるソリューションを利用しセキュリティ監視を行っていたため、統合的に監視することが可能なElastic Stackを採用したとのことです。
f:id:acro-engineer:20201106073505p:plain:w460f:id:acro-engineer:20201106075001p:plain:w460

また個人的に気になったのは収集したデータの可視化/分析の部分です。
全てのリージョンを一覧で可視化した、Overviewのダッシュボードから各リージョン、各製品毎のダッシュボードへドリルダウンしていく構成は、
先日のElasticON Globalのブログでも記載したダッシュボード同士を移動できるドリルダウン機能が活用されているのかな、と想像を膨らませていました。
(ElasticON Globalについては下記のブログをご覧ください)
acro-engineer.hatenablog.com
acro-engineer.hatenablog.com

②大規模スレットインテリジェンス基盤の運用事例 Elasticセキュリティ活用ケース紹介(株式会社ラック 山城氏、ザナシル アマル氏)

グローバルに設置したハニーポッドへの攻撃ログの分析基盤として、Elastic Stackを採用した事例についての紹介でした。

この事例紹介では特になぜElastic Stackを採用したのか?という点についての話が勉強になりました。
f:id:acro-engineer:20201106080556p:plain:w800

コスト面だけでなく、様々な切り口からの可視化、データ投入後のデータ加工が可能であるため、Elastic Stackを採用したとのことでした。
私自身も普段Elastic Stackを活用している中で感じるメリットの1つです。

まとめ

今回ご紹介できなかった、他セッションではElastic Securityの検知ルールの詳細や、検知ワークフローについて紹介されているので気になった方は後日ビデオが公開されると思いますので、是非ご覧ください。

簡易にデータ収集/分析を始めることができ、かつ非常に多くの検知ルール、検知用機械学習ジョブが標準で利用可能なElastic Securityは非常に強力なソリューションだと思いました。
現場で実際に活用できるように、引き続き情報を仕入れていきたいと思います。

それでは。

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

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

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

世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

Rustでトライ木による辞書検索のベンチマークをとってみた

こんにちは
アルゴリズム関係の勉強が趣味のmaron8676です。

今回は、Rustでトライ木のベンチマークをとってみた結果を紹介します。

プログラムの速さを考える際に、アルゴリズムやデータ構造は重要な要素となります。
自然言語処理を勉強している中だと、トライ木と呼ばれるデータ構造が辞書検索タスクに有効であると良く言われます。
そこで実際どのくらい速さに違いが出てくるか確かめようと思い、最近勉強しているRustを使って、トライ木のベンチマークをとってみました。

1. プログラミング言語 Rust

簡単にRustについて紹介しておきます。
Rustは、2010年に登場した、比較的新しいプログラミング言語です。
比較的新しいコンパイル言語という点でGo言語と似たような立ち位置ですが、それと比べると

  1. Rustはより低レイヤのチューニングが行えるため、実行速度を上げやすい
  2. パターンマッチングなど、言語機能が充実している

といった良さがあります。

2. トライ木

トライ木は木構造と呼ばれるデータ構造です。
保存されたパターンの中で、先頭からの最長一致を検索する処理に優れています。
辞書検索タスクを行う場合の、データの保存形式を示したのが図1です。

各ノードが1つの文字列を表しており、ルートノードが空文字に相当するノードになります。
ノードの下についている数字は、単語に紐づけられた値で、実際の応用においては品詞情報などになります。
数字がついていないノードは、辞書登録されていない文字列と対応します。

また、各ノードは、より短いプレフィックスを表すノードの子になるよう構成されます。
例えば、teaのノードは、teノードの子になっています

プレフィックスを検索する際には、根のノードから入力と一致するノードをたどっていきます。
たどるノードがなくなった時点で見ているノードが、最も長いプレフィックスを表すノードとなります。

例えば、図1に対してteapotという文字列から最も長いプレフィックスを探す場合は、
「t」「te」「tea」と順にノードをたどります。次のノードがないため、最も長いプレフィックスは「tea」だと分かります。

トライ木の図表現

図の引用元 トライ (データ構造) - Wikipedia

3. ベンチマークの比較対象

トライ木からの検索と実行速度を比較する対象として、以下の2つを準備しました。

  1. 二分探索
  2. ハッシュ探索

4. ベンチマークタスク

トライ木が有効なベンチマークタスクとして、辞書への最長一致を使った分かち書きを採用しました。
行う処理としては、以下になります。

  1. 文字列を入力とし、文字列が空になるまで処理を繰り返す。
  2. 辞書の中で一致する最も長い単語を検索する。見つからない場合は、入力文字列の1文字目が見つかったこととする。
  3. 見つかった単語で入力文字列を分割し、分割結果の後ろの文字列を入力として、1に戻る。
  4. 分割結果を出力する。

辞書の大きさは10万語とし、MeCab辞書から一部の名詞を抽出することで作成しました。
問題を簡潔にするために、単語表記は全てひらがなとしています。

また、実行環境は以下のようにしました。

OS Core i5 10400F
メモリ 16GB
GPU GTX Geforce 1650

トライ木による探索では、探索途中において最長一致する文字数が分かるようになっており、そこで処理を打ち切ることができます。
ハッシュ探索では、「1文字目」、「1~2文字目」、「1~3文字目」といった全てのパターンについて検索を実行しないと、
最長一致する文字列を特定することができません。
※事前情報として辞書登録された語の最大文字数が分かっていない場合を想定しています

5. ベンチマーク結果

結果は図2, 3のようになりました。
トライ木による探索を使った場合のタスク実行時間は、ハッシュ探索の場合の約半分となっています。
理由としては、「ベンチマークタスク」でも書いた、「最も長いプレフィックスを素早く検索できる」ことが主なものだと考えられます。

f:id:acro-engineer:20201023091847j:plain
二分探索を使った場合のタスク実行時間
f:id:acro-engineer:20201007080940j:plain
ハッシュ探索を使った場合のタスク実行時間
f:id:acro-engineer:20201007081020j:plain
トライ木を使った場合のタスク実行時間

6. まとめ

トライ木を用いるのが有効と言われているタスクに対するベンチマークをRustで実行し、
ハッシュ探索を用いた場合より速くなることを実際に確認することができました。
Rustは細かいチューニングまで行えるため、ベンチマーク対象間の検索処理以外の違いを少なくできました。
アルゴリズムの選択ミスはやっかいなバグです。
データが小さい時には問題なく動作してもデータが大量になったときに致命的な問題となります。
そのため、データの特徴に合わせて適切なアルゴリズムを選択することが重要ですね。

7. 使用したライブラリの紹介

radix_trie: トライ木のRust実装
GitHub - michaelsproul/rust_radix_trie: Fast generic radix trie implemented in Rust

Criterion: Rustでベンチマーク計測を行うためのツール
GitHub - bheisler/criterion.rs: Statistics-driven benchmarking library for Rust

8. 今回の検証にあたり作成したプログラム

github.com

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


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

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

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

ElasticON Global 2020 最速レポート!2

こんにちは、ノムラです。

以下の最速レポートの続きになります。
acro-engineer.hatenablog.com

私からは「ElasticON Global 2020」のセッションのうち、Keynote以外の各セッションのうち面白かったものをご紹介します。

セッション内容

Security analytics with Elastic at Square Enix

あのSquare Enixのセッションで、データ分析、SIEM関連の内容でした。

このセッションで印象的だったのは当初はデータ分析のために、導入をしたElastic StackがSIEMにおいても価値を発揮した、ということです。
Elastic Stackが多方面の課題を解決できる機能を備えたツールであり、かつ拡張性が高いからこその話だと思いました。
f:id:acro-engineer:20201015234723p:plainf:id:acro-engineer:20201015233847p:plainf:id:acro-engineer:20201015233854p:plain

1つのツールで検索、データ分析、機械学習、SIEM等様々な要件に対応でき、複数の軸において、利益を得ることができるのはElatic Stackの大きな強みだと思います。

Securing the Elastic Stack for free

昨年ElasticsearchのSecurity機能の一部がBASICライセンスで利用可能となりました。(詳細については以下のブログをご覧ください)
www.elastic.co

本セッションはそのBASICライセンスで利用可能な機能についての解説でした。
個人的にはRBACとSpaceを用いた権限管理についてデモも交えながらの解説で勉強になりました。
f:id:acro-engineer:20201015225008p:plainf:id:acro-engineer:20201015225245p:plain

Advanced tips for visualizing and presenting data in Kibana

本セッションは去年末に登場したKibana Lens、7.8で登場したダッシュボード同士を移動できるドリルダウン機能を用いた可視化についての解説でした。
特に今後利用したいと思ったのは、ダッシュボード同士を移動できるドリルダウン機能です。
f:id:acro-engineer:20201015231813p:plainf:id:acro-engineer:20201015231823p:plain

この機能を利用すると、分析/フィルタ条件を保持しながら移動することができます。
これまでユースケースによっては1つのダッシュボードに大量のビジュアライズを配置した結果分析画面として分かりにくく、かつ画面表示速度が遅くなることがありました。
しかし、複数のダッシュボードに分割してダッシュボード間の移動の仕組みを作ることで、よりシンプルな画面で効率的にかつ高速に分析を実施することができます。

まとめ

以前までは高速さやスケールアウトの容易さを打ち出していましたが、今回はそれは前提として、

 ・データ投入後の柔軟なデータ加工、分析
 ・他機能、サービスとの連携が容易

等の更なる強み、アピールポイントを打ち出していたように感じました。
これからもどんどん便利になるElastic Stackを使いこなしていきたいですね。

それでは。

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

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

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

世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

ElasticON Global 2020 最速レポート!

こんにちは、@shin0higuchiです😊

Elastic最大のイベントである、「ElasticON Global 2020」が 10/13~10/15で開催されました。
今年はオンラインでの開催となり、専用のウェブサイト上で配信を観たりコミュニケーションを取ったりする形式となっていました。
早速参加レポートをお届けします。

f:id:acro-engineer:20201015015908j:plain:w800
専用ウェブサイト

カンファレンス概要

アジェンダ

全部で、100近いセッションがありました。
今回は3日間の開催でしたが、厳密には2日分のセッションがあり、
後半2日間は、各地域のタイムゾーンに合わせて同一内容を配信する形になっています。

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

セッションの一覧は下記のURLから確認することができます。
www.elastic.co

ここからは、いくつかのセッションをピックアップして、内容を簡単にまとめます。

セッション内容

Building great search experience

Enterprise Search の検索UIに関する話でした。
簡単にUIを組み立てられる Reference UI と、より細かいカスタマイズをするための Search UI について、デモを交えて紹介されました。
Pagination、Sorting、Facet、AutoCompletion など、検索UIに必要な基本機能は一通り揃っており、非常に短時間で検索UIを構築することが可能です。

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

www.elastic.co
www.elastic.co

Opening Keynote

例年通り、CEOの Shay Banon 氏によるプレゼンテーションでキーノートが始まりました。

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


Ingest Managerの話や...
f:id:acro-engineer:20201015024542p:plain:w500

最近のKibana新機能たちの話...
f:id:acro-engineer:20201015024822p:plain:w300f:id:acro-engineer:20201015024828p:plain:w300f:id:acro-engineer:20201015024834p:plain:w300


他にも、Searchable Snapshotや、Schema on Read (runtime fields) の話などがありました。



Elastic Stack Keynote

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

このセッションでは、Opening Keynoteで紹介されたものを、より詳しく説明するような内容でした。
個人的には、耐障害性を担保してコストを削減できる Searchable Snapshotの話が興味深く、是非活用してみたいと思いました。
Amazon Elasticsearch Serviceの Ultra Warm Nodeに対抗する形になるのでしょうか)

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



他のセッションについては、別記事で紹介予定です。お楽しみに!

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

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

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

世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com