Taste of Tech Topics

Taste of Tech Topics

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

KibanaのVisualizeでExcelっぽい表現をする

はじめまして、kareyamaです🍂

アップデートの度にオシャレなグラフが増えるKibanaのVisualizeですが、Excelに慣れ親しんだ日本人にはシンプルな表形式がウケるようで。
Data Tableに対して「全体に対する割合を見たい」「異常値を強調表示してほしい」などの要望が出て困っていました。

そんな時、弊社のElastic認定エンジニアの言葉が耳に入ってきました。
「Visual BuilderのTableで、Dashboardの一覧を…」

…Visual BuilderのTable??
さっそくElasticsearchのバージョンを上げて確認します。どうやら6.3からExperimentalとして追加されたようです。

見た目はこんな感じ。
f:id:acro-engineer:20180930020902p:plain

Data Tableとの比較

結論から言ってしまうと、Data tableに対し、Visual Builder Tableは以下の事ができました。

  1. aggregateの結果を変数として、スクリプトが使える ⇒ 四則演算できる
  2. 列単位でフィルタをかけられる
  3. 簡単な条件付書式が使える

逆に、Data tableと違い、以下の制約があります。

  1. Data tableはsplit rowを複数、かつAggregationを選んで指定できるが、Visual Builder Tableでは、行の数は単一のterms aggregationで決まる
  2. Data tableがTime Pickerで指定した期間のデータがテーブル化するのに対し、Visual Builder TableはTime Pickerで指定した期間を「interval」でBucketに分割した上で、 最後(最新)のBucketに含まれるデータのみをテーブル化する

実装

では、実際に使ってみます。
今回は気象データの「日照時間」と「天気」を使い、スクリプトで計算した日照率と、特定の天気の日数を都市ごとに表示します。

気象庁から北海道・大阪・沖縄の気象データを1月分取得し、logstashで取り込みました。
f:id:acro-engineer:20180930084011p:plain

VisualizeからTime Series Visual Builderを選択します。
f:id:acro-engineer:20180930022419p:plain


画面上部のリンクから「Table」を選択。

「Columns」タブの「Group By Field」にlocationフィールドを選択します。
f:id:acro-engineer:20181103124238p:plain


「panel option」を開き、index patternとintervalを設定します。
今回はデータ全体を見たいので、Bucketに分割されないようintervalを大きめに設定します。

ここで、time pickerよりintervalを長く設定して、31d、32d、33d、と試してみると、
値によって結果が変わるのはなぜか、よくわかりませんでした。
f:id:acro-engineer:20181104150204j:plain

「50d」で設定すると、全データが表示されたので、これで進みます。
f:id:acro-engineer:20181103124410p:plain

四則演算

まずは、各都市の平均日照時間を表示します。
これはUIが異なるだけで従来のData Tableと同じですね。
f:id:acro-engineer:20180930095204p:plain

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

これだとお日様がどれくらい仕事してるかよく分からないので、日照率を計算してみます。

この月、日の出は大体5:30、日の入りが18:30だったようなので、13時間で割りましょう。
こんな感じのMetrics定義になります。
f:id:acro-engineer:20180930100452p:plain

Visuaizeはこんな感じに。
f:id:acro-engineer:20180930100732p:plain
ちゃんと計算できていますね(^o^ 三 ^o^)
今回はサンプルとして可照時間を固定値にしましたが、日の出・日の入り時刻のデータを入れれば日ごとに算出する事も可能ですね!

書式変更

単位の表示がなく、閲覧者からは数値の意味がわかりにくいです。
そのため、まず日照率は「%」を付けましょう。

また、異常に低い値と高い値に注目してもらうため、目立たせたいです。
日照率が30%を切っている場合は文字を青く、70%を超えている場合赤くします。
f:id:acro-engineer:20180930100520p:plain

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

北海道はずいぶん天気が悪かったようです。
では、どれくらいの日数、曇りか雨だったのでしょう?
実際の数字を出してみようと思います。

フィルタ

「天気(日中)」のフィールドに「曇」または「雨」が含まれている日数を表示します。
MetricsをCountにし、以下のようにOptionを設定します。
f:id:acro-engineer:20180930101428p:plain

データをちゃんと加工していないので、「晴時々薄曇」みたいな天気までヒットしてしまうのが微妙です。
ただ、確かにこの月の北海道は三都市で一番天気が悪いようです。
f:id:acro-engineer:20180930101447p:plain

まとめ

Visual Builder Tableのスクリプトで「割合」を計算したり、計算結果に対して条件書式を付ける事で異常値を強調表示できました。

一見シンプルながら色々な可能性を感じるVisualizeになっています。
Experimental機能のため公式ドキュメントが整備されておらず、触りながら慣れる形になりますが、ぜひ一度試してみてください。

それでは。

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

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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com

雑誌「Interface」2018年12月号に「AI猫カメラ」の特集記事を寄稿しました

hayakawaです。
10月25日発売の雑誌「Interface」2018年12月号に、
後輩の@tereka114さんと共同で執筆した「AIひょっこり猫カメラ」という特集記事を寄稿しました。

f:id:acro-engineer:20181011161140j:plain:h300
Interface 2018年12月号

2018年12月号 | Interface – CQ出版

カメラ付きのRaspberry Piに猫を判定できるAIを入れ、猫を見つけてはTwitterに投稿するBotを作成する、という内容です。

実際に動いているところ

こちらのTwitterアカウントにてBotが動いています。

twitter.com

5分おきに動き、撮影したカメラ画像に猫が写っているときに投稿します。
このBot入りのRaspberry Piは、NPO法人「東京キャットガーディアン」様の設備である、保護猫カフェ「大塚スカイシェルター」に設置させていただいております。

tokyocatguardian.org

行政などから保護された猫と、猫カフェの形式で触れ合える人気施設です。

f:id:acro-engineer:20180901131518j:plain:h300

よって、ツイートされた画像に、お気に入りの、猫ちゃんが写っていれば、
(先客がいなければ)引き取りを希望することができるのです!!

※ただしきちんと責任をもって猫を飼える状態かの面談があります。

詳しくは上記の東京キャットガーディアン様のサイトにてご確認ください。

技術的な内容

f:id:acro-engineer:20180830110554j:plain:h300

構成としては、

  • Raspberry Pi 3に小型カメラを接続
  • Keras上で、学習済みの画像判定モデル(MobileNet)動かし、画像判定
  • 猫が写っていたらTwitter APIで画像を投稿

というシンプルな内容です。

コンセプトとしては、世にある学習済みモデルをそのまま使って、時間のかかるディープラーニングの学習処理をせずに、カンタンに動くものを作る、というものでした。

猫を題材にしたのは、猫を写せば一定数のファンがつくだろうという浅はかな考えによるものです。
ごめんなさい。

しかも最初は、オッサン(私)の構えた猫写真ボードで動作確認をするという絵面とアタマの悪い内容でしたが、CQ出版様の交渉により、実物の猫ちゃんが満杯の猫カフェに実機を入れるというシチュエーションにしていただけました。
ありがとうございます。

雑誌の内容

以下のようなことを書きました。

  • Kerasで学習済みモデルをロードして動かす方法
  • 初心者向け、Raspberry Piのセットアップ方法
  • Raspberry PiにTensorFlowとKerasをインストールする方法
  • 実際に画像判定を動かしたうえでの問題と対策
  • Twitter APIの使い方
  • ファインチューニングのやり方

特にRaspberry PiにTensorFlowなどのAIを入れる構成は、色々と使い道があって、やってみたい方もそこそこいらっしゃると思いますが、ハマりどころもそこそこあるので、雑誌の内容を参考にしていただけると幸いです。

なお原稿を書いてる間に、

  • TensorFlowが正式にRaspberry Piに対応
  • Twitter API用の開発者アカウントの取得が難しくなる

など、色々ありましたがなんとか形になりました。

設置

CQ出版の編集様と一緒に大塚スカイシェルターにお邪魔し、設置してきました。

f:id:acro-engineer:20180901131500j:plain:h300

職員の方から

  • ケーブルを表に出すのはオススメしない。必ず引っかかれる。
  • 固定しないのはオススメしない。必ず叩き落される。
  • とにかく猫は新しいモノをすぐに嗅ぎつける。気を付けろ。

と親身にアドバイスをいただきまして、ケーブルをカバーで覆ったうえでケースは本棚に厳重にねじ止めされています。

f:id:acro-engineer:20180901131444j:plain:h300

予期せず猫に関する知見を得られました。
良い仕事でした。

ということで雑誌は発売中ですが、
そんな難しいことはどうでもいいという方は猫の画像をご覧になっていってください!
f:id:acro-engineer:20181025190613j:plain:h300

f:id:acro-engineer:20181025190632j:plain:h300

f:id:acro-engineer:20181025190641j:plain:h300

f:id:acro-engineer:20181025190619j:plain:h300

よければ雑誌の方もよろしくお願いします!

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
最先端の機械学習を活用して表情認識に挑戦! - Acroquest Technology株式会社のエンジニアインターンシップの求人 - Wantedlywww.wantedly.com

技術書典5でElasticsearch本を販売しました!

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

10/8(月)に技術書専門の同人誌即売会である技術書典5に、初めて出展サークルとして参加しました。

techbookfest.org

頒布物

今回、Acroquestの有志で「Elasticsearch NEXT STEP」という同人誌を執筆し、販売しました。

techbookfest.org

この本はElasticsearchの入門から次のステップ(NEXT STEP)に踏み出すことをコンセプトに執筆しました。
Elasticsearchはインストールといくつかのコマンドのみで扱えるため、非常に簡単に扱えます。
しかし、データ分析などへの活用を考えたり、実環境での運用を考慮しすると、考える必要があることが増えてきます。
そのため、今回はより実践的なElastic Stackの活用をテーマに執筆を進めました。

印刷は「ねこのしっぽ」さんに発注しました。

www.shippo.co.jp

印刷物の表紙や図の見え方に対してチェックしていただき、非常に助かりました。

執筆

執筆環境はRe:VIEWを主に利用しました。
github.com

Wordなどと異なり、次の点が良かったと思っています。

  1. gitで差分を確認しやすいです。(Wordだと難しい)
  2. 技術書を書くにあたり必要な記法、フォーマットが揃っています。(コード記法など)

最後はtextlintを用いて、執筆陣の誤字脱字・文法を見直しました。
このツールを使うと、機械的にチェックできるため、非常に助かりました。

当日

初めての出展なので、ブース設営も初めての経験。
同人誌販売を経験したことがないので、ブースの設計に苦労しました。
Twitterを見て来てくださった方などともお会いし、コミュニケーションが取れ、非常に面白かったです。

嬉しいことに数時間で完売したため、急遽PDFダウンロード販売を開始しました。
PDF版は次のページからダウンロード販売してます。
acroquestyy.stores.jp

技術書典が終わってから記念にメンバーで撮影しました。

f:id:acro-engineer:20181008210104j:plain:h300

最後に

私自身は技術書典はおろか、同人誌販売に今回、初めて挑戦しました。
執筆や当日の販売を通して、非常に面白い経験ができました!
また、次回も挑戦します!

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com

技術書典5でElasticsearch本を販売します!

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

いよいよ10/8(月・祝)に技術書典5が開催されます!
今回、当社の有志で初めて出展することになりました。出展場所は「か78」です!

今回執筆したタイトルは「Elasticsearch NEXT STEP」です。

techbookfest.org

Elasticsearchを使ってみた方が入門レベルから次のステップ(Next Step)へ進むための本として、執筆しました。
この本は Elasticsearch やデータ分析の業務を数々と担当してきた Acroquest の有志が作成し、実践的な内容を多く含んでいます。
読み終わった皆様が本書を手に取る前より、より一歩、実践的な Elastic Stack の活用ができることを願っています。

といっても、どんな内容なのか分からないと思いますので、目次をご紹介します。

f:id:acro-engineer:20181002000831p:plain:h500f:id:acro-engineer:20181002000838p:plain:h500

皆さんと当日お会いできることを楽しみにしています!

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


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

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

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

ServerlessConf Tokyoで、サーバーレスなシステムの運用監視に関するセッションを行いました

こんにちは!QAエンジニアの@yuki_shiro_823です。本日は事例発表の紹介です!


弊社のシニアテクニカルアーキテクトの鈴木貴典が、ServerlessConf Tokyo 2018 で、サーバーレスなシステムの運用監視に関するセッション発表をしてきました。
f:id:acro-engineer:20181001141251j:plain:w300

サーバーレスなシステムのがんばらない運用監視
~Monitoring から Observability へ~


今年で3回目を迎える ServerlessConf Tokyoですが、今年は、上記セッションを含め、運用監視に関する話が多かったようです。
いくつかのセッションでDatadogについて触れられていたようで、一番メリットがあったのはDatadog社ではないか、という話もあったそうな。笑


さて、弊社では、この2~3年で、サーバーレスアーキテクチャでのシステム開発も増えてきておりますが、サーバーレスに関するサービスも年々増えてきており、今後、よりスピードある開発/サービス提供を実現していければと考えています。

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


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

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

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

ISUCON8予選に挑戦しました

こんにちは。PyConJPを楽しんできた佐々木(@)です。

9/16(日)に今年も懲りずにWebシステムの性能改善コンテストISUCONにチャレンジしました。
isucon.net

チームも去年と同じく@と@maron8676の3人チームで挑みました。
チームメンバ全員が機械学習・分析業務をメインに行っているため、Webサーバなどのインフラの知識は少ないです。

※昨年の記録はこちらです。
acro-engineer.hatenablog.com


今回は私たちのチームの解法とその流れを紹介します。

当日の流れ

AM9:00~10:00

全員無事起床し、開始1時間前に集合しました。
この時に話し合ったのは競技を進めていく上でのチームのルールです。

  1. ソースコードは必ずgit+shellスクリプト経由で更新する。
  2. 終了30分前になったら変更は加えない。
  3. はじめは1時間,次からは2時間おきにMtgをする。

などの去年の反省を含めたルールを確認しました。あとは精神統一して競技開始を待ちました。

10:00~11:00

競技開始後まずは、以下の3つを行いました。

  1. 環境とアプリの確認
  2. ソースコードをレポジトリにコミット
  3. pt-query-digestやalpなどのプロファイリングツールのインストール

まずはどのような環境でどのようなアプリが動いているのかを確認します。
アプリは映画館の席予約のようなアプリでした。
ユーザがログインして、複数あるイベントの席の予約状況を取得したり、予約したりするアプリケーションです。

環境については最近のISUCONとは全く違った構成で面食らいました。
最近はnginx+mysqlという構成が続いていたのですが、今回はh2o+MariaDBという構成でした。
(私は両方とも使ったことなかったです。)
更に従来まで利用されていたUbuntuではなく、Redhat系のOSでインストール時にも面くらいました。
そのため、一部のプロファイリングツールを動かせなくなりました。

また、今回も予選から3台構成になっており、初期構成は次の通りです。
1台目:Web+DB
2,3台目:何もしない

この3台をどう使いきるかというのも重要な要素になりました。

11:00~13:00

この時間帯ではpt-query-digestの結果から、席の予約情報を取る処理がN+1処理になっていました。
ここが一番のボトルネックになっていることがわかりました。

そこで、アプリ担当の@がクエリの発行回数を減らすようにアプリを書き換えてくれました。
reservationsテーブル関連のget_event, get_events関数の処理が多かったので調査し、N+1クエリを解消しました。

インフラ側では、MariaDBのチューニングや、h2oでの静的コンテンツのキャッシュ、そして、gunicornのworker数の変更などを行いました。

この段階で、10000点前後のスコアで一時3位にまで浮上していました。

13:00~15:00

最初に目についた問題やもろもろのチューニングを終えたので、アプリ側でRedisを使って高速化を図ります。
get_eventsの処理結果をRedisにキャッシュして一部のSQLクエリの発行回数を減らしました。

この時間はアプリの改修→ベンチマークで計測を繰り返しました。
1台構成でこの改修で18000点程まで上がりました。

15:00~17:00

いよいよこの時間から複数台構成に変更していきます。
当初は
1台目:Web
2台目:DB
3台目:Redis
という構成でやってみました。
3台目のRedisがむしろネットワークのトラフィックで遅くなるだけだったので、RedisはWebと同じサーバに移しました。

そのため、最終的には次の構成になり、一台余らしてしまいました。
1台目:Web+redis
2台目:DB
3台目:なし

また、DB側の変更として、@maron8676が調査してreservationsにuser_idのインデックスを貼ってくれました。
最高得点の約23000点を出すことができました。

ただ、この段階でdead lockによるスコアの上下が激しくなりました。(原因については後述します。)
おおむね18000~23000を行き来するようなスコアでした。

17:00~18:00

この時間はほとんど変更を加えず、何度かいい結果が出るまでベンチマークを回しました。
祈りながらベンチマークを回し、最後は19677点でフィニッシュしました。
49位/528チームとまだまだ予選突破は遠い悔しい結果となってしまいました。

良かったこと・後悔すること

良かったこととしては、次の2つが大きいです。

  1. 3人が明確な役割を持ちつつ進められたこと
  2. 細かく話し合い、着実にスコアを伸ばせられたこと

去年の反省を生かし、チームで細かい時間で問題を設定して取り組めたのは大きな成果でした。

後悔していることとして、

  1. dead lockの対応
  2. 構成ミス

1のdead lockに関して、内部でFOR UPDATEを使っているSQLがあります、
これにより、LOCKをかけてしまい、クエリの処理タイミングによってはエラーを返してしまいスコアが下がりました。
それに最後までうまく対応できませんでした。

また、ボトルネックがDBにあると思ってしまい、DBを分散する方針にしました。
WEBの処理を分散することに気付かず、分散できなかったのは反省点です。
他のチームでは、WEB2台のDB1台にしているようなので、WEBの処理がボトルネックになっていたようです。
こちらを読み違えてしまったのがとても悔しいです。

まとめ

というわけで今年もISUCONにチャレンジしましたが、予選突破はなりませんでした。
ただ、確実に個人としてもチームとしても成長はしているので、来年こそは予選突破してみせます!
それではまた来年。

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
モノリシックなアプリケーションをマイクロサービス化したいエンジニア募集! - Acroquest Technology株式会社のWeb エンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

AWS SageMaker上でMobileNet SSDのモデルを学習する

皆さんこんにちは。@です
最近、AWSのSageMakerがいくつかアップデートがありました。個人的にはPyTorchのサポートがアツいですね。

さて、今回はSageMaker上で公式がサポートされていないアルゴリズムを学習する場合に、どのような方法があるのかを紹介していきます。
モデルはMobileNet SSDを題材として見ていきましょう。

SDK?コンテナ?

SageMaker上で自前のモデルを作成する方法は2つあります。

  1. SageMaker Python SDKを使う
  2. 自作のDockerコンテナを利用する

1の方法は、各フレームワークごとにSageMaker上で学習するためのスクリプト仕様が決まっていて、その仕様に沿って書けば学習・推論ができるようになっています。
例えばTensorflowであれば以下のページに仕様が載っています。
docs.aws.amazon.com

2の方法は、自分で学習・推論を行うDockerコンテナを定義して、SageMakerから利用する方法です。

今回は2のコンテナを利用する方法でモデルを作成していきます。(理由は後述します)
ただし、今回は学習してモデルを作成するところまでなので、推論は行いません。

今回作成するモデルについて

今回使用するMobileNet SSDは、物体検知のモデルであるSSDをより軽量にしたモデルです。
よくエッジデバイス上での物体検知に用いられます。アルゴリズムの詳細な内容の記載は省略します。
幸いコード自体はObject Detection APIのTensorFlow実装が公開されています。

github.com

今回は、Object Detection APIの学習スクリプトベースに開発します。
Object Detection APIに学習用スクリプトも用意されているため、可能な限り、再利用するために学習用のコンテナを利用します。
AWS SageMaker SDKで学習する場合は、インターフェースに併せて学習スクリプトを再実装する必要があります。
そのため、今回の場合ではObject Detection APIと比較して実装する量が多くなってしまいます。

SageMakerの学習時の仕組み

作業に入る前に、SageMakerで学習する際の仕組みを説明していきます。仕組みの概要は次の通りです。

  1. AWSでもともと用意されているか、または自分で定義したコンテナを立ち上げます。
  2. コンテナ起動時にSageMakerが、S3からコンテナ内に学習データを配置し、学習ジョブを開始します。
  3. 学習が終了後、出力されたモデルファイルはS3に配置され、コンテナを終了する。

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

仕組みに沿って実装するために開発者が必要な作業は次の通りです。

  1. 学習を実行するイメージを作成する
  2. 作成したイメージをECR(Elastic Container Registry)にpushする
  3. SageMakerから学習ジョブを実行する

学習用コンテナを作成する

まずは学習用のイメージを作成していきます。
基本はObject Detection APIのコードを再利用しつつ、SageMakerのルールに合わせて変更していきます。
変更点は以下の3つです。

  1. コンテナ起動用のスクリプトを用意する
  2. 学習用データを/opt/ml/input/data以下に読みに行く
  3. モデルの出力先として/opt/ml/modelを指定する

コンテナ起動用のスクリプトを用意する

まず、1の変更点についてですが、SageMakerは学習用コンテナを、次のコマンドで起動します。

$docker <image名> train

SageMakerで学習するためにはコンテナ内部の環境変数PATHが読める箇所に、「train」の名前で学習スクリプトを配置する必要があります。PATHはDockerfileにて指定可能です。
そのため、今回は簡単に学習用のコードを実行するshellスクリプトを配置しました。

python object_detection/model_main.py \
    --alsologtostderr \
    --pipeline_config_path="ssdlite_mobilenet_v2_coco.config"  \
    --model_dir="/opt/ml/model"

より適切に実装するなら、Pythonで書いた学習用のコードを実装すべきなのですが、今回は簡単に試してみるということでこのような形にしました。
pipeline_config_pathには、MSCOCOデータセットでMobileNet SSDを学習するための設定ファイルを指定しています。
この設定ファイルはObject Detection APIに標準で用意されています。

学習用データを/opt/ml/input/data以下に読みに行く

次に2の学習用データの配置を設定します。
その前に抑えておく必要があるのは、SageMakerでは、コンテナとS3にあるデータはコンテナ上の/opt/mlディレクトリでやり取りされるということです。
ディレクトリ構造としては

/opt/ml/
    input/
       data/ ・・・S3からのデータが配置される
       config/ ・・・ハイパーパラメータなどの設定が配置される
    model/ ・・・ここに出力されたものがS3に出力される

のようになっています。
例えば、S3に配置されている学習用データは/opt/ml/input/data//に配置されます。
そのため、設定ファイルを以下のように変更することで、S3から配信される学習データを読むようにします。

※一部抜粋
train_input_reader: {
  tf_record_input_reader {
    input_path: "/opt/ml/input/data/train/mscoco_train.record"
  }
  label_map_path: "/opt/ml/input/data/train/mscoco_label_map.pbtxt"
}

ここではchannel名がtrainとなるように設定します。channel名については後ほど、SageMakerの学習ジョブの設定の際に説明します。
なので、後に出てくるSageMaker上でのジョブの設定時も学習データのchannel名をtrainに設定する必要があります。

モデルの出力先として/opt/ml/modelを指定する

また、3の出力するモデルのパスについても、train内でmodel_dir引数に/opt/ml/modelを指定することで、モデルファイルをS3に出力できます。

イメージを作成する

上記の3つを変更したうえで、Object Detection APIが動作するDockerイメージを作成します。
今回使用したDockerfileは以下のようになりました。

FROM python:2.7

RUN apt-get update
RUN apt-get install git -y
RUN pip install tensorflow

RUN curl -OL https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip;\
        apt-get install unzip;\
        unzip protoc-3.3.0-linux-x86_64.zip -d protoc3;\
        mv protoc3/bin/* /usr/local/bin/;\
        mv protoc3/include/* /usr/local/include/

RUN apt-get install python-pil python-lxml python-tk -y; \
            pip install Cython; \
            pip install jupyter; \
            pip install matplotlib; \
            pip install Cython; \
            pip install pillow; \
            pip install lxml; \
            pip install jupyter; \
            pip install matplotlib; 


ENV PYTHONUNBUFFERED=TRUE
ENV PYTHONDONTWRITEBYTECODE=TRUE
ENV PATH="/opt/program:${PATH}"

RUN mkdir /opt/program

RUN mkdir /opt/program/object_detection;\
        mkdir  /opt/program/slim
COPY train /opt/program/
COPY ssdlite_mobilenet_v2_coco.config /opt/program
COPY object_detection /opt/program/object_detection
COPY slim /opt/program/slim

WORKDIR /opt/program

RUN git clone https://github.com/cocodataset/cocoapi.git;\
        cd cocoapi/PythonAPI;\
        make;\
        cp -r pycocotools /opt/program/;

WORKDIR /opt/program

RUN /bin/bash -c "protoc object_detection/protos/*.proto --python_out=./"
ENV PYTHONPATH=$PYTHONPATH:/opt/program:/opt/program/slim

注意事項として、trainスクリプトを実行できるように環境変数PATHにtrainスクリプトが置いてあるパスを指定する必要があります。
この時のディレクトリ構成は以下のようになりました。Object Detection APIの実行に必要なライブラリと学習スクリプトであるtrainを配置しています。

 tf_container/
   object_detection/
   slim/
   train
   Dockerfile

ここで以下のコマンドを実行してDockerイメージを作成します。

$docker build -t object_detection:test .

以上でDockerイメージの作成は完了です。

作成したイメージをECRにpushする

次に作成したイメージをSageMaker上から指定できるようにECRにpushします。

#作成したイメージにタグ付けする
$docker tag object_detection:test <アカウントID>.dkr.ecr.<リージョン>amazonaws.com/object_detection:deploy3 
#作成したイメージをpushする
$docker push <アカウントID>.dkr.ecr.<リージョン>amazonaws.com/object_detection:deploy3

この際、認証周りのエラーが出た場合は以下を参考にECRの認証設定を行ってください。docs.aws.amazon.com

以下のようにリポジトリにタグ名が表示されていれば大丈夫です。
f:id:acro-engineer:20180702001100p:plain:w700

SageMakerから学習ジョブを実行する

それではいよいよ学習ジョブを実行していきます。
まずは、S3に学習用データを配置します。
f:id:acro-engineer:20180702001116p:plain:w700
注意事項としてbucket名にsagemakerという文字列が含まれている必要があります。

次に、学習ジョブを設定していきます。
SageMakerのトレーニングジョブの作成画面で以下のように設定していきます。
f:id:acro-engineer:20180702001451p:plain:w700

f:id:acro-engineer:20180702001944p:plain:w700

f:id:acro-engineer:20180702002510p:plain:w700

f:id:acro-engineer:20180702003003p:plain:w700

しばらくすると、ログに学習が進んでいる様子が出力されます。
f:id:acro-engineer:20180702004154p:plain:w800

学習が終了するとS3にモデルファイルが出力されます。
f:id:acro-engineer:20180702091601p:plain:w800

まとめ

今回はSageMaker上でコンテナからMobileNet SSDを学習してみました。
展望としては、epoch数などをハイパーパラメータから設定できればよりジョブを管理しやすくなりますね。
とはいえ、Dockerイメージを作成してしまえば、好きな環境で学習できるのでお手軽だと思いました。
それではまた。

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


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

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

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