機械学習(ML)モデルをデプロイしてシステムとして稼働できる状態にすること
学習
評価
Packaging
Deploy
監視
ざっくりこのあたり
推論
PyTorch eager mode と torch scripted model の Serving
Packaging Model
# torchscript
torch-model-archiver --model-name densenet_161 \
--version 1.0 \
--serialized-file model.pt \
--handler image_classifier \
--export-path ./models_store
# eager mode
torch-model-archiver --model-name densenet_161 \
--version 1.0 \
--serialized-file model.pt \
--handler image_classifier \
--export-path ./models_store \
--model-file model.py
Handlerは組み込みのハンドラ(image_classifier, object_detector, text_classsifier, image_segmenter)か自作のPythonファイルを指定。
inference APIの実行に必要な densenet_161.marが生成される。
# inference
torchserve --start --model-store ./models_store --models densenet_161.mar
Preprocess, Postprocess
# custom handler file
# model_handler.py
"""
ModelHandler defines a custom model handler.
"""
from ts.torch_handler.base_handler import BaseHandler
class ModelHandler(BaseHandler):
"""
A custom model handler implementation.
"""
def __init__(self):
self._context = None
self.initialized = False
self.explain = False
self.target = 0
def initialize(self, context):
"""
Initialize model. This will be called during model loading time
:param context: Initial context contains model server system properties.
:return:
"""
self._context = context
self.initialized = True
# load the model, refer 'custom handler class' above for details
def preprocess(self, data):
"""
Transform raw input into model input data.
:param batch: list of raw requests, should match batch size
:return: list of preprocessed model input data
"""
# Take the input data and make it inference ready
preprocessed_data = data[0].get("data")
if preprocessed_data is None:
preprocessed_data = data[0].get("body")
return preprocessed_data
def inference(self, model_input):
"""
Internal inference methods
:param model_input: transformed model input data
:return: list of inference output in NDArray
"""
# Do some inference call to engine here and return output
model_output = self.model.forward(model_input)
return model_output
def postprocess(self, inference_output):
"""
Return inference result.
:param inference_output: list of inference output
:return: list of predict results
"""
# Take output from network and post-process to desired format
postprocess_output = inference_output
return postprocess_output
def handle(self, data, context):
"""
Invoke by TorchServe for prediction request.
Do pre-processing of data, prediction using model and postprocessing of prediciton output
:param data: Input data for prediction
:param context: Initial context contains model server system properties.
:return: prediction output
"""
model_input = self.preprocess(data)
model_output = self.inference(model_input)
return self.postprocess(model_output)
API
# Captum の機能を使っている
curl http://127.0.0.1:8080/explanations/mnist \
-T image_classifier/mnist/test_data/0.png
[
[
[
[
0.004570948731989492,
0.006216969640322402,
0.008197565423679522,
0.009563574612830427,
0.008999274832810742,
0.009673474804303854,
0.007599905146155397,
,
,
]
]
]
]
# KServe形式
curl -H "Content-Type: application/json" \
--data @kf_request_json/v1/mnist.json \
http://127.0.0.1:8080/v1/models/mnist:explain
{
"explanations": [
[
[
[
0.004570948731989492,
0.006216969640322402,
0.008197565423679522,
0.009563574612830427,
0.008999274832810742,
0.009673474804303854,
0.007599905146155397,
,
,
,
]
]
]
]
}
API - Explantions
# resnet
curl http://localhost:8080/predictions/resnet-18/2.0 \
-F "data=@kitten_small.jpg"
{
"class": "n02123045 tabby, tabby cat",
"probability": 0.42514491081237793
}
# minist. kserve形式
curl -H "Content-Type: application/json" \
--data @kf_request_json/v1/mnist.json \
http://127.0.0.1:8080/v1/models/mnist:predict
{
"predictions": [
2
]
}
Vertex AI EndpointsはKServeの形式
API - Predictions
metrics api
Batch:
複数の入力をまとめて処理することで計算資源を効率的に扱う。スループットの向上を目的としており、即時性とのトレードオフ。
Dynamic Batch:
指定された時間枠内で受信したリクエストを集約してBatch処理を行う。ある程度の即時性が求められる環境で計算資源を効率的に扱う。
Dynamic Batch
Dynamic Batch
# management api
curl -X POST "localhost:8081/models?url=https://torchserve.pytorch.org/mar_files/resnet-152-batch_v2.mar&batch_size=3&max_batch_delay=10&initial_workers=1"
Management APIを使ったDynamic Batch設定
Dynamic Batch
# config.properties
load_models=resnet-152-batch_v2.mar
models={\
"resnet-152-batch_v2": {\
"2.0": {\
"defaultVersion": true,\
"marName": "resnet-152-batch_v2.mar",\
"minWorkers": 1,\
"maxWorkers": 1,\
"batchSize": 3,\
"maxBatchDelay": 5000,\
"responseTimeout": 120\
}\
}\
}
torchserve --start --model-store model_store \
--ts-config config.properties
設定ファイルを起動時に読み込んでDynamic Batch設定
NVIDIAが提供している推論フレームワーク。多機能・効率的
多様なフレームワーク、アーキテクチャ、プラットフォームに対応
多様な推論処理
モデルに推論リクエストを送信してスループットとレイテンシを測定する
Performance Analyzer
TensorFlow ServingとTorchServeの計測もサポート(Beta)
Model Analyzer
Kubernetesの推論プラットフォーム
Kubernetes
KNative + Istio
KServe
複数のMLフレームワークに対応
https://kserve.github.io/website/0.9/modelserving/v1beta1/serving_runtime/#model-serving-runtimes
ModelMesh
Kubernetesのリソースを効率的に扱い、スケーラビリティを向上
従来の課題
Inference Graph - パイプライン
Autoscaling
0までスケールインできる
KPAを使うと最小レプリカを0にできる
Knative Pod Autoscaler(KPA) ... min 0
Horizontal Pod Autoscaler(HPA) ... min 1
Kubernetes
KNative + Istio
KServe
GPUのスケールにも対応
コンポーネントレベルで設定
Canary Rollout
Canary Rollout
参考