今回挙動を確認するもの
↓これ
from sagemaker.predictor import Predictor
前提知識と要約
まずSageMakerのレスポンスはデフォルトではバイト型(bytes)として返却される
例:
print(response_bytes) # 例: b'{"key": "value"}'
ここで、レスポンスがjsonを内包したバイト型であると、
APIを叩いた側はjson.loadsだけすれば辞書型として使用できるようになる。
なので、SageMakerのレスポンスをどの型を内包したバイト型であるかで処理の記述が簡単になる。
この変換処理をDeserializeと言い、
JSONDeserializerをつけると、jsonを内包したバイト型が返却されるように簡単設定が行える。
例としてもしJSONDeserializerを使わないと、以下のように結構面倒臭い書き方になる。
自前のDeserializer処理
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を使用した処理
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のやってること
やってることとしては
デコード:バイト列を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′
を受け取る形となる。
関係性としては以下
入力データ:通常はリストやタプルなどのシーケンスデータ シリアライズ後のデータ:CSV形式の文字列。例えば、'1.0,2.0,3.0'
つまり、
シリアライザーはエンドポイントに入力時のデータ加工
デシリアライザーエンドポイント出力時のデータ加工
を担うものである。