ml

AWS SageMaker Sagifyを使って独自のアルゴリズムを簡単に作る

Sagifyを使ってAWS SageMakerで独自アルゴリズムを作る方法を紹介します!

AWS SageMakerとは

AWS SageMakerとは、機械学習のトレーニング、モデル構築、推論をGUI上で行えるAWSのサービスです。

特にトレーニングの部分は、jupyter notebookを使えるため非常にデータサイエンティストがデータ分析とモデル構築に集中することができます。

AWS SageMakerで、独自アルゴリズム使うには

SageMakerには、すでに色々なアルゴリズムが用意されており、簡単に利用することができます。

しかし、自身で作成したモデルを使いたい場合があります。

例えば、これまで使っていたモデルをSageMaker上に載せたいとか、特殊アルゴリズムを使っているので用意されているものではできないなど。

そういった場合、SageMaker独自アルゴリズムでソースコードが乗ったdockerイメージを作ってあげることで対応できます。

しかし、dockerイメージにはディレクトリ構成に制約があったりと中々厳しい部分もあります。

そこで、今回紹介するのがsagifyです!

sagifyでAWS SageMakerに独自アルゴリズムを作る

sagifyとは、独自アルゴリズムを簡単にdockerイメージ化してくれ、ECR(AWSのコンテナ管理)にプッシュできます。

今回は、ローカルでdockerイメージをデプロイするところまでのチュートリアルをやっていきます!

sagifyのインストール

sagifyをインストールします。

pip install sagify

AWS SageMakerに必要な環境、パッケージ、データ準備します

今回は、deep-learning-additionというサンプルを試していきます!

# 任意のディレクトリを作成します。
mkdir test-sagify
cd test-sagify
git clone https://github.com/Kenza-AI/deep-learning-addition.git
cd deep-learning-addition
make create_environment
make requirements
make data

sagifyのソースコードのテンプレートを用意

ソースコードのテンプレートを作成します。

sagify init -d src

ここで、AWSのクレデンシャル情報を聞かれるので入力してください!

※リージョンはAWS SageMakerのリージョンと合わせてください。

リージョンがずれると動きません。

sagifyのトレーニングデータのコピー

各々のディレクトリ構成に合わせてコピーをしてください。

cp -R deep-learning-addition/data/processed/ src/sagify/local_test/test_dir/input/data/training/

sagifyのtrainのソースコードを変更する

下記のソースコードを追記してください。

ソースコード上にTODOと書かれている部分を置き換えるイメージです。

# 10行目あたりに挿入
from src.models import train_model

# 60行目あたりに挿入
train_model.train(input_path=input_data_path, output_path=model_save_path)

こんな感じになります。

try:
     train_model.train(input_path=input_data_path, output_path=model_save_path)
     print('Training complete.')
 except Exception as e:

sagifyのpredictのソースコードを変更する

def _format_addition(input_str):
     def _format(input_str_num, part_one):
         required_spaces_num = 3 - len(input_str_num)
         spaces = ''
         for _ in range(required_spaces_num):
             spaces += ' '

         return spaces + input_str_num if part_one else input_str_num + spaces

     two_parts = input_str.split('+')
     formatted_part_one = _format(two_parts[0], True)
     formatted_part_two = _format(two_parts, False)

     return '{}+{}'.format(formatted_part_one, formatted_part_two)
     
 addition_str = _format_addition(json_input['addition'])
 
 from src.encoding_utils import decode_prediction, encode_query
 input_model = encode_query(addition_str)
 
 prediction = ModelService.predict(input_model)
 
 result = {
     'result': decode_prediction(prediction)
 }
 
 return result
if cls.model is None:
     import keras
     cls.model = keras.models.load_model(os.path.join(_MODEL_PATH, 'model.h5'))
 return cls.model

sagifyのビルド

 

sagify build -d src -r requirements.txt

sagifyをローカルで学習させる

sagify local train -d src

sagifyをローカルでデプロイする

sagify local deploy -d src

ローカルデプロイしたsagifyで推論する

デプロイしたモデルで推論してみます。

curl -X POST \
http://localhost:8080/invocations \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{
"addition": "943+604"
}'

結果が以下のようになれば成功です。

{"result": "1547"}

AWS SageMakerのまとめ

あとは、ここで作成したdockerイメージをECRにプッシュすれば使えるようになります。

独自アルゴリズムを使うのも簡単ですね。

ただ、様々なアルゴリズムが搭載されていてそれだけで十分なことが多いです。

まず、存在するアルゴリズムを調べて使ってみましょう!

ABOUT ME
アバター
ロッピー
コンサルタントから2018年にエンジニアに転向。年収400万円のサラリーマンエンジニアから、半年で月収100万円を稼ぐエンジニアになった。 Python、Golangなど単価の高い言語を得意とする。