Goalist Developers Blog

EC2インスタンスのバックアップの自動化

どうも,エンジニアのナカノです.

今回は,EC2インスタンスのバックアップの自動化の内容をご紹介致します.

バックアップと言っても,今回は特にAMIの定期的な自動作成についてです.

目 次
  • 背景
  • 作り方
  • 所感



背景

社内では,開発/運用のライフサイクルの改善で,ステートレスなシステム構成を目指しています.

一方,古いシステムでステートを持つものが存在し,実際に現役で稼働しているものもあります.

特にこの様なシステムのバックアップの仕組みが整っておらず,これが技術負債となっていました.

今回は技術負債の解消も込めて,自動的なバックアップの設計/開発を進めることになりました.



作り方

構成

EC2インスタンスのバックアップの方法としては,AMIスナップショットの二種類があります.

スナップショットだと料金が発生するため,AMIの自動管理の仕組みを作ることになりました.

調べてみるとAWS Backupが利用出来そうで,今回はこれを使って仕組みを作ることにしました.

去年まではLambdaやCloudWatch Events等で構築する必要があったので,これは便利ですね!

docs.aws.amazon.com

f:id:r-nakano:20200817145335j:plain

セットアップ

以下では,主にAWS Backupの各種リソースの作り方をご紹介致します.


プランとルールの作成

AWSマネジメントコンソールにログインし,次にAWS Backupの管理画面を開きます.

管理画面内のマイアカウント > バックアッププランを開き,バックアッププランを作成のボタンを押します.

今回は新しいプランを立てるを選び,プランやルールの名前は画像の様な感じで設定しました.

f:id:r-nakano:20200817151029j:plain


ジョブのスケジュールは頻度を毎日とし,バックアップウィンドウはカスタム設定で行いました.

開始時間は午後5時(UTC)で,1時間以内に開始し,1日以内に完了する様に設定しました.

日本時間で言えば,毎日深夜2時から1時間以内にAMIが自動作成され,この作成が1日以内に終わるというルールです.

また,有効期限を2日としました.つまり,AMIが1日に1個作られて,2日でローテートされるということです.

f:id:r-nakano:20200817151035j:plain


その次にタグ設定を行い,プランを作成のボタンを押してバックアッププランを作成しました.

基本的には,これらの設定で事足りるかと思います.その他の設定は場合に応じて行う感じです.

f:id:r-nakano:20200817151043j:plain


リソースの割り当て

その後は,マイアカウント > バックアッププランで作成したプランの詳細画面を開きます.

詳細画面内のリソースを割り当てるのボタンを押し,プランとリソースの紐づけの設定を行います.

IAMロールはデフォルトを選びました.また,リソースを割り当てるの設定は次の様に行いました.

割り当てを複数行いたい場合は,割り当てを追加のボタンを押して同様な設定を行えばよいです.

  • 割り当て単位:リソースIDを選択

  • リソースタイプ:EC2を選択

  • インスタンスID:紐付けたいEC2インスタンスのIDを選択

f:id:r-nakano:20200817154056j:plain



所感

Amazon DLMもそうですが,1つのサービスでシステムを簡単に管理出来るのは素晴らしいですね!

AWSでは開発/運用をサポートするものがここ数年で続々と登場し,目を見張るものがあります.

こういったものがあると,工数をあまりかけずにライフサイクルの改善を進められるので良きです.

今後も技術のアップデートを見逃さない様にして,システム改善の最適化を都度に求めたいです.

近況報告と今後の発信について

f:id:r-nakano:20200817175530j:plain

お久し振りです.エンジニアのナカノです.

前回の記事の執筆から,2年と1カ月振りですかね.発信が滞ってしまっておりました.

執筆するのがかなり久々で,ちょっと緊張しています.笑

間が空き過ぎているので,まずは私の近況報告でもさせてください.

目 次
  • 近況報告
  • 今後の発信



近況報告

初配属後から2年間は,運用系のチームと開発系のチームを行き来していました.

現在は,技術戦略のチームで,システムの開発/運用/改善を行っております.

具体的には,大きな対応ですと,ここ数年では主に次の業務を対応させて頂きました.

受託開発案件の対応

  • 不動産関連の情報まとめサイトのインフラ開発

  • 外国人雇用の就労ビザの管理サービスのインフラ設計/開発

社内システムの新規,リニューアル対応

  • 問い合わせ基盤のインフラ/バックエンドの設計/開発

  • 人材業界向けのメディアサービスのインフラ設計/開発

  • 求人媒体用のクローラーシステムのインフラ設計/開発

  • ETLシステムのインフラ/バックエンドの設計/開発

  • 各種サービスの管理システムのインフラ設計/開発

他には,AWS周りや各種インフラの運用/改善等は,社内を横断してサポートしております.

ここ数年は引き続きエンジニアとして,以上の様な感じで活動しておりました.

以前の執筆時と比べて,実に色々な経験をさせて頂き,成長することが出来ました.



今後の発信

先月よりチームの指針の一つとして,自動化100というものが設けられました.

これは,マニュアル業務やシステムを自動化し,困り事や課題を解決しようというものです.

自動化の内容は,技術戦略のチームが一丸となって発信して参ります.

技術ブログに関しまして,ご興味がありましたらお読み頂けますと幸いです.

GASによるイベント連絡の自動化

はじめまして、ゴーリストのキムと申します!

この記事では、Google Calendarのイベントの連絡の、ChatWorkへの自動投稿の仕組みについてお話します。

この仕組みを作るために、GAS(Google Apps Script)という技術を使いました。

これから、仕組みの詳細を説明させていただきます!

背景

今までは、チーム内でのミーティングの度に、誰かがChatWorkで知らせる必要がありました。 ミーティングによっては、ChatWork経由での連絡を知って準備を行うことがあります。

このような連絡は必要ですが、マニュアルでの連絡を毎回対応するのは負担がかかります。 そこで連絡を自動化しましょうという話になり、自動投稿の仕組みを作ることになりました。

作り方

メッセージの自動投稿システムは、GAS(Google Apps Script)を利用して開発しました。

f:id:KimChanHyung:20200811105001j:plain
イメージ:https://www.asobou.co.jp/blog/bussiness/gas

実際には、以下のコードのように、Google Calendarの一日のイベントから探し出し、条件にマッチするイベントがあれば処理を行います。

探した後にはChatworkのAPIを利用して自分が指定したメッセージを指定したChatworkルームに送ることが出来ます。

for (let i = 0; i < events.length; i++) { 
    const title = events[i].getTitle();
    if( title === "TS Weekly Meeting"){
      mtgFlag = true;
    }
  }

また、システムの実行も自動で行うようにするために、メッセージ投稿の実行のスケジューリングを設定しました。

f:id:KimChanHyung:20200811110730p:plain
GASのトリガー設定

所感

今回の対応で、Google Calendarのイベントの定期連絡を自動で行えるようになりました。

また、この仕組みは色々なパターンへ汎用化させることが出来そうで、大変便利です。

しかし、GASでは1時間毎での設定しか出来ず、実行のタイミングはランダムで、細かい制御が出来ません。

例えば、午前9時から午前10時で設定した場合、この1時間のどこかで実行のタイミングがランダムに決まります。

f:id:KimChanHyung:20200811112552p:plain
GASトリガーの時間設定

まとめ

以上、GASによるGoogle Calendarのイベント連絡の自動化のお話でした。

これからも様々なブログを投稿しますので、お読みいただけますとうれしいです!

Which Python Package Manager Should You Use?

f:id:vivek081166:20190612133948p:plain
source : https://realpython.com/

Nowadays Python is everywhere  - academics, data science, machine learning, enterprise application, web application, scripting... you name it python is everywhere. Whatever you do, python is there either to help you or give you a headache.

Let's say, you have learned python programming and ready to use to develop applications, surely, as that sounds great, you jump into coding python scripts and eventually start installing python packages. From there one follows a dangerous path into a developer’s nightmare.

f:id:vivek081166:20190612152119p:plain
source : https://xkcd.com/1987/

Package installation may lead to having incompatibility issues or make other applications unworkable. And you may discover that your code does not work on some machines while it just works flawlessly on your local machine. Why??? It's because of the Python environment.

To save yourself from incompatibility issues, a separate virtual python environment needs to be created for a project.

A virtual environment is a bunch of scripts and directories that can run python isolated. By using a virtual environment, each python project can have its own dependencies regardless of other projects and system python environments.

In this blog post, I would like to share with you my environment for working with data and doing machine learning. You most definitely do not need to copy anyone's setup but perhaps use the one that best fit for you.

f:id:vivek081166:20190612134946p:plain

Every programmer has different preferences when it comes to their programming environment vim versus emacs, tabs versus spaces, virtualenv versus anaconda.

To start with, we need to talk about pip. A python person {what :O} knows that pip is Python's package manager. It has come built into Python for quite a while now, so if you have Python, you likely have pip already.

pip installs packages like tensorflow and numpy, pandas and jupyter, and many more along with their dependencies. Many Python resources are delivered in some form of pip packages. Sometimes you may see a file called requirements.txt in someone's folder of Python scripts. Typically, that file outlines all of the pip packages that the project uses, so you can easily install everything needed by using

pip install -r requirements.txt

As part of this ecosystem, there's a whole world of version numbers and dependencies. You sometimes need to use different versions of a given library for different projects that you are working on.

So you need a way to organize groups of packages into different isolated environments. Otherwise, looking at the version errors you would want to bang your head against the wall.

There are two popular options currently for taking care of managing your different pip packages virtualenv and anaconda.

f:id:vivek081166:20190612145609p:plain

1) Virtualenv

Virtualenv is a package that allows you to create named virtual environments where you can install pip packages in an isolated manner. This tool is great if you want to have detailed control over which packages you install for each environment you create.

For example, you could create an environment for web development with one set of libraries, and a different environment for data science. This way, you won't need to have unrelated libraries interacting with each other, and it allows you to create environments dedicated to specific purposes.

# install
pip install virtualenv

# create environment
virtualenv venv 

# activate environment
source venv/bin/activate

f:id:vivek081166:20190612141916p:plain

2) Anaconda

Now, if you're primarily doing data science work, Anaconda is also a great option. Anaconda is created by Continuum Analytics, and it is a Python distribution that comes preinstalled with lots of useful Python libraries for data science. Anaconda is popular because it brings many of the tools used in data science and machine learning with just one install, so it's great for having a short and simple setup.

Like Virtualenv, Anaconda also uses the concept of creating environments so as to isolate different libraries and versions. Anaconda also introduces its own package manager called conda from where you can install libraries.

Additionally, Anaconda still has a useful interaction with pip that allows you to install any additional libraries which are not available in the Anaconda package manager.

Follow the instructions to download and install anaconda from here

# create environment
conda create --name test-env

# activate environment
conda activate test-env

# install additional packages
conda install tensorflow

To add more you have a nice UI to manage your projects and environment
f:id:vivek081166:20190614111628p:plain

So... which one to use, virtualenv or anaconda?

Well, it's nice to try out different libraries on both virtualenv and anaconda, but sometimes those two package managers don't necessarily play nicely with each other on one system.

In my case, I have opted to use both, but I manage the whole thing using a library called pyenv.

Conceptually, pyenv sits on top of both virtualenv and anaconda and it can be used to control not only which virtualenv environment or Anaconda environment is in use, but it also easily controls whether I'm running Python 2 or Python 3.

pyenv local 2.7.10
pyenv activate py27_tf12


pyenv local 3.5.2
pyenv activate py35_tf12

One final aspect of pyenv that it has an ability to set a default environment for a given directory. This causes that desired environment to be automatically activated when you enter a directory.

~/code $ cd myproject
(py35_tf12) ~/code/myproject $

I find this to be way easier than trying to remember which environment I want to use every time I work on a project.

So which package manager do you use?

It really comes down to your workflow and preferences. If you typically just use the core data science tools and are not concerned with having some extra libraries installed that you don't use, Anaconda can be a great choice since it leads to a simpler workflow for your needs and preferences.

But if you are someone who loves to customize your environment and make it exactly like how you want it, then perhaps something like virtualenv or even pyenv maybe more to your liking.

There's no one right way to manage Python libraries, and there's certainly more out there than the options that I just presented.

As different tools come and go, it's important to remember that everyone has different needs and preferences, so choose for yourself the best one that fits your needs.

That's it for this post, my name is Vivek Amilkanthwar. See you soon with one of such next time; until then, Happy Learning :)

Kerasくんとgeneratorの魔法

f:id:c-pattamada:20190530112343j:plain
魔法の書がありました

ゴーリストのチナパです!さてさて、今回は面白いのがありますよ〜

タイトルがちょっとハリーポッターっぽくて失礼します、機械学習の記事です。

機械学習というと、ビッグデータが思いつくと思います。 大量のデータで数日感学習させたり…

でも一つだけ問題があります

51ギガ?!

可愛そうなパソコンが諦めました。そんなRAM持ってませんって。

大量のデータで学習した時にこういうのもよくあります。私の場合には、数ギガバイトのcsvファイルの文字データをベクトル化しようとして、このようなことになりましたが、画像処理・音声分析の世界にはもっと頻繁でしょう。

ここではPythonの便利な機能「generator」を使うと良いです。

「generator」?なにそれ

range(10)

これもgeneratorです。何度も見たかと思います。

つまりgeneratorはループに使えるiterator系のobjectです

for x in range(10):  
    print(x)  #0~9がprintされます

上記のようにfor ループに使えますが、generator の本当の取り柄は全てのデータを同時にメモリー(RAM)にロードしていないことです。

ただし、このようにしますと:

my_gen = range(10)
for x in my_gen:
  print(x) #無事0~9がprintされます

# 二回めはうまく行かない
for x in my_gen:
  print(x)  #何もprintされない

これはメモリーに保存されてないからです。 ただし、データ量が多すぎてパソコンが泣いている私たちにはこの機能こそが素晴らしいです。

自分のgeneratorはどうやってつける?

Pythonにはメソッドの中にreturnを使う場合がよくありますが、yieldを使う場合もあります。メソッドにはyieldが使われてるとそのメソッドがgeneratorになります。

以下のメソッドが簡単なgeneratorです。nx0 からnx(n-1)までの数字を出します。

def my_generator(n):
  i = 0
  while i < n:
    i += 1
    yield n*(i-1)

for x in my_generator(5):
  print(x) # 0, 5, 10, 15, 20のようなものが順番にprintされます

でもこんなのはどうやって機械学習に活かせますか?

そうですね、本題に着きました。

keras のfit_generator()メソッドを利用します。このために、永遠までデータを出してくれるgeneratorメソッドが必要です。

つまり以下のようなものは◎です。

def gen():
  while True:
     yield 1 # ただしこんなデータ要りません!

すみません、しっかりします。前提として、データをcsvファイルであると想定しています。これはもちろん必須ではありませんが、pandasを便利に使えるし、文字データならcsvにまとめやすいので、そういうことにしましょう。

gist.github.com

ポイントとしては while Trueの中に、 pd.read_csv(skiprows=i, nrows=batch_size) があることです。 これはcsvデータの必要な部分(ここでは32行)をデータ化しようとします。 この例には、nullデータを外すための処理も入れてます、これは事前に掃除されたデータであれば無くしてもいい部分ですね。

yield data['input_x'], data['outputs_y']

もありますが、複数のインプットが必要な場合には

yield [data['input_x1'], data['input_x']], data['outputs_y']

見たいにまとめたらうまく行きます。

学習させましょう!

gist.github.com

kerasのfit_generatorメソッドで学習データとバリデーションデータのそれぞれのgeneratorを作っておきます。

ここの変わったところが

steps_per_epoch= train_size // batch_size

あたりですね。全てのデータがメモリーに入っていない上、generate_input_data() のメソッドが永遠まで続くようになってますので、1epochの大きさが分かるために、設定しないといけません。

お時間たっぷりかけると思いますが、無事大量のデータで学習できるようになってます!

まとめ

今回は

  • Pythonのgeneratorについて学びました
  • kerasで使えるgeneratorを作成しました
  • model.fit_generator() を利用しました。

ここまで読んでくれてありがとうございます。 では、また!

kerasのモデルをデプロイする手順

こんちは、ゴーリストのチナパです!

機械学習を触ったことがあるみなさんはkerasをご存知かと思います。初級から上級の方にもとても使いやすい、フレキシブルなライブラリです。学習の時に

model.save(file_name) #.h5ファイルで保存
model = keras.models.load_model(file_name) #ファイルを読み込み、モデルをロードする

のようにに楽に保存したり、保存されたファイルをロードしたりできます。

ただし、このまま本番環境に持って行こうとしたら非常に勿体無いです。なぜなら、この保存のやり方は学習中のモデルのためですので、本番環境にはいらない情報がたくさんあります。

これから、本番環境用のTenserflowのSavedModelをつくる方法を説明いたします。今回はtensorflow 1.13でやっています、tensorflow 2.0でまたちょっと変わりますので、気をつけてください。

f:id:c-pattamada:20190514144554j:plain
要注意:本番環境に写す前に、あなたのAIは人類の敗北を望んでいないことを確認しましょう: Photo by Matan Segev from Pexels

下準備

まずは、今回は学習ではないなく、本番のつもりですをkerasくんに教えましょう。(色々心の準備あるからでしょう)

import keras.backend as K
import tensorflow as tf
from keras.models import load_model

K.set_learning_phase(0) # 「もう学習していませんよ!」をkerasで書くとこう

これで、Dropoutレイヤーとレギュラライザーなどの、学習専用の物が無視されます。

すでにmodel.save()で保存されたモデルがありましたらそのファイルのパスを用意しまて、モデルをロードしましょう(ない方はしたの部分を見てください)

file_name = ... #あなたのモデルのパス
model = load_model(file_name)

そのようなファイルはすでに持っていない方は以下のようにモデルを作成してましたら、チュートリアルをやってみれます。
from keras.applications.resnet50 import ResNet50
model = ResNet50(weights='imagenet')

では、準備できてますね。

Signature作成

input_sig = 'my_input'
output_sig = 'predictions'
signature = predict_signature_def(inputs={input_sig: new_model.input}, outputs={output_sig: new_model.output})

簡単そうに見えますが、一体何をしているでしょう?

本番環境のSavedModelにはグラフのどのノードがinputとして使ったほうが良いのか、結果を見る時にはどこにみれば良いのかを定義するためのオブジェクトです。 今回は⓵predict_signature_def()を使っていますが、他に ⓶classification_signature_def()と⓷regression_signature_def()もあります。 違いは何なのかというと、inputのアウトプットの形に応じて使い分けられる物です。ここで定義したinput_sigとoutput_sigは後でまた使います。

(ちなみに、⓶はクラッシフィケーション専用のメソッドです、例えば、画像に対してのラベルを出したい場合などには、このメソッドで文字列のラベルまで出してくれたり便利な部分があります。⓷は同じようにregression系の機械学習に便利です。⓵の方は割と応用時なので、こちらに使います)。

モデル保存

まずは、export_path、つまり保存先のディレクトリ名を定義します。これはすでに存在しましたらエラーが発生するので、最後のフォルダーがまだ存在しないようにします(ここでは”1”となってます)。

export_path = /path/to/model/1/  #例のパスです、最後のフォルダがまだ存在しないフォルダー名(例えば、モデルのバージョン番号)を使ってください
signature_name = 'predict_output' # こちらもまた後で使います。
with K.get_session() as sess:
    builder = tf.saved_model.builder.SavedModelBuilder(export_path)
    builder.add_meta_graph_and_variables(
        sess, [tf.saved_model.tag_constants.SERVING],
        signature_def_map={signature_name: signature},
        main_op=tf.tables_initializer())
    builder.save()

そして、tensorflowのSavedModelBuilderを使って保存します。 本番環境のつもりなのでtf.saved_model.tag_constants.SERVINGのフラグを設定します。

先ほど作成したsignatureがsignature_def_map={'predict_output': signature}このように設定します。こちらの'predict_output’の文字列は自由です。

実行しましたら

f:id:c-pattamada:20190514143120p:plain
SavedModelの保存形式
のように保存されるはずです。

イエイ!これで保存できました!

グーグルのAI platformを使いたい場合にもこのような保存形式であれば大丈夫です。

モデルをロードする

さて、モデルを保存しましたが、この形式をどうやって使えるでしょうか? 自作のFlaskサーバーで利用したい場合には便利かも知れません。

いかのようにロードできますが、今までのpredictなどの昨日がうまくいきません。

with tf.Session(graph=tf.Graph()) as sess:
    model_x = tf.saved_model.loader.load(sess, [tag_constants.SERVING], export_path)

そこで、上記に定義したsignature_defを利用します。 まとめて、

my_testing_data = ... #ここでモデルのインプットデータを用意します

with tf.Session(graph=tf.Graph()) as sess:
    model_x = tf.saved_model.loader.load(sess, [tag_constants.SERVING], export_path)
    sig_def = model_x.signature_def[signature_name]
    in_name = sig_def.inputs[input_sig].name
    out_name = sig_def.outputs[output_sig].name
    # print(in_name, out_name) #きになる方はここでプリントしたら、レイヤー名が出力されます。
    result = sess.run(out_name,
                 feed_dict={in_name: my_testing_data})
    

こうして、Signature defを利用して、モデルの中のレイヤー名に依存せずにモデルの利用ができます。これは本番環境にモデル置き換えなどがある場合にはとても便利です。

まとめ

今回はkerasのモデルを本番環境のために準備するステップを説明してみました。モデルのsignatureを作成して、保存し、またロードして実行するまでやりました。ただし、tensorflow 2.0にはまたちょっと変わっていきますのでご注意ください。

本番環境を用意しましたら、cliで実行するか、flaskのサーバーに置くか、他の色々な選択肢もありますが今回はここまでにします!

AutoML:機械学習の次の波

f:id:vivek081166:20190424142833j:plain
Source: www.pexels.com

AIと機械学習は、依然として初心者が参入しにくい専門性の分野です。 豊富な専門知識と事業リソースをもった企業は少ししかありません。~Fei-Fei Li

Mercari は日本で人気のあるショッピングアプリで、画像の分類にAutoML (Automated Machine Learing) Vision(GoogleのAutoMLソリューション)を使用しています。Mercari によると、「写真をアップロードすると、12の主要ブランドのブランド名を提案する独自のMLモデルを開発しています」

TensorFlowでトレーニングされた独自のモデルは75%の精度を達成しましたが、50,000のトレーニング画像を含むアドバンストモードのAutoML Visionは91.3%の精度を達成しました。これは15%もの大幅な向上です。そのような驚くべき結果により、MercariはAutoMLをシステムに統合しました。

これは、複雑なシナリオに対処するための機械学習モデルを進化させることによってもたらされた恩恵のほんの一例です。AutoML(Automated Machine Learning)が今日のML (Machine Learning)ベースのソリューションを根本的に変えたのです。

自動機械学習:AutoML

近年、機械学習はさまざまな分野で大きな進歩をもたらしてきました。金融サービス、医療、小売、交通などの分野では、何らかの形で機械学習システムが使用されており、その結果は有望視されています。

今日の機械学習は、研究に限定されているのではなく、エンタープライズドメインに進出しています。ただし、多くの企業は豊富なデータサイエンティストチームに投資できるだけの事業資源を持っていないために、人に依存した従来のMLプロセスでは解決できない問題が多くありました。Auto MLは、そのような状況への答えになるかもしれません。

自動機械学習(AutoML)は、実世界の問題に機械学習を適用するというend-to-end のプロセスを自動化する過程です。AutoMLは、機械学習の分野で高度な専門知識を持たない人でも、それらを利用できるようにしたのです。

機械学習モデルは、次の4つのプロセスで構成されています。

f:id:vivek081166:20190424143407p:plain

データの取り込みから前処理、最適化、そして結果の予測まで、すべてのステップを人間が管理し、実行します。 AutoMLは基本的に2つの主要な側面に焦点を合わせています 。それはデータ収集/収集と予測すす。これらの間で行われる前処理と最適化のステップは、簡単に自動化することができます。

AutoMLの必要性

機械学習システムの需要は過去数年間で急上昇しました。これは、今日の幅広いアプリケーションでのML の成功によるものです。ただ、機械学習によって特定のビジネスが促進される可能性があることが明確だとしても、多くの企業がMLモデルの展開に苦労しています。

まずは、データサイエンティストのチームを立ち上げる必要があります。第二に、チームを抱えていても、 どの問題にどのモデルが最適であるかを決めることはしばしば知識より多くの経験を必要とします。

AutoMLは、モデルのパフォーマンスを犠牲にすることなく、最小限の労力でMLパイプラインの最大ステップ数を自動化するのに役立ちます。

利点

AutoMLの利点を要約すると、次の3つになります。

  • 作業を自動化することで生産性を高めます。そうするとモデルではなく問題にもっと集中することができます。

  • MLパイプラインを自動化することで、手動時に発生する人為的なエラーを回避するのにも役立ちます。

  • 結局のところ、AutoMLは、MLの力を誰もが利用できるようにすることによって、機械学習の民主化に向けた一歩です。

AutoMLフレームワーク

AutoMLは、機械学習パイプラインの一部または全部を自動化できます。そこで、まずはフレームワークのいくつかを見てみましょう。これは完全なリストではありませんが、幅広い分野で使用されているフレームワークについて紹介しようと思います。

1. MLBox

f:id:vivek081166:20190424143752p:plain
https://mlbox.readthedocs.io/en/latest/

MLBoxは強力な自動機械学習Pythonライブラリです。 公式文書によると、このライブラリは以下の機能を提供します。

  • 高速読み取りおよび分散データの前処理/クリーニング/フォーマット

  • 非常に正確な特徴量選択、リーク検出、そして正確なハイパーパラメータ最適化

  • 分類と回帰のための最先端の予測モデル(ディープラーニング、スタッキング、LightGBMなど)

  • モデル解釈による予測

パイプライン

MLBoxのメインパッケージには、次の作業を自動化するための3つのサブパッケージが含まれています。 * 処理:データの読み取りと前処理 * 最適化:モデルのテストと交差検定 * 予測:予測をする

インストール

現在、MLBoxはLinuxとのみ互換性がありますが、WindowsとMacOSのサポートは間もなく追加される予定です。

#gcc
sudo apt-get install build-essential

#cmake
pip install cmake

pip install mlbox

デモ

ハウスプライス回帰問題で "MLBox"自動MLパッケージを実行する。

gist.github.com

2. Auto-Sklearn

Auto-Sklearnは、Scikit-learnの上に構築された自動機械学習パッケージです。 Auto-Sklearnを使用すれば、アルゴリズムの選択やハイパーパラメータの調整は不要です。 Auto-Sklearnには、ワンホットエンコーディング、PCAなどのフィーチャーエンジニアリング手法が含まれています。

Auto-Sklearnは、中小規模のデータセットではうまく機能しますが、大規模なデータセットに適用するとパフォーマンスが低下します。

インストール

Auto-Sklearnは現在Linuxマシンでのみ動作します。

#dependencies
curl https://raw.githubusercontent.com/automl/auto-sklearn/master/requirements.txt | xargs -n 1 -L 1 pip install

#auto-sklearn
pip install auto-sklearn

デモ

次の例は、Auto-Sklearnを使用して近似のデータを元に予測し、単純な回帰モデルを作る方法です。

gist.github.com

3. Tree-Based Pipeline Optimization Tool (TPOT)

f:id:vivek081166:20190424144939p:plain
https://epistasislab.github.io/tpot/

TPOTは、ジェネティックプログラミングを使用して機械学習パイプラインを最適化するPython自動機械学習ツールです。

TPOTはScikit-learnフレームワークを拡張しますが、独自のリグレッサおよび分類子メソッドを使用します。

f:id:vivek081166:20190424144610p:plain
TPOTによって自動化された機械学習プロセスの一部

インストール

pip install tpot

詳しい手順については、公式文書のTPOTインストール手順を参照してください。

デモ

TPOTでMNIST数字を分類する

gist.github.com

4. H2O

f:id:vivek081166:20190424145540p:plain
http://docs.h2o.ai/
H2Oは、RとPythonの両方をサポートする、H20.aiのオープンソース分散型インメモリ機械学習プラットフォームです。

H2Oは、フィーチャエンジニアリング、モデル検証、モデル調整、モデル選択、モデル展開など、最も困難なデータ科学および機械学習ワークフローの一部を自動化します。

インストール

H2Oをダウンロードしてインストールするには、以下のリンクを利用してください。

h2o-release.s3.amazonaws.com

デモ

H2OAutoML クラスをPythonで基本的な使い方は下記の通りです。

gist.github.com

5. AutoKeras

f:id:vivek081166:20190424145528p:plain
https://autokeras.com/

Auto-Kerasは、機械学習自動化するためにDATA Labが作ったオープンソースライブラリです。KerasディープラーニングフレームワークをベースにしたAuto-Kerasは、ディープラーニングモデル用のアーキテクチャとハイパーパラメータを自動的に検索する機能を、私たちに提供してくれます。

Auto-KearsのAPIはScikit-Learn APIと似ているのでとても使いやすいです。現在のバージョンでは、ディープラーニングプロセス中にハイパーパラメータを自動的に検索する機能が提供されています。

Auto-Kerasは、自動化されたNeural Architecture Search(NAS)アルゴリズムを使用してMLプロセスを簡素化します。

インストール

インストールもシンプルです。

デモ

下記はMNISTデータセットを利用したAuto-Kerasライブラリのデモです。

gist.github.com

6. Cloud AutoML

Cloud AutoML は機械学習プロダクトのスイートです。AutoML を利用すると、機械学習の専門知識があまりない開発者でも Google の最先端の転移学習とニューラル アーキテクチャ検索技術を利用して、ビジネスニーズに合った高品質のモデルをトレーニングできます。

Cloud AutoMLは、自身のデータに基づいてモデルをトレーニング、評価、改善、および展開するためのシンプルなグラフィカルユーザーインターフェイス(GUI)を提供します。現在、このスイートは以下のAutoMLソリューションを提供しています。

f:id:vivek081166:20190424150050p:plain

GoogleのAutoMLの欠点はオープンソースではないということです。 AutoML Visionの場合、モデルをトレーニングするのにかかる時間と、予測のためにAutoML Visionに送信する画像の数によってコストが異なります。詳しくはこちらをご覧ください。

cloud.google.com

7. TransmogrifAI

TransmogrifAIは、Salesforceのオープンソースの自動機械学習ライブラリです。

Einsteinと呼ばれる同社の主力MLプラットフォームもTransmogrifAIによって供給されています。 これは、Apache Spark上で動作するScalaで書かれた構造化データ用のend to endのAutoMLライブラリです。

インストール

# JAVA 1.8 インストール

# Spark 2.3.x 取得
git clone https://github.com/salesforce/TransmogrifAI.git

cd TransmogrifAI && ./gradlew compileTestScala installDist

インストール手順については、資料をお読みください。

デモ

TransmogrifAIによるタイタニック生存者の予測してみましょう。詳しくはこちらをご覧ください。

gist.github.com

AutoMLの未来

AutoMLの基本的な目的は、パイプラインの作成やハイパーパラメータの調整などの反復的な作業を自動化して、自分が解決すべきビジネス上の課題により多くの時間を費やすことができるようにすることです。

AutoMLが成功するかどうかは、多くの人に使われることと機械学習分が進歩することにかかっています。ただ、AutoMLが将来の機械学習の大部分を占めることは間違いないでしょう。

参照

  1. Efficient and Robust Automated Machine Learning
  2. Benchmarking Automatic Machine Learning Frameworks