Taste of Tech Topics

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

Elastic Community Conference 2021に参加してきました!

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

Elastic社のイベントである、「Community Conference 2021」が02/27に開催されました。
その速報レポートをお届けしたいと思います。

目次は以下です。

カンファレンス概要

日本時間で27日 0時から始まり、なんと24時間セッションが開催されるカンファレンスです。
今回は事前にCFPの応募があり、その中から選ばれたスピーカーによる発表でした。

内容としては検索、データ分析、クラウド上での活用方法など幅広いジャンルのセッションがあり、レベル感も基本的なものから応用的なものまで多岐に渡ります。

また普段のカンファレンスは英語のセッションが多いのですが、今回は時間帯によってフランス語だったり、韓国語のセッションもあり普段のカンファレンスとはまた違う雰囲気で面白かったです。
今回はそのセッションの中からキーノートと、個人的に面白かったセッションをご紹介したいと思います。

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

キーノート

CEOの Shay Banon 氏によるプレゼンテーションからキーノートが始まりました。
f:id:acro_nomura:20210227161819p:plain:w500

先日発表されたライセンス変更の話や、最近力を入れているクラウドの話が主な内容でした。
ライセンス変更についての詳細は以下のブログを参照ください。
www.elastic.co

また上記の内容以外にも、App Search、ObservabilityそしてSecurityについて7.11で追加された最新機能の紹介も交えたデモが行われました。
特にApp SearchのWebクロール機能はGUI上で簡易に取り込み対象ドキュメントのルール設定や、実際のクローリングを実行することができ便利そうだと思いました。
f:id:acro_nomura:20210227162802p:plain:w500

面白かったセッション

ここからは2つほど面白かったセッションをご紹介します。

Boosting music search results based on popularity and user behavior in Elasticsearch

検索順位を決定するためのスコアリングに関するセッションでした。
f:id:acro_nomura:20210227165234p:plain:w500

Function Score Queryを利用したスコアリングや、編集距離(検索時の表記ゆれ、誤字の是正に利用する考え方)をどう扱うかについて話がありました。
また実際のAPIに落とし込んだ際のデモも実演されました。
f:id:acro_nomura:20210227170853p:plain:w500

スコアリングは検索を扱っていると避けて通れない道です。
そのスコアリングをデモも含めて発表されているので初学者の方におすすめです。

Replacing Google search with Elasticsearch

なぜGoogle Search ApplianceからElasticsearchへ乗り換えたのか、というセッションでした。
下のスライドの通り、ElasticStackは様々な要件を満たしていることが分かります。
f:id:acro_nomura:20210227182444p:plain:w500

以下はそのセッションのまとめスライドです。かっこいいですね。
f:id:acro_nomura:20210227183024p:plain:w500

まとめ

非常に多くの国/ユーザにElaticStackが利用されていることが実感できたイベントだったと思います。
またセッションも多岐にわたっておりElasticStackのユースケースの広さを改めて実感できました。

そして、今回のカンファレンスではElastic社だけではなく、実際のユーザ(エンジニア)の発表も多くありエンジニアとしての刺激を受けられたのも良かったです。

おまけ

今回のカンファレンスのお楽しみ企画としてElasticStack関連のクイズゲームがあったので参加しました。
こういう企画もカンファレンスの1つの楽しみですよね!

ルールとしては10題クイズが出題され、回答の正確さと回答までの速さでポイントが加算される仕組みのようです。
ということで参加してみました。

結果は、、、
f:id:acro_nomura:20210227163145p:plain:w500

9位でした。。。もうちょっと頑張りたかったですね。(問題文が英語だったせい、ということにさせてください)
それでは。

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

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

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

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

第40回 Elasticsearch勉強会で「Searchable Snapshot」について発表しました

こんにちは、@shin0higuchiです😊

昨日は 第40回となる、Elasticsearch勉強会がオンライン開催されました。
www.meetup.com

開催概要(Meetupイベントページより抜粋)

===============================================
■開催日時
2/25(木)19:30~21:00
■内容
登壇
1.株式会社ZOZOテクノロジーズ 有村和真さん
ZOZOTOWNとElasticsearch(ElasticCloud)のこれまで/これから」

2.Acroquest 樋口慎さん
「Searchable Snapshotでコスト削減」

3.Elastic社 鈴木章太郎さん
「Elastic Stack & Cloud 7.11 Technical Enablement ダイジェスト版」

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

「Searchable Snapshotでコスト削減」の内容

今回私が発表した内容を簡単に紹介します。
詳細はこちらの発表資料をご覧ください。

www2.slideshare.net

今回のバージョンでGAとなった「Searchable Snapshot」に関する発表でした。
Searchable Snapshotとは、クラウドストレージなどに置いたSnapshotを、Elasticsearchにマウントして検索できるようにする機能です。
従来であればノード障害に備えてレプリカシャードを保持する必要があったケースでも、
Searchable Snapshotを利用すればプライマリシャードのみ持てば良いので、最大50%のストレージ削減が可能です。
結果としてコストの削減や、シャード数が減ることによるヒープ使用低減が期待できます。
f:id:shin0higuchi:20210225220209p:plain:w400
f:id:shin0higuchi:20210225215933p:plain:w400


使い方としては、Snapshotを従来通り取得し、Mount Snapshot API を利用して検索可能状態にします。
マウントする際に、SnapshotのファイルがElasticsearchのローカルにコピーされるため、検索のたびにSnapshotにアクセスすることはありません。
(つまりパフォーマンスの大きな劣化がない、クラウドストレージからの読み出しコストが抑えられる)

POST _snapshot/fs_backup/my_snapshot/_mount
{
  "index": "kibana_sample_data_logs",
  "renamed_index": "kibana_sample_data_logs_snapshot",
  "index_settings":{
    "index.number_of_replicas":0
  },
  "ignored_index_settings": ["index.refresh_interval"]
}

www.elastic.co

また、Index Lifecycle Management からも制御ができるので、
時系列データのライフサイクルに組み込むのは定石になりそうな予感です。
f:id:shin0higuchi:20210225220654p:plain:w600

次のマイナーバージョンである 7.12 では、
Snapshotのうち、検索に必要なメタデータのみをローカルにコピーするオプションも利用可能になる予定で、
ますますストレージを効率的に使うことができるようになりそうです。
リリースが今から楽しみですね。

さいごに

勉強会全体の動画アーカイブYoutubeにて公開される予定ですので、
興味があれば是非ご覧ください。

お読みいただきありがとうございました。
それでは。

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

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

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

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

Azure Cosmos DBを使って日本語をグラフで表現してみる

皆さんこんにちは。最近ちょっとずつ体重が増えて、若干年齢を感じている@Ssk1029Takashiです。

日常生活の中で、文章を読む機会というのは数多くありますが、もう少し簡単に要点を押さえたいということが多いかと思います。
読むというよりは、図に表示されて理解できると、直感的に理解できてわかりやすいです。

ということで、今回は日本語のSVOに注目してみます。
SVOだけを残すことで余分な単語がなく、ぱっと見の理解が早くなります。
また、これをグラフ表現に起こすことで、見やすくならないか試してみます。

やりたいこと

今回やりたいことは、文章からSVO(主語・述語・目的語)を抽出して、グラフ表現に落とし込んでみます。
例えば、「AcroquestはGPTWを受賞した。」という文章からは以下のような図を作っていきます。
f:id:acro-engineer:20210126075023p:plain

これらを複数の文章から作成することで、名詞と名詞の相関図を作ってみたら見やすくならないか試してみます。

グラフ表現には、Azureが提供しているNoSQLデータベースサービスであるAzure Cosmos DBを活用します。
Cosmos DBはグラフでのデータ構造を格納することができ、なおかつセットアップが簡単なので、選びました。

Azure Cosmos DBとは

Azure Cosmos DBはフルマネージドのNoSQLデータベースです。
高い可用性と応答時間の早さが特徴です。
詳細は以下のページを参照してください。
docs.microsoft.com

また、Azure Cosmos DBはグラフDBとしての機能も備えておりGremlinというAPIを使うことで、グラフデータを扱うことができます。
docs.microsoft.com

SVOを文章から抜き出す

今回はGiNZAの係り受け解析を使って、文章から主語・述語・目的語を抜き出します。
GiNZAの係り受け解析では、以下のように、述語を中心に、係り方の種類で判別できます。
f:id:acro-engineer:20210126080554p:plain
例えば、nsubjは主語・述語関係を表すので、上の図では、述語「受賞」に対する主語は「Acroquest」だとわかります。
また、「obj」は述語に対する目的語を表すので、「受賞」の目的語は「GPTW」であることもここからわかります。

このように、係り受け解析結果から、nsubjやobjなどの関係を抽出することで、文章のSVOを抽出することが可能です。

コードにすると以下のようになります。

def get_svo(token):
    """
    SVOを出力
    :param token:
    :return:
    """
    if token.dep_ == 'nsubj' or token.dep_ == 'iobj': # iobjがあるのはGiNZAが主格関係をiobjと誤認識する不具合があるため
        # 主語の場合、依存関係で動詞をたどる
        verb_token = token.head
        if verb_token.dep_ == 'verb' or verb_token.dep_ == 'ROOT':
            # 動詞から依存関係をたどる
            for object_token in verb_token.children:
                # 目的語があったら、SVOがそろう
                if object_token.dep_ == 'obj':
                    return {"verb": verb_token.orth_, "sub": token.orth_, "obj": object_token.orth_}

これによって、SVOの組み合わせを抽出できます。

Azure Cosmos DBにグラフ情報を格納する

主語述語関係を抽出したら、その情報をグラフDBに格納していきましょう。

Azure Cosmos DBにグラフ情報を格納するためには、Gremlinという言語を使ってグラフを記述します。

グラフを構成する要素としては、以下の2点になります。
1. ノード(頂点)
2. エッジ(辺)

Gremlinを使ってノード・エッジを追加するには以下のようなコードが必要になります。
ノード

g.addV('<グラフ名>').property('id', '<頂点名>').property('pk', '<プライマリキー>')

エッジ

g.V('<辺の元の頂点>').addE('<辺のラベル>').to(g.V('辺の先の頂点'))||<

例として、はじめに例文とした「AcroquestはGPTWを受賞した」という文章を例に考えてみましょう。
図に書いた通り、ここでのノードは「Acroquest」と「GPTW」になり、エッジは「受賞」になります。
それぞれDBに追加するには以下のようなコードになります。

# ノード
g.addV('sentence').property('id', 'Acroquest').property('pk', 'pk')
g.addV('sentence').property('id', 'GPTW').property('pk', 'pk')
# エッジ
g.V('Acroquest').addE('受賞').to(g.V('GPTW'))

実際の文章で試してみる

今回試すうえで、一つの文章の中に、主語・述語・目的語が現れるのが望ましいので、物語を対象にしてみます。
なので、例題として、以下で公開している「走れメロス」を題材にしてみます。
www.aozora.gr.jp

入れてみた結果は、Azure PortalのCosmos DBの画面にある、データエクスプローラーから確認できます。
f:id:acro-engineer:20210127013413p:plain

対象のグラフを選ぶグラフが出てきます。
f:id:acro-engineer:20210127013533p:plain
このように、頂点からどのような辺がどの頂点に伸びているかということが確認できます。

例えば、「メロス」に着目してみると、比較的多くの辺が伸びていることがわかります。
f:id:acro-engineer:20210127013655p:plain

とりあえず「セリヌンティウス」が「メロス」を抱きしめたことは解りましたね。
このように、ざっくりとした相関図がグラフDBで表現できました。

まとめ

今回はGiNZAとAzure Cosmos DBのグラフDBを使って、文章のSVOを可視化してみました。
グラフDBにすることで、「メロス」が「見つめる」のは何?というような検索も可能になります。
ただし、日本語というのは主語を省くことが多い言語なので、真面目にやろうと思うと照応解析や文脈解析などが平行して必要になってきます。
また、SVO以外の5W1Hのような関係も抽出してみると面白いかもしれません。
それではまだ。

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

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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

外観検査がこんなに簡単に!?Amazon Lookout for Visionで欠陥検出をやってみた

皆さんこんにちは
@tereka114です。

さて、今回は2020年の「AWS re:Invent」で紹介された「Amazon Lookout for Vision」を評価していきます。
※記事公開の2021年1月25日時点ではプレビューサービスであるため、GAとなった時には結果が変わる、適用できないTipsもありますが、ぜひお試しください。

Amazon Lookout for Vision

Amazon Lookout for Visionは画像が正常か異常を判定する、異常検知のサービスです。
2020年の「AWS re:Invent」で発表されており、注目されています。

aws.amazon.com

このサービスは最低30枚の画像を準備すれば良く、簡単に試行できることが最大のメリットです。
実際に試した際にもサービスの操作も簡単で非常に扱いやすいと感じました。

Amazon Lookout for Visionの検証方法

先程簡単に説明しましたが、Amazon Lookout for Visionは使いやすく、便利です。
ただ、精度がどの程度実用的なのか、利用する上で非常に重要です。
そこで、本記事ではその「Amazon Lookout for Vision」の精度や性能を評価します。

検証データセット

産業検査の異常検知の画像データセット「MVTec AD」を利用します。
特徴として15種類の製品と複数の異なる異常となるパタンが含まれています。

データセットは以下のサイトからダウンロードできます。
www.mvtec.com

本検証では、次の製品を利用します。

  • Pill
  • Metal Nut

それぞれのサンプル画像は次の通りです。各製品ごとに様々な異常な画像が含まれていることがわかります。

f:id:tereka:20210111205833p:plain

検証内容

MVTecADから特定の物品をサンプリングし、データを評価します。
以下の軸で検証します。評価指標は異常検知でよく用いられるPrecison/Recall/F1 Scoreを用います。
本記事では、細かい評価の式の説明はしませんが各評価指標の意味は次の通りです。

  • Precision・・・異常と予測したデータのうち、異常と判断したデータの割合、異常と予測したデータの中が実際に異常であれば、高くなります。
  • Recall・・・異常のデータから異常と判断したデータの割合、異常データを見逃していなければ、高くなります。
  • F1 Score・・・Precision/Recallの調和平均、どちらの指標も高くなければ、F1Scoreの値は高くなりません。

1. 学習データセットの数量の追加
推奨されている「1つのデータセットを作成する」方式では学習データを最低30枚(正常データ20枚、異常データ10枚)から指定できます。
その方式に追加で正常なデータを増加させた場合の精度の傾向を確認します。

f:id:acro-engineer:20210120003234p:plain:h360
一つのデータセットを作成する

2. 学習データセットに異常データを追加する。
「1つのデータセットを作成する」といった標準の設定では異常データは評価のみ使われます。
「トレーニングデータセットとテストデータセットを作成する」方式ではユーザが指定をすれば異常データを学習に取り込むことができます。
これによる精度への影響を検証します。

f:id:acro-engineer:20210120003310p:plain:h360
レーニングデータセットとテストデータセットを作成する

検証

学習データセットの数量の追加

まずは、学習データセットの正常データの数量の増加を行います。
条件は20枚、50枚、100枚とデータセットを変更します。
データセットで得られた結果は次のとおりです。

  • 正常な学習データをただ増加させても、F1 Scoreの増加が安定していません。正常データを追加するだけでは、単純には精度に貢献しなさそうです。
  • 学習データの数量を増加しても学習時間が線形に伸びていかず、ほぼ一定になっています。数量を増やす場合にも単純に学習時間が2倍、3倍とならないのが学習データを追加しやすい良い点の一つです。

・Pill

枚数 学習時間 Precision Recall F1 Score
20 37分44秒 67% 100% 80%
50 39分41秒 86% 60% 71%
100 42分08秒 89% 80% 84%

次の結果はPill(20)の予測結果です。
確信度が高いものについては、きちんと異常と正常の判定ができています。番号+拡張子が正常(007.png)、単語+番号+拡張子(例:faulty_imprint_017.png)が異常を示しています。

f:id:acro-engineer:20210120002955p:plain:h480
Pillの予測結果

・Metal Nut

枚数 学習時間 Precision Recall F1Score
20 38分30秒 81% 40% 50%
50 40分35秒 100% 80% 88%
100 36分31秒 75% 90% 81%

次の結果はMetal Nut(50)の予測結果です。
先程のPillと同様、確信度が高いものはきちんと判定できています。

f:id:acro-engineer:20210120003933p:plain:h480
Metal Nutの予測結果

学習データセットの異常データ追加

先程の検証では、学習データの中に異常データが含まれていないものでした。
しかし、学習データに異常データを含めると異常の判定精度がよくなり、結果、精度が向上することを期待しています。
ここでは、学習データの正常データ数を10枚に固定します。その上で異常データを10, 20, 30枚と変化させました。

結果は次の通りです。データを増やせば、F1 Scoreが増加します。
特にRecallが増加しており、異常なものを見逃したくない場合には積極的に追加するのが良さそうです。

・Pill

枚数 学習時間 Precision Recall F1Score
10 50分37秒 67% 40% 50%
20 47分21秒 78% 70% 74%
30 51分58秒 69% 90% 78%

・Metal Nut

枚数 学習時間 Precision Recall F1Score
10 47分05秒 100% 60% 75%
20 49分08秒 100% 80% 89%
30 48分55秒 100% 90% 96%

その他便利な機能

トライアル検出を用いた再学習機能

トライアル検出と呼ばれる機能により、お試しで画像の判定が可能です。
このトライアル検出の機能を用いて判定した画像に対するラベリングとデータセットへの追加を行えます。

この処理の後でモデルを再学習することで精度改善に役立てます。
特にトライアル検出で判定が誤った画像は今までで学習されていない画像のパタンである可能性が高いので、精度が向上しそうです。

この機能によりモデル運用時に判定に失敗したデータをいち早く取り込めるので、非常に便利そうだと感じています。

f:id:acro-engineer:20210124234729p:plain:h480
トライアル検出を使ったデータセットの画像追加

最後に

Amazon Lookout for Visionが想像以上に便利で驚きました!
データが少なくとも、精度は申し分ないといえそうです。
異常検知を気軽に試したいときには積極的に活用していきます。

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

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

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

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

2020年アドベントカレンダー振り返り

皆さんあけましておめでとうございます。
@tereka114です。

昨年の最後は例年の如く、アドベントカレンダーが盛り上がりました!
皆さんはどのアドベントカレンダーが良かったでしょうか?

Acroquestは、有志がQiitaの各種アドベントカレンダーに参加し、執筆していました。
本記事ではアドベントカレンダーの投稿記事の一覧と注目度の高かった記事を紹介します。

おすすめ3記事

特徴量エンジニアリングのライブラリ xfeat を使ってみて便利だったこと

acro-engineer.hatenablog.com

この記事はxfeatと呼ばれる特徴量エンジニアリングを楽にするためのツールの紹介です。
私自身も使ったことがありますが、頻繁に使われる特徴量エンジニアリング手法が気軽に試せるのは良いですね。
個人的にはcuDFとも何も考えずに連携できるのが一番嬉しいです。

ぜひ、特徴量エンジニアリングを気軽に実施したい方におすすめです。

超爆速なcuDFとPandasを比較した

acro-engineer.hatenablog.com

私が書いたcuDFで良かったこと・困ったことをベースに執筆したものです。
最近頻繁に使っていて便利ではあるのですが、慣れないと癖もあります。
cuDFを使う前に一度読んでおくことをおすすめします。

Ver.7.11からElasticsearchのスキーマ設計が大きく変わる

acro-engineer.hatenablog.com

Elasticsearch Ver.7.11から導入された「Runtime Field」とこれまで導入されていた「非同期検索」により
従来までの「Schema on Write」だけではなく、「Schema on Read」でのElasticsearchの利用ができるようになりました。
詳しい説明はぜひ、記事をお読み下さい。

最後に

あらためて昨年を振り返ると、Elasticsearch、機械学習に加え、テストやAzureなど多種多様な記事をこのブログで提供できたのではないかと思います。
今年も引き続き良い情報を提供していきたいと思います!

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


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

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

モノリシックなアプリケーションをマイクロサービス化したいエンジニア募集! - Acroquest Technology株式会社のWebエンジニアの求人 - Wantedlywww.wantedly.com

Elasticsearchで教師あり機械学習 ~Data Frame Analyticsまとめ ~

この記事は Elastic stack (Elasticsearch) Advent Calendar 2020 の 22日目の記事になります。

こんにちは、@shin0higuchiです😊
今回のテーマは、「Elasticsearchで教師あり機械学習」ということで、Data Frame Analyticsの機能を紹介します。

はじめに

2017年ごろから、Elasticsearchには時系列データの異常検知に特化した、教師なしの機械学習機能がありました。
詳しくは、昨年(2019年)のAdvent Calendarで @yukata_uno さんが
「Elastic Machine Learningの歴史を振り返る」という記事を書いていらっしゃるのでそちらをご参照ください。

今年は Elasticsearch の Ver.7.2 で transform が利用可能となり、
そこから outlier detection, regression, classification などの機能が続々リリースされました。

本記事では、その中の Classification を利用して、実際に機械学習を試してみます。
※X-Packの有償機能を利用するため、トライアルライセンスを有効化しています。

利用するデータについて

データセットとしてはこちらを利用します。
www.kaggle.com

データに含まれる「年齢」、「給与」、「婚姻状況」、「クレジットカードの制限」、「クレジットカードのカテゴリ」などの情報から、その顧客がクレジットカードを解約するかどうかを予測することを今回の目標としましょう。
Attrition_Flagのカラムに「Existing Customer」「Attrited Customer」の2値が入っており、これを予測する形になります。

では、CSVファイルをKibanaから取り込んで中身を見てみましょう。
f:id:acro-engineer:20201221035300p:plain:w800

bank_churners という名前のインデックスに取り込みます。
f:id:acro-engineer:20201221035313p:plain:w800

機械学習ジョブの作成

Machine LearningのメニューからData Analytics Jobの「Create job」を選択し...
f:id:acro-engineer:20201221035738p:plain:w800

Classificationを選択します。
Dependent variable には分類の対象となる Attrition_Flag を指定します。
f:id:acro-engineer:20201221040055p:plain:w800

分析に利用するフィールドはチェックボックスで選択することができます。
ここでは前述の「年齢」、「給与」、「婚姻状況」、「クレジットカードの制限」、「クレジットカードのカテゴリ」を含む14フィールドを指定しています。
f:id:acro-engineer:20201221205009p:plain:w800


ElasticsearchのClassificationでは、内部的にBoosted Decision Tree Regressionによる学習をおこないます。
設定項目は分析の種類によって異なりますが、Classificationの場合は以下の通りです。

項目名 説明
Feature importance values 結果に大きく影響したカラムを取得する最大数
Prediction field name 予測結果を入れるフィールド名
Top classes 分類するクラス数
Model memory limit モデルの上限メモリ量
Maximum number of threads 分析時の最大スレッド数

ハイパーパラメータについては、内部で適切な値を選択してくれるようなので、詳しくない場合はデフォルトで良いでしょう。ここでは説明を割愛します。Hyperparameter optimization | Machine Learning in the Elastic Stack [7.10] | Elastic

設定の詳細はこちらをご参照ください。
Concepts | Machine Learning in the Elastic Stack [7.10] | ElasticClassification | Machine Learning in the Elastic Stack [7.10] | Elastic

学習の開始

ジョブ名などを決めたあと、学習を開始することができます。
f:id:acro-engineer:20201221215752p:plain:w800

学習の進行度はプログレスバーで確認することができます。
学習が終わると「View Results」のリンクが表示されます。
f:id:acro-engineer:20201221220338p:plain:w800

結果の確認

結果画面では、影響度の大きいカラム・モデルの評価値・推定結果などが確認可能です。
まずは、影響度の大きいカラムのランキングを見てみましょう。
Avg_Utilization_Ratio, Months_Inactive_12_mon, Contacts_Count_12_monなどが上位となっています。カードの利用率や過去12カ月の動きが少ない人が解約しやすいと思われるので、感覚的には正しそうな印象ですね。
※表示されるフィールド数は、先ほど設定したFeature importance valuesによります。
f:id:acro-engineer:20201221220653p:plain:w800

そしてこちらが、モデルの評価値です。
実際の推論結果と、正解ラベルをマトリクスで示したものになります。
解約しそうなユーザーを漏れなく見つけることが重要になるので、Attrited Customer側の正解率をもっと上げたい(再現率を上げたい)印象はあるものの、解約と継続の正解率はそれぞれ68%, 80%となっており、総じて悪くない結果なのではないでしょうか。
f:id:acro-engineer:20201221225645p:plain

作成したモデルの利用

学習したモデルは、inferenceという機能を通じて、ingest nodeの processor や、Aggregation から利用することができます。

たとえば次のような ingest processor を用意することで、新規に取り込むドキュメントを学習済みのモデルで分類することができます。

{
  "inference": {
    "model_id": "bank_churners-1608484239997",
    "target_field": "BunkChrner_prediction_infer",
    "inference_config": {
      "classification":{
        "num_top_classes": 2,
        "results_field": "prediction",
        "top_class_results_field": "probabilities"
      }
    }
  }
}

※ model_idは GET /_ml/trained_models で確認することができます

Aggregationについては割愛します。親となるAggregationの値に対して推論をかける形になりますので、 inference processorと基本的な設定内容は同じです。詳しくはこちらを参照してください。Inference bucket aggregation | Elasticsearch Reference [master] | Elastic

まとめ

以上のように、Elasticsearchの機械学習が大幅に強化され、専門的な知識がなくとも利用できるようになって来ています。Elasticsearchの強みは、集約したデータを様々なユースケースに横断的に活用できる点だと思っていますが、今回紹介した機能はさらにその幅を広げてくれるのではないかと思っています。
皆さんも是非ElasticsearchのData Frame Analyticsを試してみてください。

それでは。

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

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

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

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

Azure Container Instancesを使ってAngular+FastAPIなWebアプリを動かしてみた

こんにちは。
初登場になります、普段はフロントエンドの開発をしている長野です。

本記事は、Azure Advent Calendar 2020の19日目の記事になります。

最近、Angular+FastAPIでアプリを実装したのですが、
そのアプリを、仮想マシンではなく、サーバレス・コンテナを使ったWebアプリとして構築してみたくなりました。

調べている中で、Azure Container Instances(以下、ACI)を見つけ、実際に試してみたところ、
少し工夫が必要だったものの、全体としてはとても簡単に動かすことができました。

この記事では、私が実際にACIを使ってみた中で学んだ、ACI上でのWebアプリの動かし方について、
特にフロントエンドとバックエンドの連携の際に注意するべき点を中心に、まとめました。

この記事を見ながら、皆さんも実際にこの手軽さを体験していただきたいと思います。

それでは、さっそく始めましょう!

始めに: "Azure Container Instances"とは

ACIとは、高速かつ簡単にコンテナを実行できるサービスです。メリットは次の2つです。

  1. コンテナイメージさえあればコマンド一つで立ち上げることができ、さらにインターネット上に直接公開をすることもできるので、すぐに利用することができます。
  2. コンテナの起動時間とその間に使用したCPUとメモリに応じて課金されるので、使わないときは停止する等をすれば、コストも抑えることができます。

Webアプリの説明

まずはじめに、例として扱うWebアプリを説明します。

今回、本の情報を管理する、簡単な図書管理システムを構築してみました。
一覧画面と詳細画面があり、本の情報の、登録・確認・編集・削除ができるようになっています。

f:id:acro-engineer:20201219101050p:plain
図書管理システムの一覧画面
f:id:acro-engineer:20201219101458p:plain
図書管理システムの詳細・編集画面

フロントエンドはnginx + Angular、バックエンドはFastAPIを、今回は使用しました。

また、今回開発するにあたり、以下の環境を使用しました。

  • Node.js: v14.15.0
  • Docker: 20.10.0
  • Azure CLI: 2.16.0

なお、ディレクトリ構成は以下のようになっています。

sample-lsm-app     
├─deploy-aci.yaml
├─docker-compose.yml
├─client
│  ├─angular.json
│  ├─Dockerfile
│  ├─package-lock.json
│  ├─package.json
│  ├─dist
│  │  └─client
│  │      └─フロントエンドの本体コードのビルド媒体
│  ├─nginx
│  │  └─default.conf
│  ├─node_modules
│  └─src
│      ├─app
│      │  └─フロントエンドの本体コード
│      └─environments
│         └─フロントエンドの環境設定
└─server
    ├─Dockerfile
    ├─poetry.lock
    ├─pyproject.toml
    ├─.venv
    ├─src
    │  └─バックエンドの本体コード
    └─tests
       └─バックエンドのテストコード

Webアプリの構成

本アプリのAzure上での構成は以下のようになっています。

f:id:acro-engineer:20201219100505p:plain
サンプルアプリ構成イメージ

フロントエンド、バックエンド、それぞれ別でコンテナイメージを作成して、Azure Container Registry(以下、ACR)に登録、
それらをACI上にデプロイすることで、Webアプリを動かしています。

それでは実際に、ローカルで作成したWebアプリをAzure上に構築していきましょう。

WebアプリのAzure化

1. フロントエンドとバックエンドの結合部分の準備

まずは、フロントエンドからバックエンドへAPIを呼んで、データのやりとりができるように準備をします。
今回、Angularで作成したフロントエンドをnginxサーバー上で動かすので、以下のようなdefault.confを用意しました。

server {
    listen  80;
    server_name localhost;

    root    /usr/share/nginx/html;
    index   index.html index.htm;

    location /api/ {
        proxy_pass http://localhost:8000;
    }
}

ここでのポイントは、

proxy_pass http://localhost:8000;

の部分です。通常、Docker上で動かす際は、"localhost"の部分にコンテナ名を指定しますが、
Azure Container Instances上で動かす際には、"localhost"での指定になります。

以上の設定で、"http://<ACIの公開FQDN>:80/api/~" とURLを指定することで、フロントエンドからAPIを呼ぶことができるようになりました。

ここから先はAngularの内容です。

nginxで設定したAPIのURLを呼べるように、environment.prod.tsに以下のように記述します。

export const environment = {
  production: true,
  server: 'http://<ACIの公開FQDN>'
};

そして、実際にAPIを呼ぶservice.tsでは、以下のようにURLを指定するようにします。

  fetchBooks(): Observable<Book[]> {
    return this.http.get<Book[]>(environment.server + '/api/books');
  }

最後に、以下のコマンドで本番環境としてビルドを行うことで、フロントエンドをACI上で動かすための準備が完了しました。

npm build --prod

2. コンテナイメージ化

Dockerを使用し、フロントエンド側・バックエンド側両方のコンテナイメージを作成します。

まず、それぞれのDockerfileの内容はこちらです。

フロントエンド側

FROM nginx:1.16
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf

# distディレクトリ配下に作成されたビルド媒体をコピー
COPY ./dist/client /usr/share/nginx/html

バックエンド側

FROM python:3.8-slim
WORKDIR /usr/src/app
RUN pip install poetry

# ソースコード類のコピー
COPY . .

# 実行環境の用意
RUN poetry export -f requirements.txt > requirements.txt
RUN pip install -r requirements.txt

# FastAPIの起動
CMD python /src/main.py

これらをまとめて立ち上げるための、docker-compose.yamlはこちらです。

version: "3"
services:
  client:
    build: ./client
    image: sample-lms-app_client:1.0
    container_name: sample-lms-app_client
    ports:
      - 80:80
  server:
    build: ./server
    image: sample-lms-app_server:1.0
    container_name: sample-lms-app_server
    ports:
      - 8000:8000

docker-composeのbuildコマンドで、コンテナイメージを作成します。

docker-compose build

3. Azure Container Registryの作成

2で作成したコンテナイメージを、登録するためのACRを用意します。

Azure portalから「リソースの作成」を行い、"Container Registry"を検索します。

f:id:acro-engineer:20201219101830p:plain
"Container Registry"で検索すると、作成画面が開きます

必要事項を入力し、ACRを作成します。

f:id:acro-engineer:20201219102111p:plain
ACRの作成画面

作成完了後、「アクセスキー」から、「管理者ユーザー」の設定を有効化します。
こうすることで、ACRに登録したコンテナイメージを利用する際には、パスワードが必要になります。「ログインサーバー」、「ユーザー名」、「password」を、それぞれ手元に控えておきましょう。

f:id:acro-engineer:20201219102414p:plain
ACRへのアクセスキーの表示

4. Azure Container Registryへコンテナイメージの登録

2で作成したコンテナイメージを、3で作成したACRに登録します。

最初に、コマンドプロンプト経由で、ACRにログインを行います。3の最後で取得した、アクセスキーを使用します。

docker login <ログインサーバー> -u <ユーザー名> -p <パスワード>

次に、2で作成したコンテナイメージに、タグ付けを行います。

docker tag sample-lms-app_client:1.0 <ログインサーバー>/sample-lms-app_client:1.0

docker tag sample-lms-app_server:1.0 <ログインサーバー>/sample-lms-app_server:1.0

最後に、pushを行うことで、ACRにコンテナイメージが登録されます。

docker push <ログインサーバー>/sample-lms-app_client:1.0

docker push <ログインサーバー>/sample-lms-app_server:1.0

登録が成功していることは、Azure portalの画面から、「リポジトリ」の画面を開くことで確認ができます。
作成したコンテナイメージが表示されたら、成功です。

f:id:acro-engineer:20201219102625p:plain
登録済みコンテナイメージの一覧

5. Azure Container Instancesの立ち上げ

いよいよ、ACI上にアプリを立ち上げます。

そのために、設定ファイルの作成が必要です。以下のような"deploy-aci.yaml"を作成しました。

apiVersion: 2018-10-01
name: SampleLMSAppACG
# ACIのリソース名
location: japaneast
# リージョン
properties:
  containers:
  # フロントエンド側、バックエンド側それぞれのコンテナの設定
  - name: client
    properties:
      image: <ログインサーバー>/sample-lms-app_client:1.0
      # 使用する、ACR上のコンテナイメージ
      resources:
        requests:
          cpu: 1
          # コンテナを動かすために必要なCPU数(最小1)
          memoryInGb: 1
          # コンテナを動かすために必要なメモリ数(最小1)
      ports:
      - port: 80
        # 使用ポート
        protocol: TCP
        # プロトコル
  - name: server
    properties:
      image: <ログインサーバー>/sample-lms-app_server:1.0
      resources:
        requests:
          cpu: 1
          memoryInGb: 1
      ports:
      - port: 8000
        protocol: TCP
  osType: Linux
  # コンテナのOSタイプ
  ipAddress:
  # IPアドレスの設定
    type: Public
    # パブリックIPか、プライベートIPか
    ports:
    # 公開ポートの設定
    - protocol: tcp
      port: 80
    - protocol: tcp
      port: 8000
    dnsNameLabel: sample-lsm-app
    # DNSラベル設定
  imageRegistryCredentials:
  # ACRのログイン情報
  - server: <SERVER>
    # ログインサーバー
    username: <USERNAME>
    # ユーザー名
    password: <PASSWORD>
    # password

以下、詳細な説明です。

  • type: Public
    • 今回は、ACIを直接公開するため、"Public"を選択しました。
    • 例えば、IP制限等を行うために、VNet下にアプリを立ち上げる場合には、ここで"Private"を選択します。
  • dnsNameLabel: sample-lsm-app
    • 1で設定した"ACIの公開FQDN"は、ここで設定したものです。
    • ここで設定したDNSラベルと、選択したリージョンによって、"<DNSラベル>.<リージョン>.azurecontainer.io"のように、公開FQDNが決定します。

ここで作成した設定ファイルを使って、ACIのデプロイを行います。
デプロイには、AzureCLIをインストールし、コマンドプロンプト上で、"az"コマンドが使えるようになっている必要があります。(Azure CLIのインストール

まずは、Azure CLI上で、ログインが必要です。

az login

これで、アプリをデプロイするための準備がすべて整いました。最後に、以下のコマンドでアプリを立ち上げます。

az container create --resource-group <リソースグループ> --file deploy-aci.yaml

6. 動作確認

作成コマンドを実行したら、Azure portal上で、実際にACIが作成されたか確認してみましょう。
設定ファイルの中で指定したリソース名で、リソースが存在し、かつ「実行中」であることを確認します。

f:id:acro-engineer:20201219230728p:plain
作成したACIの概要画面

ACIが実際に作成できたことが確認できたら、画面に表示されているFQDNから、アプリにアクセスしてみましょう。

f:id:acro-engineer:20201219103300p:plain
ACI上で動いているアプリにアクセスした様子

無事に画面を開くことができました!

もしもここで画面が開けなかった場合は、コンテナのログを見て、エラーが出ていないか確認します。
コンテナのログは、「コンテナー」でコンテナ一覧を開き、見たいコンテナを選択した状態で、「ログ」タブを選ぶことで表示することができます。

f:id:acro-engineer:20201219103504p:plain
コンテナログの表示

詰まりやすいのは、フロントエンドとバックエンドとの連携の部分なので、
コンテナがそれぞれ起動しているのを確認したうえで、この記事の中で紹介している、"environment.prod.ts"や"default.conf"の設定を確認してみてください。

なお、ACIのリソースは一度削除してから、作成コマンドを実行してください。
ACRに登録したコンテナイメージは、登録済みのタグにもう一度pushすることで上書きされます。
しかし一方で、ACIで同じタグのコンテナイメージを利用して再作成する際は、キャッシュが効いてしまうためか、
更新されたコンテナイメージでうまく立ち上げられないようです。

最後に

いかがだったでしょうか?

私が初めてこの構成でアプリを立ち上げようとした時は、
公式のチュートリアルを参考にしたものの、1つのコンテナの場合の説明のみだったため、
フロントエンドとバックエンドとのコンテナ間の連携がなかなかうまくいかず、苦労しました。

ぜひ皆さんも自作のアプリをACI上にデプロイして、動かしてみてください!

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

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

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

モノリシックなアプリケーションをマイクロサービス化したいエンジニア募集! - Acroquest Technology株式会社のWebエンジニアの求人 - Wantedlywww.wantedly.com