Sagifyを使ってAWS SageMakerで独自アルゴリズムを作る方法を紹介します!
Contents
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にプッシュすれば使えるようになります。
独自アルゴリズムを使うのも簡単ですね。
ただ、様々なアルゴリズムが搭載されていてそれだけで十分なことが多いです。
まず、存在するアルゴリズムを調べて使ってみましょう!