CLI で Web API の切替

はじめに


このドキュメントでは、ABEJA Platformを利用して、画像識別を行うサンプルモデル(keras)をWebAPIとして起動し既存のエンドポイントをシームレスに更新する方法を説明します。

更新対象のエンドポイントとして、スタートガイド「CLI で Web API を作成」で作成したエンドポイントを使用します。

画像認識を行うサンプルモデル(keras)のダウンロード


こちらよりスタートガイド向けのモデルをダウンロードし、以下のコマンドでファイルを解凍してください。

今後、コマンドの実行は解凍されたディレクトリの下で行っていきます。

このモデルは Keras の ResNet50 の画像分類モデルを使用した例になります。以下の通り、 ResNet50を使用して、画像を識別可能な実装となっています。

$ tar -zxvf default.tar.gz
$ cd default
$ ls -l
total 388192
-rw-r--r--@ 1 abeja  staff         97  9  8 10:57 README.txt
-rw-r--r--@ 1 abeja  staff        218  8 31 13:31 exec.py
-rw-r--r--@ 1 abeja  staff       1566  8 29 20:30 imagenet_utils.py
-rw-r--r--@ 1 abeja  staff        916  8 31 13:31 main.py
-rw-r--r--@ 1 abeja  staff      12369  8 30 04:23 resnet50.py
-rw-r--r--@ 1 abeja  staff  102853048  8 29 20:26 resnet50_weights_tf_dim_ordering_tf_kernels.h5
-rw-r--r--@ 1 abeja  staff   94653016  8 30 04:08 resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5
-rw-r--r--@ 1 abeja  staff    1208476  9 19 13:38 sample.jpg

ABEJA Platform上で実行可能なPythonのバージョンは、 3.5 以上になります。

モデルバージョンの作成


create-versionコマンドでモデルバージョンを作成します。

--model_idにはモデルの作成で作成したモデルの識別子を指定します。

$ abeja model create-version --model_id {MODEL_ID} --version 0.0.2 \
                             --image abeja-inc/all-cpu:18.10 --handler main:handler
{
    "version": "0.0.2",
    "version_id": "ver-2222222222222222"
}

サービスの作成


画像識別を行うサンプルモデルをサービスとして起動します。

--deployment_idには、デプロイメントの作成で作成したデプロイメントの識別子を指定します。

--version_idには、直前に作成したモデルバージョンの識別子を指定します。

$ abeja model create-service --deployment_id {DEPLOYMENT_ID} --version_id {VERSION_ID}
{
    "created_at": "2018-05-02T07:28:56.826724Z",
    "deployment_id": "1111111111111",
    "instance_number": 1,
    "instance_type": "cpu-0.25",
    "metrics_url": "https://p.datadoghq.com/sb/c61020b12-f5c8335865e20280252bf6b035a1fc96",
    "model_version": "0.0.2",
    "model_version_id": "ver-2222222222222222",
    "modified_at": "2018-05-02T07:28:58.679953Z",
    "service_id": "ser-2222222222222222",
    "status": "IN_PROGRESS",
    "user_env_vars": {}
}

作成されたサービスの動作を確認


「CLI で WebAPI を作成」で行ったサービスの起動状態の確認と同様に確認作業を行った後、作成されたサービスの動作を確認します。

簡易チェックツールを利用する場合

画像を入力として扱う WebAPIの動作チェックを行う場合、 check-endpoint-imageコマンドを使用します。

--deployment_idには、デプロイメントの作成で作成したデプロイメントの識別子を指定し、--service_idには、直前で作成したサービスの識別子を指定します。

$ abeja model check-endpoint-image --deployment_id {DEPLOYMENT_ID} --service_id {SERVICE_ID} \
                                   --type jpeg --image_path sample.jpg
[
    {
        "id": "n04356056",
        "label": "sunglasses",
        "probability": 0.5109500885009766
    },
    {
        "id": "n03617480",
        "label": "kimono",
        "probability": 0.06765035539865494
    },
    {
        "id": "n04350905",
        "label": "suit",
        "probability": 0.06371305137872696
    },
    {
        "id": "n03630383",
        "label": "lab_coat",
        "probability": 0.048062920570373535
    },
    {
        "id": "n03594734",
        "label": "jean",
        "probability": 0.03560170158743858
    }
]

デプロイされた WebAPI がまだ利用可能ではない場合、レスポンスは HTTP エラー(503) となります。

curlを利用する場合

curl で動作を確認する場合、以下のリクエストを行います。

$ curl --user user-{ABEJA-PLATFORM-USER}:{PERSONAL-ACCESS-TOKEN} \
       -H 'Content-Type: image/jpeg' \
       -XPOST --data-binary  @sample.jpg \
       https://{ORGANIZATION_NAME}.api.abeja.io/deployments/{DEPLOYMENT_ID}/services/{SERVICE_ID}

エンドポイントを更新する


作成したエンドポイントを更新し、簡単な計算を行うWebAPIから画像識別を行うWebAPIへ切り替えます。

$ abeja model update-endpoint --deployment_id {DEPLOYMENT_ID} --endpoint_id {ENDPOINT_ID} \
                              --service_id {SERVICE_ID}
{
    "message": "pnt-1111111111111111 updated"
}

更新されたエンドポイントの動作を確認


リクエストの実行を通して、同一のエンドポイントが簡単な計算処理を行うWebAPIから画像判別を行うWebAPIへと切り替わっていることを確認します。

簡易チェックツールを利用する場合

check-endpoint-imageコマンドを使用し、エイリアス defaultで作成したエンドポイントの動作を確認します。

サービスの動作確認時と異なり、--service_idの指定は必要ありません。

$ abeja model check-endpoint-image --deployment_id {DEPLOYMENT_ID} \
                                   --type jpeg --image_path sample.jpg
[
    {
        "id": "n04356056",
        "label": "sunglasses",
        "probability": 0.5109500885009766
    },
    {
        "id": "n03617480",
        "label": "kimono",
        "probability": 0.06765035539865494
    },
    {
        "id": "n04350905",
        "label": "suit",
        "probability": 0.06371305137872696
    },
    {
        "id": "n03630383",
        "label": "lab_coat",
        "probability": 0.048062920570373535
    },
    {
        "id": "n03594734",
        "label": "jean",
        "probability": 0.03560170158743858
    }
]

curlを利用する場合

curl で動作を確認する場合、以下のリクエストを行いエイリアス defaultで作成したエンドポイントの動作を確認します。

$ curl --user user-{ABEJA-PLATFORM-USER}:{PERSONAL-ACCESS-TOKEN} \
       -H 'Content-Type: image/jpeg' \
       -XPOST --data-binary  @sample.jpg \
       https://{ORGANIZATION_NAME}.api.abeja.io/deployments/{DEPLOYMENT_ID}