今回挙動を確認するもの

↓これ

1
from sagemaker.predictor import Predictor

前提知識と要約

まずSageMakerのレスポンスはデフォルトではバイト型(bytes)として返却される

例:

1
print(response_bytes)  # 例: b'{"key": "value"}'

ここで、レスポンスがjsonを内包したバイト型であると、
APIを叩いた側はjson.loadsだけすれば辞書型として使用できるようになる。

なので、SageMakerのレスポンスをどの型を内包したバイト型であるかで処理の記述が簡単になる。
この変換処理をDeserializeと言い、
JSONDeserializerをつけると、jsonを内包したバイト型が返却されるように簡単設定が行える。

例としてもしJSONDeserializerを使わないと、以下のように結構面倒臭い書き方になる。

自前のDeserializer処理

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from sagemaker.predictor import Predictor
 
# SageMakerの推論エンドポイントを設定
predictor = Predictor(endpoint_name='your-endpoint-name')
 
# デシリアライザを設定しない(デフォルト設定)
# predictor.deserializer = None
 
# 推論リクエストを送信
response_bytes = predictor.predict(data={'input': 'your-input-data'})
 
# レスポンスをバイト列として受け取る
print(response_bytes)  # 例: b'{"key": "value"}'
 
# バイト列を文字列にデコード
response_str = response_bytes.decode('utf-8')
 
# 文字列をJSONとしてパース
import json
response_dict = json.loads(response_str)
 
# デシリアライズされたPythonオブジェクトとして利用
print(response_dict)  # 例: {'key': 'value'}

これと比較したときの

JSONDeserializerを使用した処理

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from sagemaker.predictor import Predictor
from sagemaker.deserializers import JSONDeserializer
 
# SageMakerの推論エンドポイントを設定
predictor = Predictor(endpoint_name='your-endpoint-name')
 
# JSONDeserializerを設定
predictor.deserializer = JSONDeserializer()
 
# 推論リクエストを送信し、結果をデシリアライズ
response = predictor.predict(data={'input': 'your-input-data'})
# response:<class 'dict'>
 
# responseのbodyの中身を読み取り
body = response['Body'].read()
# body:<class 'bytes'>
# body:の実データは b'{"boxes":など
# ちなみにresponse['Body']の方は:<class 'botocore.response.StreamingBody'>
 
# 結果のjson文字列をpythonのjsonオブジェクトに変換
result = json.loads(body)
# result:<class 'dict'>
 
print(result)

上記の比較から処理が簡素にかけることがわかる。

JSONDeserializerのやってること

やってることとしては

1
2
3
4
5
6
デコード:バイト列をUTF-8文字列にデコード
 
その後、
JSONパース:デコードされた文字列をJSON形式としてパース
 
こうしてjson型を内包したバイト型のresponseを返却している。

となる。

結論要約

つまりJSONDeserializerは
元々バイト型のjsonデータのレスポンスを返却できるようにしたもの。

補足:シリアライザーの動き

例えば、CSVS erializerを保有したSageMakerのモデルに、
[1.0, 2.0, 3.0]を渡したとする。
そうすると、モデルが受け取るのは
CSV Serializerによって加工された’1.0,2.0,3.0′
を受け取る形となる。

関係性としては以下

1
2
入力データ:通常はリストやタプルなどのシーケンスデータ
シリアライズ後のデータ:CSV形式の文字列。例えば、'1.0,2.0,3.0'

つまり、
シリアライザーはエンドポイントに入力時のデータ加工
デシリアライザーエンドポイント出力時のデータ加工
を担うものである。